Apakah mungkin untuk mengganti lebih dari satu elemen bentuk (pembungkus) yang dipicu oleh hanya satu elemen pemicu #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'];

}

Apakah mungkin untuk mengembalikan lebih dari satu bentuk bit dalam fungsi panggilan balik yang memberitahukan kerangka kerja AJAX yang $form['element_to_be_replaced_1']harus diganti <div id="replace_div_1">dan $form['element_to_be_replaced_2']harus diganti <div id="replace_div_2">?

Francisco Luz
sumber

Jawaban:

73

Alih-alih mengembalikan HTML elemen tunggal untuk memperbarui, panggilan balik ajax Anda dapat mengembalikan array perintah ajax . Sehingga bisa mengembalikan dua ajax_command_replace untuk mengganti setiap elemen.

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']))
    )
  );
}
Pierre Buyle
sumber
2
Ini luar biasa !! Menghemat banyak waktu. Terima kasih banyak :)
Sandesh Yadav
Hadiah akan segera tiba dalam 24 jam.
AyeshK
Harus mengubah nama fungsi panggilan balik. Menggunakan fungsi ajax_example_simplest_callback (& ​​$ form, $ form_state) {} memberi saya layar putih kematian.
Ghoti
5

Drupal 8 sintaks alternatif

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

Satu perbedaan adalah bahwa perintah render dijatuhkan, karena AjaxResponse mengimplementasikan Drupal \ Core \ Render \ AttachmentsInterface

render ($ form ['element_to_be_replaced_1'])

Menambahkan render masih berfungsi, tapi saya punya masalah saat memperbarui TableSelect Table seperti itu.

Johann
sumber
Terima kasih itu berhasil. Saya pikir itu tidak akan bijaksana untuk menggunakan render () karena dokumentasi Drupal mengatakan itu diuraikan dan tidak akan tersedia di Drupal 9
Ngatia Frankline
4

Jawaban Pierre Buyle tidak berhasil untuk saya. Namun, sesuatu seperti yang berikut ini berhasil.

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

Perhatikan panggilan ke ajax_deliver () , daripada mengembalikan array perintah AJAX.

Anjing hutan
sumber
2
Saya kira Anda menggunakan #ajax ['path'] di formulir Anda. Dalam hal itu, dalam implementasi hook_menu Anda, Anda harus menggunakan properti 'deliver callback', ini akan menginstruksikan Drupal untuk membuat hasil panggilan balik halaman Anda sebagai perintah AJAX alih-alih markup. Tetapi menggunakannya secara langsung dalam panggilan balik halaman Anda, Anda mem-bypass pengiriman halaman Drupal yang normal.
Pierre Buyle