Возможно ли заменить более одного элемента формы (обертки), инициированного только одним триггерным элементом #ajax?

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

}

Можно ли вернуть более одного бита формы в функцию обратного вызова, сообщающую структуре AJAX, что $form['element_to_be_replaced_1'] должен заменить <div id="replace_div_1"> и $form['element_to_be_replaced_2'] должен заменить <div id="replace_div_2">?

50 голосов | спросил Francisco Luz 3 AM00000080000005731 2011, 08:07:57

3 ответа


73

Вместо того, чтобы возвращать HTML одного элемента для обновления, ваш обратный вызов ajax может возвращать массив ajax . Таким образом, он может вернуть два ajax_command_replace для замены каждого элемента.

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 4 AM000000110000004931 2011, 11:56:49
4

Ответ Пьера Буйла не помог мне. Однако что-то вроде следующего работало.

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_deliver () , а не возвращать массив команд AJAX.

ответил Coyote 16 Maypm12 2012, 20:20:22
1

Альтернативный синтаксис Drupal 8

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

Одно отличие заключается в том, что команда render отбрасывается, поскольку AjaxResponse реализует Drupal \ Core \ Render \ AttachmentsInterface

Render удар> ($ форма [ 'element_to_be_replaced_1'])

Добавление рендера все еще работает, но у меня были проблемы при обновлении таблицы TableSelect таким образом.

ответил Johann 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 11 Sep 2016 22:35:38 +0300 2016, 22:35:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132