Errore "Il modulo è diventato obsoleto"


12

Ho un modulo a più fasi. A metà del modulo tramite una finestra di dialogo popup, all'utente viene richiesto di accedere se non ha effettuato l'accesso in precedenza.

Dopo aver effettuato correttamente l'accesso quando si procede con la pagina successiva del modulo nodo, viene visualizzato questo errore di convalida:

Il modulo è diventato obsoleto. Copia eventuali lavori non salvati nel modulo sottostante e quindi ricarica questa pagina.

Capisco che è perché drupal_validation_form()verifica $form['#token']e $form_state['values']['form_token']sono gli stessi.

Come posso evitarlo, in quanto si tratta di un caso d'uso speciale (e non è falso da alcuni elementi esterni).

Qualche input su questo fronte?


1
Forse è troppo tardi per rispondere, ma ho incoraggiato lo stesso problema. Ho riscontrato un problema con $ form ["# token"] = drupal_get_token ($ form ['# form_id']); quando preparo il mio modulo $.

1
In realtà stavo codificando un modulo in una pagina e avevo bisogno di aggiungere il token. Aggiungendo <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>il modulo è stato possibile inviare correttamente.
terzo

Risposte:


2

Il tuo post mi ha appena salvato da gravi sofferenze. Non so come sia stata stabilita la connessione, ma il tuo post mi ha portato a una piccola modifica nel mio codice del modulo. Facile capire perché l'errore "Il modulo è diventato obsoleto" si stava verificando ora. Quindi vedi se questo potrebbe correre i tuoi pensieri e aiutare per il tuo caso.

La mia pagina admin / mymod aveva una voce di menu impostata che includeva quanto segue.

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

In mymod_main($op = '')Condizionalmente sto costruendo una delle 2 forme, ma ogni build è ovviamente una nuova forma, ad esempio $build['mymod_admin'] = drupal_get_form('mymod_admin')o $build['mymod_delete'] = drupal_get_form('mymod_delete').

Nessun problema quando la pagina admin / mymod è stata caricata per la prima volta e viene chiamato mymod_admin. Ma quando si fa clic sul pulsante di invio creato in mymod_admin, viene chiamato mymod_delete e viene creato il modulo. Arriva l'errore "Il modulo è diventato obsoleto" che ha rovinato l'elaborazione del modulo. La correzione è semplicemente da utilizzare mymod_main()come callback della pagina.

Ora non è possibile incrociare i moduli quando la pagina admin / mymod viene ricaricata per ciascuno dei moduli in quanto non esiste un modulo iniziale dal callback del manu e quindi il secondo modulo definito in $build.


Puoi spiegare la tua 'correzione', penso di avere lo stesso problema ma non capisco cosa intendi con '---' e '+++', grazie
iain maitland

Significa che il callback della pagina è stato cambiato in mymod_main().
kiamlaluno

0

L'errore indica che i form_tokenbisogni non sono validi e devono essere rigenerati. Questo è fondamentalmente un campo modulo nascosto (generalmente usato per proteggere dai falsi tra siti).

Normalmente un elemento token viene automaticamente aggiunto a ciascun modulo Drupal da drupal_prepare_form(), quindi generalmente non devi aggiungerne uno tu stesso, a meno che tu non stia scrivendo il tuo codice.

Se stai cercando di programmare un modulo multipagina, probabilmente dovrai rigenerare il token su ogni invio usando drupal_get_token(), ad esempio come mostrato qui :

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

Per quanto riguarda la soluzione alternativa per forzare la rigenerazione del token del modulo in form_alter, controllare il seguente esempio:

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

Risoluzione dei problemi

  • Controlla se il tuo modulo non è hardcoded, altrimenti aggiungi il token come suggerito da @thirdender :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Controlla se l'errore si verifica sul tuo modulo, come potrebbe accadere su un altro modulo (ad es. Modulo all'interno del modulo).

  • Debug drupal_valid_token().
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.