У меня есть несколько селектов на форме. Иерархически значения в них меняются.
После отправки получаю следующее сообщение:
"Сделан недопустимый выбор. Пожалуйста, обратитесь к администратору сайта."
Насколько я понял, это сообщение выдается функцей здесь http://api.drupal.org/api/function/_form_validate/6
После двух дней испытаний друпала на прочность пришел к следующим выводам:
-эта валидация встроенна;
-ошибка возникает потому, что изначально выбранного элемента в селекте нет, а затем он появляется, становится выбранным и пытается отправить значение в хук _submit;
-нужно как-то перестраивать форму во время работы ahah-коллбека (вносить в кеш, выносить из него), а именно изменять '#options';
Если не прав, пожалуйста, поправьте.
Имеется следующий код (AHAH-коллбек):
{
//Участок кода для правильной обрабоки формы
$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 () записывает в кеш то, что получилось?
Заранее всем спасибо.
Комментарии
Можно так:
<?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 ($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;
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'] = 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']),
));
}
?>
Нет, форм_билдер не сохраняет в кеш.
gorr, спасибо!
Помогло очень.