收到“表格已过时”错误


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'); ?>'>表格便能够正确提交。
第三方2014年

Answers:


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 2014年

这意味着页面回调已更改为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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.