[РЕШЕНО] Сбросить данные в одном поле формы

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

Аватар пользователя Eventus Eventus 12 января 2012 в 22:13

Здравствуйте. Разбираюсь тут с формами.
Возникла такая проблема.
У меня есть форма. Там 2 поля. После заполнения пользователь жмёт далее и грузится эта же форма. Заполненные данные сохраняются в $form_state['storage']['first_field' и в 'second field']. Но форма грузится, естественно, заполненной. Надо, чтобы второе поле было пустым. Т.е. данные сохранили и очистили поле. Первое при этом должно быть заполненным.

Никак не пойму, как это сделать...

Ещё, глупый вопрос Smile Но не знаю, как даже искать.
Что означает конструкция:
<?php!empty($form_state['values']['name']) ? $form_state['values']['name'] : '' ?>

Ну т.е. понятно, что такое empty и переменные, но вот в целом, что делается, не ясно Smile

Комментарии

Аватар пользователя ser_house ser_house 13 января 2012 в 8:12
<?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'] = '';
?>

Как-то так Smile

Выражение
<?php!empty($form_state['values']['name']) ? $form_state['values']['name'] : '' ?>
просто другая форма записи конструкции if else, т.е:

<?php
if (!empty($form_state['values']['name']))
  
$form_state['values']['name'];
else
  
'';
?>
Аватар пользователя Eventus Eventus 13 января 2012 в 17:08

ser_house, спасибо, но не совсем понял.
Я недавно начал разбираться со всем этим, поэтому многое не понимаю. Сорри Smile

Когда форма грузится повторно, то она заполнена. Я так понимаю, что при $form_state['rebuild'] = TRUE; поля формы заполняются из данных сессии. И дефолт велью уже не берётся. А если ребилд false делать, то $form_state пустая? По крайней мере переменная у меня вроде как пустая. Этот момент не совсем понимаю...По-русски как-то особо нигде нормально не описано, а по англ. не могу понять эти вещи.

«просто другая форма записи конструкции if else»
оо, спасибо! Smile

Аватар пользователя Orion76 Orion76 13 января 2012 в 17:27

Может можно как-то и красившее, зато так , мне кажется, понятнее:
при генерации формы можно в $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,..)

Как-то так... Не?

Аватар пользователя Eventus Eventus 13 января 2012 в 17:58

Ну вот я сделал переменную $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;
}

?>
Аватар пользователя Eventus Eventus 13 января 2012 в 18:11

Я тут вообще понял, что если ребилд не делать, то введенное значение в поле будет в $form_state['input']['name']
Ну и нету переменных, которые сохранялись в сабмиттере.
Я ничё не понимаю Lol

Аватар пользователя ser_house ser_house 14 января 2012 в 1:47

$form_state['input'] как раз для случая rebuild. Судя по документации, этот массив в основном используется именно для того, чтобы очищать нужные поля в пошаговых формах.
Может, попробовать в sumbit:
$form_state['input']['name'] = '';
в этом случае в $form_state['values']['name'] должно остаться введенное значение, а поле окажется пустым.
Если я все правильно понял...

Аватар пользователя Eventus Eventus 14 января 2012 в 15:23

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