「フォームが古くなっています」エラーを取得する


12

マルチステップノードフォームがあります。フォームの途中でポップアップダイアログを使用する場合、ユーザーが以前にログインしていない場合はログインするよう求められます。

ノードフォームの次のページに進むときにログインに成功すると、次の検証エラーが発生します。

フォームは古くなっています。未保存の作業を以下のフォームにコピーしてから、このページを再読み込みしてください。

私はそれがdrupal_validation_form()検証$form['#token']$form_state['values']['form_token']同じだからだと理解しています。

これは特別なユースケースであるため、これをどのように回避しますか(そして、それはいくつかの外部のものによる偽造ではありません)。

この前面に何か入力はありますか?


1
多分答えるには手遅れですが、私は同じ問題を奨励しました。$ form ["#token"] = drupal_get_token($ form ['#form_id']);で問題が見つかりました。$ formを準備するとき。

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()ページのコールバックとして使用することです。

現在、manuコールバックからの開始フォームと、で定義されている2番目のフォームがないため、各フォームのadmin / mymodページがリロードされるときに、フォームのクロスアップはありません$build


あなたの「修正」は、私は同じ問題を持っていると思うが、私はあなたが「---」と意味を理解していない説明し、「+++」、あなたに感謝することができます
イアン・メイトランド

ページコールバックがに変更されたことを意味しますmymod_main()
キアムルノ

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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.