Получение ошибки «Форма устарела»

12

У меня есть многоэтапная форма узла. На полпути через форму через всплывающее диалоговое окно пользователю предлагается войти в систему, если он не вошел ранее.

При успешном входе в систему при переходе на следующую страницу формы узла я получаю эту ошибку проверки:

Форма устарела. Скопируйте любую несохраненную работу в форму ниже, а затем перезагрузите эту страницу.

Я так понимаю это потому что drupal_validation_form()проверяет $form['#token']и $form_state['values']['form_token']совпадает.

Как мне избежать этого, так как это особый вариант использования (и это не подделка некоторыми внешними материалами).

Любой вклад в этом фронте?

поиск
источник
1
Возможно, уже слишком поздно для ответа, но я решил ту же проблему. Я обнаружил проблему с $ form ["# token"] = drupal_get_token ($ form ['# form_id']); когда я готовлю свою форму $.
1
Я на самом деле жестко запрограммировал форму на страницу, и мне нужно было добавить токен. При добавлении <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>формы удалось отправить правильно.
Третий

Ответы:

2

Ваш пост только что спас меня от серьезных страданий. Не совсем знаю, как было установлено это соединение, но ваш пост привел меня к небольшому изменению кода моего модуля. Легко понять, почему теперь возникла ошибка «Форма устарела». Посмотрите, может ли это пробудить ваши мысли и помочь в вашем деле.

На моей странице admin / mymod был настроен пункт меню, включающий следующее.

'page callback' => 'drupal_get_form', 
'page arguments' => 'mymod_main',

В 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.

Рэнди Скретка
источник
Можете ли вы объяснить свое «исправление», я думаю, у меня та же проблема, но я не понимаю, что вы имеете в виду под «---» и «+++», спасибо
iain maitland
Это означает, что обратный вызов страницы был изменен на mymod_main().
kiamlaluno
0

Ошибка означает, что form_tokenпотребность недействительна и должна быть восстановлена. Это в основном скрытое поле формы (обычно используется для защиты от подделок между сайтами).

Обычно элемент токена автоматически добавляется в каждую форму Drupal drupal_prepare_form(), поэтому вам обычно не нужно добавлять его самостоятельно, если только вы не пишете свой собственный код.

Если вы пытаетесь запрограммировать какую-то многостраничную форму, вам, вероятно, нужно заново генерировать токен при каждой отправке, используя drupal_get_token(), например, как показано здесь :

$form_state['input']['form_token'] = drupal_get_token($form['#token']);

Что касается обхода принудительного восстановления токена формы в form_alter, проверьте следующий пример:

/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id === 'your_form_entityform_edit_form' && !empty($form_state['input']['form_id'])) {
      $form_id = $form_state['input']['form_id'];
      $form ['#token'] = $form_id;
      $form ['form_token'] = array(
        '#id' => drupal_html_id('edit-' . $form_id . '-form-token'),
        '#type' => 'token',
        '#default_value' => drupal_get_token($form['#token']),
        '#parents' => array('form_token'),
      );
    }
}

Исправление проблем

  • Дважды проверьте, не является ли ваша форма жестко запрограммированной, в противном случае добавьте токен в соответствии с предложением @thirdender :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Проверьте, есть ли ошибка в вашей форме, как и в другой форме (например, форма в форме).

  • Debug drupal_valid_token().
kenorb
источник