Có thể thay thế nhiều phần tử biểu mẫu (trình bao bọc) được kích hoạt chỉ bằng một phần tử kích hoạt #ajax không?


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

}

Có thể trả về nhiều hơn một bit mẫu trong hàm gọi lại cho khung AJAX $form['element_to_be_replaced_1']nên thay thế <div id="replace_div_1">$form['element_to_be_replaced_2']nên thay thế <div id="replace_div_2">không?

Câu trả lời:


73

Thay vì trả về HTML của phần tử đơn để cập nhật, cuộc gọi lại ajax của bạn có thể trả về một mảng các lệnh ajax . Vì vậy, nó có thể trả về hai ajax_command_Vplace để thay thế từng phần tử.

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
Đây là một trong những tuyệt vời !! Tiết kiệm rất nhiều thời gian. Cảm ơn bạn rất nhiều :)
Sandesh Yadav

Một tiền thưởng đang đến trên đường của bạn trong 24 giờ.
AyeshK

Phải thay đổi tên của chức năng gọi lại. Sử dụng hàm ajax_example_simplest_callback (& ​​$ form, $ form_state) {} đã cho tôi màn hình trắng của cái chết.
Ghoti

5

Cú pháp thay thế 8 Drupal

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

Một điểm khác biệt là lệnh kết xuất bị loại bỏ, vì AjaxResponse thực hiện Drupal \ Core \ Render \ AttachmentsInterface

kết xuất ($ form ['Element_to_be_Vplaces_1'])

Thêm kết xuất vẫn hoạt động, nhưng tôi gặp vấn đề khi cập nhật Bảng TableSelect theo cách đó.


Cảm ơn bạn nó hoạt động. Tôi nghĩ sẽ không khôn ngoan khi sử dụng render () bởi vì các tài liệu của Drupal nói rằng nó bị lỗi và sẽ không có sẵn trong Drupal 9
Ngatia Frankline

4

Câu trả lời của Pierre Buyle không có tác dụng với tôi. Tuy nhiên, một cái gì đó như sau đã làm việc.

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

Lưu ý cuộc gọi đến ajax_deliver () , thay vì trả về mảng các lệnh AJAX.


2
Tôi đoán bạn đang sử dụng #ajax ['path'] trong biểu mẫu của mình. Trong trường hợp đó, trong triển khai hook_menu của bạn, bạn nên sử dụng thuộc tính 'phân phối gọi lại', điều này sẽ hướng dẫn Drupal hiển thị kết quả gọi lại trang của bạn dưới dạng lệnh AJAX thay vì đánh dấu. Nhưng sử dụng nó trực tiếp trong cuộc gọi lại trang của bạn, bạn bỏ qua việc phân phối trang Drupal bình thường.
Pierre Buyle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.