Как с помощью ajax обновить НЕСКОЛЬКО элементов формы

Функция, указанная в #ajax['callback'] может возвращать только один элемент формы (не считая дочерних):

function test_form($form, $form_state) {
  $form['ajax_element'] = array(
    ...
    '#ajax' = array(
      'callback' => 'test_form_ajax_callback',
      'wrapper' => 'element1-wrapper', // либо element2-wrapper, но не два сразу
    ),
  );
 
  $form['element1'] = array(
    ...
    '#prefix' = '<div id="element1-wrapper">',
    '#suffix' = '</div>',
  );
 
  $form['element2'] = array(
    ...
    '#prefix' = '<div id="element2-wrapper">',
    '#suffix' = '</div>',
  );
 
  return $form;
}
 
function test_form_ajax_callback($form, $form_state) {
  return $form['element1']; // либо $form['element2'], но не два сразу
}

Можно конечно обернуть оба элемента в fieldset или обычный div, но это не всегда возможно. Поэтому для решения задачи следует отказаться от #ajax['wrapper'], а в #ajax['callback'] возвращать набор команд:

function test_form($form, $form_state) {
  $form['ajax_element'] = array(
    ...
    '#ajax' = array(
      'callback' => 'test_form_ajax_callback',
    ),
  );
 
  $form['element1'] = array(
    ...
    '#prefix' = '<div id="element1-wrapper">',
    '#suffix' = '</div>',
  );
 
  $form['element2'] = array(
    ...
    '#prefix' = '<div id="element2-wrapper">',
    '#suffix' = '</div>',
  );
 
  return $form;
}
 
function test_form_ajax_callback($form, $form_state) {
  $commands[] = ajax_command_insert('#element1-wrapper', drupal_render($form['element1']));
  $commands[] = ajax_command_insert('#element2-wrapper', drupal_render($form['element2']));
  return array('#type' => 'ajax', '#commands' => $commands);
}

Написанное актуально для
Drupal 7
Теги:
ajax, работа с формами
Добавлено: 30 Июля 2018 07:39:43 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...