Функция, указанная в #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