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

10.03.2012

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

/**
 * Form builder.
 */
function test_form($form, $form_state) {
  $form['element1'] = array(
    ...
    '#prefix' = '<div id="element1-wrapper">',
    '#suffix' = '</div>',
  );

  $form['element2'] = array(
    ...
    '#prefix' = '<div id="element2-wrapper">',
    '#suffix' = '</div>',
  );

  $form['ajax_element'] = array(
    ...
    '#ajax' = array(
      'callback' => 'test_form_ajax_callback',
      'wrapper' => 'element1-wrapper', // либо element2-wrapper, но не два сразу
    ),
  );

  return $form;
}

/**
 * Ajax callback.
 */
function test_form_ajax_callback($form, $form_state) {
  return $form['element1']; // либо $form['element2'], но не два сразу
}

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

/**
 * Form builder.
 */
function test_form($form, $form_state) {
  $form['element1'] = array(
    ...
    '#prefix' = '<div id="element1-wrapper">',
    '#suffix' = '</div>',
  );

  $form['element2'] = array(
    ...
    '#prefix' = '<div id="element2-wrapper">',
    '#suffix' = '</div>',
  );

  $form['ajax_element'] = array(
    ...
    '#ajax' = array(
      'callback' => 'test_form_ajax_callback',
    ),
  );

  return $form;
}

/**
 * Ajax callback.
 */
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
Похожие записи

Комментарии

Спасибо за материал. То что нужно.

Этот вариант не учитывает случая, когда форма не прошла валидацию и должна вернуть сообщение об ошибке вместе с элементом

Гость
16.05.2016, 15:43

Спасибо!!! Все работает отлично...

Игорь
25.05.2016, 16:51

Для того что бы вылетало сообщение с ошибкой валидации достаточно добавить следующее:

$commands[] = ajax_command_prepend($selector, theme('status_messages'));
Игорь
07.08.2016, 09:12

Пытаюсь с помощью ajax обновить select формы, но вылетает ошибка: "Сделан недопустимый выбор. Пожалуйста, обратитесь к администратору сайта."
Понимаю, что в $form['element1']['#options'] - изначально не было такого элемента, поэтому это и вызывает ошибку.
Как можно обновить форму? Чтобы новые опшины были в кеше формы?

Андрей
01.12.2016, 18:37

Добрый день.
Пытаюсь заменить по предложенной технологии поле checkbox :

  $form['line1']['proverka']['#default_value'] = 1;
  $commands[] = array();
  $commands[] = ajax_command_insert('#proverka-wrapper', drupal_render($form['line1']['proverka']));  
    
  return array(
    '#type' => 'ajax',
    '#commands' => $commands,
  );

Но при этом поле proverka не меняет значение. Здесь line1 - markup.
При этом в случае , если просто указать
$commands[] = ajax_command_insert('#proverka-wrapper', drupal_render($form['proverka'])); , то поле просто стирается .

В форме описано :

  $form['line1'] = array(
    '#type' => 'markup',
    '#theme' => array('inline_fields_bootstrap'),
    '#not_div' => FALSE,
    '#bootstrap_prefix' => 'col-md-',
  );

  $form['line1']['proverka'] = array(
    '#type' => 'checkbox',
    '#title' => 'Проверено',
    '#bootstrap_size_this' => 2,    
    '#prefix' => '<div id="proverka-wrapper">',
    '#suffix' => '</div>',
  );

Добавить комментарий