Здравствуйте. Разбираюсь тут с формами.
Возникла такая проблема.
У меня есть форма. Там 2 поля. После заполнения пользователь жмёт далее и грузится эта же форма. Заполненные данные сохраняются в $form_state['storage']['first_field' и в 'second field']. Но форма грузится, естественно, заполненной. Надо, чтобы второе поле было пустым. Т.е. данные сохранили и очистили поле. Первое при этом должно быть заполненным.
Никак не пойму, как это сделать...
Ещё, глупый вопрос Но не знаю, как даже искать.
Что означает конструкция:
<?php!empty($form_state['values']['name']) ? $form_state['values']['name'] : '' ?>
Ну т.е. понятно, что такое empty и переменные, но вот в целом, что делается, не ясно
Комментарии
<?php
//Конкретные ключи массивов $form и $form_state - в зависимости от вашей формы
$default_value = isset($form_state['values']['storage']['first_field']) ?
$form_state['values']['storage']['first_field'] : ''; $form['storage']['first_field']['#default_value'] = $default_value; $form['storage']['second_field']['#default_value'] = '';
?>
Как-то так
Выражение
<?php!empty($form_state['values']['name']) ? $form_state['values']['name'] : '' ?>
просто другая форма записи конструкции if else, т.е:
<?php
if (!empty($form_state['values']['name']))
$form_state['values']['name'];
else
'';
?>
ser_house, спасибо, но не совсем понял.
Я недавно начал разбираться со всем этим, поэтому многое не понимаю. Сорри
Когда форма грузится повторно, то она заполнена. Я так понимаю, что при $form_state['rebuild'] = TRUE; поля формы заполняются из данных сессии. И дефолт велью уже не берётся. А если ребилд false делать, то $form_state пустая? По крайней мере переменная у меня вроде как пустая. Этот момент не совсем понимаю...По-русски как-то особо нигде нормально не описано, а по англ. не могу понять эти вещи.
«просто другая форма записи конструкции if else»
оо, спасибо!
Может можно как-то и красившее, зато так , мне кажется, понятнее:
при генерации формы можно в $form_state добавить свою переменную-флаг, которая будет доступна при сабмите, валидации и повторной генерации... например $form_state['my_submitted']
При генерации формы проверяем наличие этой переменной, если отсутствует выводим дефолтное значение нужного поля и устанавливаем $form_state['my_submitted']=FALSE,
При сабмите устанавливаем $form_state['my_submitted']=TRUE,
При повторной генерации формы ($form_state['my_submitted'] определена и равна TRUE) выводим ДРУГОЕ дефолтное значение нужного поля.
Или используем $form_state['my_submitted'] не как флаг(TRUE,FALSE), а как счетчик перезагрузок формы (0,1,2,3,..)
Как-то так... Не?
Ну вот я сделал переменную $form_state['line'][]. Туда сохраняются данные, введённые в поле.
Всё окей. Данные сохраняются туда, которые введены и массив обновляется каждый раз.
Но в свою очередь все поля формы тоже остаются. Пишу дефолтное значение, но форма всё равно выводит старое, введённое.
Вот код, для простоты оставил 1 поле и убрал лишнее.
Т.е. значение сохраняю в $form_state['name_st']. Вот надо, чтобы после заполнения формы, поле было пустым...
<?php
/**
function rewrite_form($form, &$form_state) {
if (!empty($form_state)) {
drupal_set_message(t("Название: name", array('name' => $form_state['name_st'])));
}
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Название'),
'#size' => 40,
//'#default_value' => (isset($form_state['name_st']) ? $form_state['name_st'] : '123'),
'#default_value' => '123',
'#required' => TRUE,
);
$form['submit'] = array('#type' => 'submit',
'#value' => t('Далее'),
'#submit' => array('rewrite_form_submitter'),
);
return $form;
}
* Submit form
*/
function rewrite_form_submitter($form, &$form_state) {
$form_state['name_st'] = $form_state['values']['name'];
$form_state['rebuild'] = TRUE;
} ?>
Я тут вообще понял, что если ребилд не делать, то введенное значение в поле будет в $form_state['input']['name']
Ну и нету переменных, которые сохранялись в сабмиттере.
Я ничё не понимаю
$form_state['input'] как раз для случая rebuild. Судя по документации, этот массив в основном используется именно для того, чтобы очищать нужные поля в пошаговых формах.
Может, попробовать в sumbit:
$form_state['input']['name'] = '';
в этом случае в
$form_state['values']['name']
должно остаться введенное значение, а поле окажется пустым.Если я все правильно понял...
ДА!!!

ser_house, спасибо огромное!
Сделал в сабмите unset($form_state['input']['name']); и всё круто. Поле заполняется дефолтным значением.
Ура