Fehler beim Abrufen von "Das Formular ist veraltet"

12

Ich habe eine mehrstufige Knotenform. Auf halbem Weg durch das Formular durch ein Popup-Dialogfeld wird der Benutzer aufgefordert, sich anzumelden, wenn er sich nicht zuvor angemeldet hat.

Bei erfolgreicher Anmeldung erhalte ich beim Fortfahren mit der nächsten Seite des Knotenformulars den folgenden Überprüfungsfehler:

Das Formular ist veraltet. Kopieren Sie alle nicht gespeicherten Arbeiten in das unten stehende Formular und laden Sie diese Seite erneut.

Ich verstehe, es liegt daran, dass es drupal_validation_form()überprüft $form['#token']und $form_state['values']['form_token']dasselbe ist.

Wie vermeide ich das, da dies ein spezieller Anwendungsfall ist (und nicht durch einige externe Dinge gefälscht wird).

Irgendwelche Eingaben an dieser Front?

Suche
quelle
1
Vielleicht ist es zu spät für eine Antwort, aber ich habe das gleiche Problem angeregt. Ich habe ein Problem mit $ form ["# token"] = drupal_get_token ($ form ['# form_id']) gefunden. wenn ich mein $ form vorbereite.
1
Ich habe tatsächlich ein Formular fest in eine Seite codiert und musste das Token hinzufügen. Durch das Hinzufügen <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>des Formulars konnte ordnungsgemäß eingereicht werden.
Thirdender

Antworten:

2

Ihr Beitrag hat mich gerade vor ernstem Elend bewahrt. Ich weiß nicht genau, wie diese Verbindung hergestellt wurde, aber Ihr Beitrag hat mich zu einer kleinen Änderung in meinem Modulcode geführt. Es ist jedoch leicht zu verstehen, warum der Fehler "Das Formular ist veraltet" jetzt auftrat. So sehen Sie, ob dies Ihre Gedanken und Hilfe für Ihren Fall joggen könnte.

Auf meiner Seite admin / mymod wurde ein Menüpunkt eingerichtet, der Folgendes enthielt.

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

In mymod_main($op = '')baue ich bedingt eine von 2 Formen, aber jede Form ist natürlich eine neue Form, zB $build['mymod_admin'] = drupal_get_form('mymod_admin')oder $build['mymod_delete'] = drupal_get_form('mymod_delete').

Kein Problem, wenn die Seite admin / mymod zum ersten Mal geladen und mymod_admin aufgerufen wird. Wenn Sie jedoch auf die in mymod_admin erstellte Senden-Schaltfläche klicken, wird mymod_delete aufgerufen und das Formular erstellt. Es kommt der Fehler "Das Formular ist veraltet", der die Formularverarbeitung ruiniert hat. Das Update ist einfach mymod_main()als Seitenrückruf zu verwenden.

Jetzt gibt es kein Vertauschen von Formularen, wenn die Admin / MyMod-Seite für jedes der Formulare neu geladen wird, da es kein Startformular vom manuellen Rückruf und dann das zweite in definierte Formular gibt $build.

Randy Skretka
quelle
Können Sie uns Ihr Problem erklären
?
Dies bedeutet, dass der Seitenrückruf geändert wurde mymod_main().
kiamlaluno
0

Der Fehler bedeutet, dass form_tokenneeds ungültig ist und neu generiert werden muss. Dies ist im Grunde ein verstecktes Formularfeld (das im Allgemeinen zum Schutz vor Fälschungen zwischen Standorten verwendet wird).

Normalerweise wird jedem Drupal-Formular von automatisch ein Token-Element hinzugefügt drupal_prepare_form(), sodass Sie im Allgemeinen kein Token selbst hinzufügen müssen, es sei denn, Sie schreiben Ihren eigenen Code.

Wenn Sie versuchen, ein mehrseitiges Formular zu programmieren, müssen Sie das Token wahrscheinlich bei jeder Übermittlung mit neu generieren drupal_get_token() , z. B. wie hier gezeigt :

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

Überprüfen Sie das folgende Beispiel, um die Wiederherstellung des Formulartokens in form_alter zu erzwingen:

/**
 * 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'),
      );
    }
}

Fehlerbehebung

  • Überprüfen Sie noch einmal, ob Ihr Formular nicht fest codiert ist, oder fügen Sie das Token wie von vorgeschlagen hinzu @thirdender hinzu :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Überprüfen Sie, ob der Fehler in Ihrem Formular auftritt, wie dies auch in einem anderen Formular (z. B. Formular innerhalb des Formulars) der Fall ist.

  • Debuggen drupal_valid_token().
Kenorb
quelle