2010-06-23 3 views
1

У меня возникла ситуация, когда моя форма не проверяется, мне нужно удалить все, кроме первого аргумента из 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, но безрезультатно.

Любые предложения?

ответ

1

Вы поставили себя в плохой ситуации. AFAIK, вы не можете перенаправить, не потеряв $ form_state. Переадресация не будет работать, если форма не отправлена, так как форма не проверяет, вы не получите далеко.

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

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

0

Вы можете сохранить данные формы, если они не большие, в $_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.... 
+1

На пользовательском веб-сайте PHP ваш метод будет работать. Но у Drupal есть собственный API для обработки форм. На самом деле это больше вопрос Drupal, чем вопрос проверки PHP или даже формы. – Icode4food

+0

Быстрое сканирование документа API, в котором упоминается массив $ form_state ['values'], который, как я думаю, представляет собой все ваши отфильтрованные значения формы, но вы правы, на первый взгляд это не похоже на разбор чего-либо, кроме $ _POST. Почему бы не сохранить $ form_state в сеансе, а затем притвориться, что форма была проверена и перезаписать $ form_state с значениями сеанса – gawpertron

Смежные вопросы