Форма перенаправления при ошибке проверки

У меня есть ситуация, когда моя форма не проверяется, мне нужно удалить все, кроме первого аргумента, из URL-адреса. Причина этого в том, что результаты моей формы отображаются под формой в области содержимого. Если форма не подтверждается, мне нужно удалить все предыдущие результаты.

Я пробовал следующее в моей функции form_validate.

// Check if there were any errors.
$errors = form_set_error();
if (!empty($errors)) {
  drupal_goto(arg(0));
}

Страница назначения, очевидно, такая же, за исключением того, что все аргументы, кроме первого, удалены. Проблема в том, что Drupal забывает о предыдущем состоянии формы и ошибках, вызванных функцией form_validate.

Я также пытался изменить значение #redirect в моей функции form_validate, но безрезультатно.

Какие-либо предложения?


person Icode4food    schedule 23.06.2010    source источник


Ответы (2)


Вы поставили себя в неприятную ситуацию. Насколько я знаю, вы не можете перенаправить без потери $form_state. Перенаправление не будет работать, если форма не отправлена, поэтому, пока форма не проверяется, вы далеко не продвинетесь.

Я не знаю, как вы настраиваете свой код, но мне кажется, что вам больше повезет настроить переменную в $form_state и использовать ее, чтобы определить, следует ли скрывать/отображать результаты.

Альтернативным вариантом было бы сохранить $form_state в глобальном $_SESSION['batch_form_state'], чтобы использовать его при инициации формы. Я не пробовал это раньше, и это немного хакерски, но это должно работать.

person googletorp    schedule 23.06.2010

Вы можете хранить данные формы, если они невелики, в $_SESSION. Затем проверьте, существует ли он после перенаправления.

Я не знаком с Drupal, но вы должны иметь доступ к отфильтрованным значениям формы. Таким образом, вместо проверки с помощью полей $_POST вы проверяете сохраненные значения $_SESSION.

упрощенный пример

session_start();

// ... Previous Validation

// Check if there were any errors.
$errors = form_set_error();
if (!empty($errors)) {
    $_SESSION['form_state'] = $form_state;
    drupal_goto(arg(0));
}

после перенаправления

session_start();

$form_state = $_SESSION['form_state']);
unset($_SESSION['form_state']);

// The rest of the script....
person gawpertron    schedule 23.06.2010
comment
На пользовательском веб-сайте PHP ваш метод будет работать. Но у Drupal есть собственный API для обработки форм. На самом деле это больше вопрос Drupal, чем вопрос PHP или даже вопрос проверки формы. - person Icode4food; 23.06.2010
comment
Быстрый просмотр документа API, и он упоминает массив $form_state['values'] который, я думаю, является всеми вашими отфильтрованными значениями формы, но вы правы, на первый взгляд, это не кажется способом анализа чего-либо, кроме $ _ПОЧТА. Почему бы не сохранить $form_state в сеансе, а затем сделать вид, что форма была проверена, и перезаписать $form_state значениями сеанса? - person gawpertron; 23.06.2010