È possibile sostituire più di un elemento modulo (wrapper) attivato da un solo elemento trigger #ajax?


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'];

}

È possibile restituire più di un bit di modulo nella funzione di richiamata dicendo al framework AJAX che $form['element_to_be_replaced_1']dovrebbe sostituire <div id="replace_div_1">e $form['element_to_be_replaced_2']sostituire <div id="replace_div_2">?

Risposte:


73

Invece di restituire il codice HTML del singolo elemento da aggiornare, il callback di ajax può restituire una matrice di comandi ajax . Quindi può restituire due ajax_command_replace per sostituire ogni elemento.

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
Questo è fantastico !! Risparmiato un sacco di tempo. Grazie mille :)
Sandesh Yadav il

Una taglia sta arrivando tra 24 ore.
AyeshK,

Ho dovuto cambiare il nome della funzione di callback. Usando la funzione ajax_example_simplest_callback (& ​​$ form, $ form_state) {} mi ha dato lo schermo bianco della morte.
Ghoti,

5

Drupal 8 sintassi alternativa

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;
   }
}

Una differenza è che il comando render viene eliminato, poiché AjaxResponse implementa Drupal \ Core \ Render \ AttachmentsInterface

render ($ form ['element_to_be_replaced_1'])

L'aggiunta del rendering funziona ancora, ma ho avuto problemi durante l'aggiornamento di una tabella TableSelect in quel modo.


Grazie funziona. Penso che non sarà saggio usare render () perché la documentazione di Drupal dice che è spiegata e non sarà disponibile in Drupal 9
Ngatia Frankline,

4

La risposta di Pierre Buyle non ha funzionato per me. Tuttavia, qualcosa di simile al seguente ha funzionato.

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);
}

Nota la chiamata a ajax_deliver () , piuttosto che restituire l'array di comandi AJAX.


2
Immagino tu stia usando #ajax ['percorso'] nel tuo modulo. In tal caso, nella tua implementazione hook_menu, dovresti usare la proprietà 'consegnare callback', questo indicherà a Drupal di rendere il risultato del callback della tua pagina come comando AJAX anziché markup. Ma utilizzandolo direttamente nel callback della pagina, si ignora la normale consegna della pagina Drupal.
Pierre Buyle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.