И снова каскадные зависимые дропдауны

Главные вкладки

Аватар пользователя mikel mikel 6 января 2014 в 20:44

Встала классическая задача: сделать в модуле зависимые выпадающие списки. Примеров вагон, но все почему-то только с двумя дропдаунами.
У меня дропдаунов 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);
}
?>

Комментарии

Аватар пользователя imarat imarat 6 января 2014 в 21:59

А вы возвращайте не массив с командами, а элемент формы, а заменяемый элемент указывайте в 'wrapper' в массиве #ajax. Вроде так делал, все работало. Пс: и без рендера, воз вращайте просто массив