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">?

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

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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.