Встала классическая задача: сделать в модуле зависимые выпадающие списки. Примеров вагон, но все почему-то только с двумя дропдаунами.
У меня дропдаунов 3. По первому второй нормально перебиндивается, но по при смене значения второго ajax уже не вызывается.
Пожалуйста, киньте какой-нибудь пример по form api, с несколькими зависимыми элементами.
<?php
//Форма поиска
function folk_search_nameform()
{
$form['geo1'] = array(
'#title' => t('Область'),
'#type' => 'select',
'#options' => folk_search_get_geo1_list(),
'#default_value' => -1,
'#ajax' => array(
'callback' => 'folk_search_ajax_for_geo1_callback',
'event' => 'change',
'method' => 'replace',
),
);
$form['geo2'] = array(
'#title' => t('Район'),
'#type' => 'select',
'#options' => folk_search_get_geo_parent(-1),
'#default_value' => -1,
'#prefix' => '<div id="geo2-wrapper">',
'#suffix' => '</div>',
'#ajax' => array(
'callback' => 'folk_search_ajax_for_geo2_callback',
'event' => 'change',
'method' => 'replace',
),
);
$form['geo3'] = array(
'#title' => t('Сельское поселение'),
'#type' => 'select',
'#prefix' => '<div id="geo3-wrapper">',
'#suffix' => '</div>',
);
$form['submit'] = array(
'#title' => t('Искать'),
'#type' => 'submit',
'#value' => t('Искать'),
);
return $form;
}
//Меняем geo1
function folk_search_ajax_for_geo1_callback($form, $form_state)
{
if (isset($form_state['values']['geo1']))
{
$form['geo2'] = array(
'#title' => t('Район'),
'#type' => 'select',
'#options' => folk_search_get_geo_parent($form_state['values']['geo1']),
'#prefix' => '<div id="geo2-wrapper">',
'#suffix' => '</div>',
'#ajax' => array(
'callback' => 'folk_search_ajax_for_geo2_callback',
'event' => 'change',
'method' => 'replace',
),
);
}
$commands[] = ajax_command_insert('#geo2-wrapper', drupal_render($form['geo2']));
return array('#type' => 'ajax', '#commands' => $commands);
}
//Меняем geo2
function folk_search_ajax_for_geo2_callback($form, $form_state)
{
if (isset($form_state['values']['geo2']))
{
$form['geo3'] = array(
'#title' => t('Сельское поселение'),
'#type' => 'select',
'#options' => folk_search_get_geo_parent($form_state['values']['geo2']),
'#prefix' => '<div id="geo3-wrapper">',
'#suffix' => '</div>',
);
}
$commands[] = ajax_command_insert('#geo3-wrapper', drupal_render($form['geo3']));
return array('#type' => 'ajax', '#commands' => $commands);
}
?>
Комментарии
А вы возвращайте не массив с командами, а элемент формы, а заменяемый элемент указывайте в 'wrapper' в массиве #ajax. Вроде так делал, все работало. Пс: и без рендера, воз вращайте просто массив
imarat, спасибо!
Все получилось