Динамический Select

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

Аватар пользователя rudireg rudireg 25 ноября 2011 в 13:36

Привет, использую D7.
Возникла необходимость использовать динамический select.
Например есть 2 поля типа select

<?php
      $form
["sezon"] = array(
         
'#type' => 'select'
         
'#title'    => 'Сезон',
         
'#options' => array(
                              
'1' => 'Зима'
                              
'2' => 'Весна'
                              
'3' => 'Лето',
                              
'4' => 'Осень',
                            ),
        );
        
/*Месяцы сезона - должны быть динмически изменяемы*/
      
$form["month"] = array(
         
'#type' => 'select'
         
'#title'    => 'Месяцы',
         
'#options' => ? /*Тут непонятно как сделать динамический показ месяцев*/
        
);    

    

$form['submit'] = array(
           
'#type' => 'submit',
           
'#value' => 'Отправить',
    );        
?>

Как сделать так, чтобы в зависимости от выбраного сезона показывались соответсвующие месяца года

Комментарии

Аватар пользователя rudireg rudireg 25 ноября 2011 в 15:12

"kalabro" wrote:
http://xandeadx.ru/blog/drupal/446[/quote]
Там делается выборка из баззы данных и строиться select
а мне нужно построить второй select в зависимости от значения первого select

Скажите хотябы как обратиться к значению первого select
так? $form_state['values']['sezon'];

Аватар пользователя rudireg rudireg 25 ноября 2011 в 17:47

Динамический селект сделал
вот пример

<?php
/**
 * Implementation of hook_menu().
 * Registers a form-based page that you can access at "http://localhost/mypage"
 */
function mymodule_menu(){
    return array(
        
'mypage' => array(
            
'title' => 'A page to test ajax',
            
'page callback' => 'drupal_get_form',
            
'page arguments' => array('mymodule_page'),
            
'access arguments' => array('access content'), 
        )
    );
}

/**
 * A form with a dropdown whose options are dependent on a
 * choice made in a previous dropdown.
 *
 * On changing the first dropdown, the options in the second are updated.
 */
function mymodule_page($form, &$form_state) {
    
// Get the list of options to populate the first dropdown.
    
$options_first mymodule_first_dropdown_options();

    

// If we have a value for the first dropdown from $form_state['values'] we use
    // this both as the default value for the first dropdown and also as a
    // parameter to pass to the function that retrieves the options for the
    // second dropdown.
    
$value_dropdown_first = isset($form_state['values']['dropdown_first']) ? $form_state['values']['dropdown_first'] : key($options_first);

    

$form['dropdown_first'] = array(
        
'#type' => 'select',
        
'#title' => 'First Dropdown',
        
'#options' => $options_first,
        
'#default_value' => $value_dropdown_first,

        

// Bind an ajax callback to the change event (which is the default for the
        // select form type) of the first dropdown. It will replace the second
        // dropdown when rebuilt
        
'#ajax' => array(
            
// When 'event' occurs, Drupal will perform an ajax request in the
            // background. Usually the default value is sufficient (eg. change for
            // select elements), but valid values include any jQuery event,
            // most notably 'mousedown', 'blur', and 'submit'.
            
'event' => 'change',
            
'callback' => 'mymodule_ajax_callback',
            
'wrapper' => 'dropdown_second_replace',
        ),
    );
    
$form['dropdown_second'] = array(
        
'#type' => 'select',
        
'#title' => 'Second Dropdown',
        
// The entire enclosing div created here gets replaced when dropdown_first
        // is changed.
        
'#prefix' => '<div id="dropdown_second_replace">',
        
'#suffix' => '</div>',
        
// when the form is rebuilt during ajax processing, the $value_dropdown_first variable
        // will now have the new value and so the options will change
        
'#options' => mymodule_second_dropdown_options($value_dropdown_first),
        
'#default_value' => isset($form_state['values']['dropdown_second']) ? $form_state['values']['dropdown_second'] : '',
    );
    return 
$form;
}

/**
 * Selects just the second dropdown to be returned for re-rendering
 *
 * Since the controlling logic for populating the form is in the form builder
 * function, all we do here is select the element and return it to be updated.
 *
 * return renderable array (the second dropdown)
 */
function mymodule_ajax_callback($form$form_state) {
    return 
$form['dropdown_second'];
}

/**
 * Helper function to populate the first dropdown. This would normally be
 * pulling data from the database.
 *
 * return array of options
 */
function mymodule_first_dropdown_options() {
    return array(
        
'colors' => 'Names of colors',
        
'cities' => 'Names of cities',
        
'animals' => 'Names of animals',
    );
}

/**
 * Helper function to populate the second dropdown. This would normally be
 * pulling data from the database.
 *
 * param key. This will determine which set of options is returned.
 *
 * return array of options
 */
function mymodule_second_dropdown_options($key '') {
    
$options = array(
        
'colors' => array(
            
'red' => 'Red',
            
'green' => 'Green',
            
'blue' => 'Blue'
        
),
        
'cities' => array(
            
'paris' => 'Paris, France',
            
'tokyo' => 'Tokyo, Japan',
            
'newyork' => 'New York, US'
        
),
        
'animals' => array(
            
'dog' => 'Dog',
            
'cat' => 'Cat',
            
'bird' => 'Bird'
        
),  
    );
    if (isset(
$options[$key])) {
        return 
$options[$key];
    }
    else {
        return array();
    }
}
?>
Аватар пользователя rudireg rudireg 25 ноября 2011 в 18:07

Но теперь возникла новая проблема.
Допустим я выбрал данные что в полях select и нажал на кнопку SUBMIT
Сабмит выглядит таким образом

<?php
$form
['submit'] = array(
           
'#type' => 'submit',
           
'#value' => 'Отправить',
           
'#ajax' => array(
                     
'callback' => 'calculate_price_ajax',
                     
'wrapper' => 'avto-price-form',   
            ),
    );        
?>

В функции calculate_price_ajax обрабатываются переменные что в SELECT
их я получаю так

<?php
$mark   
$form_state['values']['mark'];
$model  $form_state['values']['model'];
?>

При первом нажатии SUBMIT все нормально
но потом я например выбрал другие данные в SELECT
тоесть изменил свой выбор
и снова жму SUBMIT
но SUBMIT почемуто обрабатывает старые данные что я выбрал
Тоесть этот код

<?php
$mark   
$form_state['values']['mark'];
$model  $form_state['values']['model'];
?>

Подхватывает старые данные почемуто...
Может тут чтото с кэшем не так?