Функция, указанная в #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
Похожие записи
- Восстанавливаем позицию текстового курсора при ajax обновлении формы
- Как выполнять свой js-код до или после любых AJAX запросов (изменение работы AJAX API)
- AJAX в форме корзины Commerce 2
- Как в #ajax callback сгенерировать новую форму чтобы ей не мешали GET и POST данные текущего запроса
- AJAX команда для сброса значений полей формы
Комментарии
Спасибо за материал. То что нужно.
Этот вариант не учитывает случая, когда форма не прошла валидацию и должна вернуть сообщение об ошибке вместе с элементом
Спасибо!!! Все работает отлично...
Для того что бы вылетало сообщение с ошибкой валидации достаточно добавить следующее:
Пытаюсь с помощью ajax обновить select формы, но вылетает ошибка: "Сделан недопустимый выбор. Пожалуйста, обратитесь к администратору сайта."
Понимаю, что в $form['element1']['#options'] - изначально не было такого элемента, поэтому это и вызывает ошибку.
Как можно обновить форму? Чтобы новые опшины были в кеше формы?
Добрый день.
Пытаюсь заменить по предложенной технологии поле checkbox :
Но при этом поле proverka не меняет значение. Здесь line1 - markup.
При этом в случае , если просто указать
$commands[] = ajax_command_insert('#proverka-wrapper', drupal_render($form['proverka']));
, то поле просто стирается .В форме описано :
Добавить комментарий