Помилка "Форма застаріла"


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

Твій пост просто врятував мене від серйозних бід. Не точно знаю, як це з'єднання було зроблено, але ваш пост призвів до незначної зміни мого коду модуля. Легко зрозуміти, чому помилка "Форма застаріла" сталася зараз. Тож подивіться, чи це може потішити ваші думки та допомогти у вашому випадку.

На моїй сторінці адміністратора / 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').

Немає проблем, коли вперше завантажується адміністратор / 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'); ?>'>
  • Перевірте, чи помилка трапиться у вашій формі, як це могло бути в іншій формі (наприклад, у формі у формі).

  • Налагодження drupal_valid_token().
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.