У меня есть многоэтапная форма узла. На полпути через форму через всплывающее диалоговое окно пользователю предлагается войти в систему, если он не вошел ранее.
При успешном входе в систему при переходе на следующую страницу формы узла я получаю эту ошибку проверки:
Форма устарела. Скопируйте любую несохраненную работу в форму ниже, а затем перезагрузите эту страницу.
Я так понимаю это потому что drupal_validation_form()
проверяет $form['#token']
и $form_state['values']['form_token']
совпадает.
Как мне избежать этого, так как это особый вариант использования (и это не подделка некоторыми внешними материалами).
Любой вклад в этом фронте?
<input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
формы удалось отправить правильно.Ответы:
Ваш пост только что спас меня от серьезных страданий. Не совсем знаю, как было установлено это соединение, но ваш пост привел меня к небольшому изменению кода моего модуля. Легко понять, почему теперь возникла ошибка «Форма устарела». Посмотрите, может ли это пробудить ваши мысли и помочь в вашем деле.
На моей странице admin / mymod был настроен пункт меню, включающий следующее.
В
mymod_main($op = '')
Я условно строю одну из 2 -й форм , но каждая сборка, конечно , в новой форме, например ,$build['mymod_admin'] = drupal_get_form('mymod_admin')
или$build['mymod_delete'] = drupal_get_form('mymod_delete')
.Нет проблем, когда страница admin / mymod впервые загружена и вызывается mymod_admin. Но когда нажата кнопка отправки, созданная в mymod_admin, вызывается mymod_delete и создается его форма. Появляется ошибка «Форма устарела», которая разрушает обработку формы. Исправление просто использовать в
mymod_main()
качестве обратного вызова страницы.Теперь не происходит скрещивания форм, когда страница admin / mymod перезагружается для каждой из форм, поскольку нет исходной формы из обратного вызова manu, а затем второй формы, определенной в
$build
.источник
mymod_main()
.Ошибка означает, что
form_token
потребность недействительна и должна быть восстановлена. Это в основном скрытое поле формы (обычно используется для защиты от подделок между сайтами).Обычно элемент токена автоматически добавляется в каждую форму Drupal
drupal_prepare_form()
, поэтому вам обычно не нужно добавлять его самостоятельно, если только вы не пишете свой собственный код.Если вы пытаетесь запрограммировать какую-то многостраничную форму, вам, вероятно, нужно заново генерировать токен при каждой отправке, используя
drupal_get_token()
, например, как показано здесь :Что касается обхода принудительного восстановления токена формы в form_alter, проверьте следующий пример:
Исправление проблем
Дважды проверьте, не является ли ваша форма жестко запрограммированной, в противном случае добавьте токен в соответствии с предложением @thirdender :
Проверьте, есть ли ошибка в вашей форме, как и в другой форме (например, форма в форме).
drupal_valid_token()
.источник