Sadece bir #ajax tetik elemanı tarafından tetiklenen birden fazla form elemanının (ambalajın) değiştirilmesi mümkün müdür?


52
function ajax_example_simplest($form, &$form_state) {

  //This is my ajax trigger element
  $form['element_trigger'] = array(
    '#type' => 'select',
    '#options' => array(
      'one' => 'one',
      'two' => 'two',
      'three' => 'three',
    ),
    '#ajax' => array(
      'callback' => 'ajax_example_simplest_callback',

      /** Q: Can I somehow declare more than one wrapper? **/
      //Say for instance, something like:
      'wrapper' => array('replace_div_1', 'replace_div_2'),

     ),
  );

  //replace_div_1
  $form['element_to_be_replaced_1'] = array(
    '#type' => 'textfield',
    '#title' => t("My conditional field one"),
    '#prefix' => '<div id="replace_div_1">',
    '#suffix' => '</div>',
  );


 //... more form elements here

  //replace_div_2
  $form['element_to_be_replaced_2'] = array(
    '#type' => 'textfield',
    '#title' => t("My conditional field two"),
    '#prefix' => '<div id="replace_div_2">',
    '#suffix' => '</div>',
  );
  return $form;
}

function ajax_example_simplest_callback($form, $form_state) {

  //... do my stuff here


  //normally I would return only the form bit for replacing a single wrapper
  //declared in the trigger element, like this:
  return $form['element_to_be_replaced_blahblah'];

}

Geri arama işlevinde, AJAX çerçevesinin $form['element_to_be_replaced_1']değiştirilmesi gerektiğini <div id="replace_div_1">ve $form['element_to_be_replaced_2']değiştirilmesi gerektiğini söyleyen birden fazla form biti geri dönmek mümkün müdür <div id="replace_div_2">?

Yanıtlar:


73

Güncellemek için tek bir öğenin HTML kodunu döndürmek yerine, ajax geri çağırmanız bir dizi ajax komutu döndürür . Böylece her öğeyi değiştirmek için iki ajax_command_replace döndürebilir .

function ajax_example_simplest_callback(&$form, $form_state) {
  return array(
    '#type' => 'ajax',
    '#commands' => array(
      ajax_command_replace("#replace_div_1", render($form['element_to_be_replaced_1'])),
      ajax_command_replace("#replace_div_2", render($form['element_to_be_replaced_2']))
    )
  );
}

2
Bu harika olan !! Çok zaman kazandı. Çok teşekkür ederim :)
Sandesh Yadav

24 saat içinde bir ödül geliyor.
AyeshK

Geri arama işlevinin adını değiştirmek zorunda kaldım. Ajax_example_simplest_callback (& ​​$ form, $ form_state) {} işlevini kullanarak bana beyaz ölüm ekranını verdi.
Ghoti

5

Drupal 8 alternatif sözdizimi

use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\ReplaceCommand;

class name extends FormBase{
   function ajax_example_simplest(array $form, FormStateInterface &$form_state) {
       $response = new AjaxResponse();
       $response->addCommand(new ReplaceCommand("#replace_div_1", ($form['element_to_be_replaced_1'])));
       $response->addCommand(new ReplaceCommand("#replace_div_2", ($form['element_to_be_replaced_2'])));
       return $response;
   }
}

Bir fark, AjaxResponse, Drupal \ Core \ Render \ AttachmentsInterface özelliğini uyguladığı için render komutunun bırakılmasıdır.

render ($ form ['element_to_be_replaced_1'])

Render ekleme hala çalışıyor, ancak bir TableSelect Table'ı bu şekilde güncellerken sorun yaşadım.


Teşekkürler işe yarıyor. Render () 'in kullanımı akıllıca olmaz çünkü bence Drupal belgeselleri Drupal 9
Ngatia Frankline’da

4

Pierre Buyle'nin cevabı benim için işe yaramadı. Ancak, aşağıdaki gibi bir şey çalıştı.

function ajax_example_simplest_callback(&$form, $form_state) {
    $commands = array();
    $commands[] = ajax_command_replace("#replace_div_1", render($form['element_to_be_replaced_1']));
    $commands[] = ajax_command_replace("#replace_div_2", render($form['element_to_be_replaced_2']));
    $page = array('#type' => 'ajax', '#commands' => $commands);
    ajax_deliver($page);
}

AJAX komutlarının dizisini döndürmek yerine, ajax_deliver () çağrısına dikkat edin .


2
Sanırım formunuzda #ajax ['yol'] kullanıyorsunuz. Bu durumda, hook_menu uygulamanızda 'geri arama sun' özelliğini kullanmalısınız, bu Drupal'a sayfa geri arama sonucunuzu biçimlendirme yerine AJAX komutu olarak göstermesini sağlayacaktır. Ancak, doğrudan sayfa geri çağrınızda kullanarak, normal Drupal sayfa teslimini atlayabilirsiniz.
Pierre Buyle,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.