AHAH: Несколько селектов, валидация и кэш форм [Решено]

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

Аватар пользователя vitg vitg 20 июля 2010 в 21:00

У меня есть несколько селектов на форме. Иерархически значения в них меняются.
После отправки получаю следующее сообщение:
"Сделан недопустимый выбор. Пожалуйста, обратитесь к администратору сайта."
Насколько я понял, это сообщение выдается функцей здесь http://api.drupal.org/api/function/_form_validate/6

После двух дней испытаний друпала на прочность пришел к следующим выводам:
-эта валидация встроенна;
-ошибка возникает потому, что изначально выбранного элемента в селекте нет, а затем он появляется, становится выбранным и пытается отправить значение в хук _submit;
-нужно как-то перестраивать форму во время работы ahah-коллбека (вносить в кеш, выносить из него), а именно изменять '#options';
Если не прав, пожалуйста, поправьте.

Имеется следующий код (AHAH-коллбек):

function get_model_serials ()
{

        //Участок кода для правильной обрабоки формы
        $form_state = array('storage' => NULL, 'submitted' => FALSE);
        $form_build_id = $_POST['form_build_id'];
        $form = form_get_cache($form_build_id, $form_state);
        $args = $form['#parameters'];

        $form_id = array_shift($args);
        $form['#post'] = $_POST;
        $form['#redirect'] = FALSE;
        $form['#programmed'] = FALSE;
        $form_state['post'] = $_POST;
        $form = form_builder($form_id, $form, $form_state);

        $outf = fopen ("out.txt","w");
    fprintf ($outf, serialize ($form));
    fclose ($outf);

        $selectednid = $form_state['values']['model_items'];
        if ($selectednid)
        {
                $result = db_query ("SELECT * FROM {leasing_base} WHERE id_catalog=%d" ,$selectednid);
        $options = array(0 => "Выберите серийный номер");
                while ($obj = db_fetch_object ($result))
                        $options [$obj->id_trade] = $obj->serial_number." (" . $obj->price . ")";

        }
        else
                $options [0] = "Выберите модель";

    $form['leasing_reserve']['serial_items']['#options'] = $options;

        $simpleform  = $form['leasing_reserve']['serial_items'];
        $simpleform['#options'] = $options;
        $simpleform['#description'] = l ('Подробнее о выбранной модели','node/'.$selectednid,array ('attributes' => array ('target' => '_blank')));

        $javascript  = drupal_add_js(NULL, NULL, 'header');
        return drupal_json(array(
                'status' => TRUE,
                'data' => theme('status_messages') . drupal_render($simpleform),
                'settings' => call_user_func_array('array_merge_recursive', $javascript['setting']),
        ));

}

Интересует, как можно список $options записать в кеш форм, сделав это максимально красивым и гибким способом. Как это сделать?
Есть идея вытаскивать из кеша форму, менять её значения, затем десериализовать строку, пытаться с ней что-то делать... Но это бред, мне кажется.
И еще вопрос. form_builder () записывает в кеш то, что получилось?

Заранее всем спасибо.

Комментарии

Аватар пользователя gorr gorr 21 июля 2010 в 0:51

Можно так:

<?php
function get_model_serials ()
{
 
    
//Участок кода для правильной обрабоки формы
    
$form_state = array('storage' => NULL'submitted' => FALSE);
     
$form_build_id $_POST['form_build_id'];
    
$form form_get_cache($form_build_id$form_state);
    
$args $form['#parameters'];
 
 
 
    
$form_id array_shift($args);
    
$form['#post'] = $_POST;
    
$form['#redirect'] = FALSE;
    
$form['#programmed'] = FALSE;
    
$form_state['post'] = $_POST;
    
 
 
    
$outf fopen ("out.txt","w");
    
fprintf ($outfserialize ($form));
    
fclose ($outf);
 
    
$selectednid $form_state['values']['model_items'];
    if (
$selectednid)
    {
        
$result db_query ("SELECT * FROM {leasing_base} WHERE id_catalog=%d" ,$selectednid);
        
$options = array(=> "Выберите серийный номер");
        while (
$obj db_fetch_object ($result))
            
$options [$obj->id_trade] = $obj->serial_number." (" $obj->price ")";
 
    }
    else
        
$options [0] = "Выберите модель";
 
    
$form['leasing_reserve']['serial_items']['#options'] = $options;
    
form_set_cache($form_build_id,$form,$form_state);
    
$form form_builder($form_id$form$form_state);
    
$simpleform  $form['leasing_reserve']['serial_items'];
    
$simpleform['#options'] = $options;
    
$simpleform['#description'] = ('Подробнее о выбранной модели','node/'.$selectednid,array ('attributes' => array ('target' => '_blank')));
 
 
    
$javascript  drupal_add_js(NULLNULL'header');
    return 
drupal_json(array(
        
'status' => TRUE,
        
'data' => theme('status_messages') . drupal_render($simpleform),
        
'settings' => call_user_func_array('array_merge_recursive'$javascript['setting']),
    ));
 
}
?>

Нет, форм_билдер не сохраняет в кеш.