Aparece el error "El formulario ha quedado desactualizado"

12

Tengo un formulario de nodo de varios pasos. A la mitad del formulario a través de un cuadro de diálogo emergente, se le pide al usuario que inicie sesión si no ha iniciado sesión anteriormente.

Al iniciar sesión correctamente al continuar con la página siguiente del formulario de nodo, aparece este error de validación:

El formulario se ha quedado obsoleto. Copie cualquier trabajo no guardado en el siguiente formulario y luego vuelva a cargar esta página.

Entiendo que es porque drupal_validation_form()verifica $form['#token']y $form_state['values']['form_token']son lo mismo.

¿Cómo evito esto, ya que este es un caso de uso especial (y no es falsificación de algunos elementos externos)?

¿Alguna entrada en este frente?

búsqueda
fuente
1
Tal vez sea demasiado tarde para responder, pero he alentado el mismo problema. He encontrado un problema con $ form ["# token"] = drupal_get_token ($ form ['# form_id']); cuando preparo mi formulario $.
1
En realidad estaba codificando un formulario en una página y necesitaba agregar el token. Al agregar <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>el formulario se pudo enviar correctamente.
Thirdender

Respuestas:

2

Tu publicación me salvó de la miseria grave. No sé cómo se hizo esa conexión, pero su publicación me llevó a un pequeño cambio en el código de mi módulo. Sin embargo, ahora es fácil de entender por qué el error "El formulario se ha quedado obsoleto". Así que vea si esto podría estimular sus pensamientos y ayudarlo en su caso.

Mi página admin / mymod tenía un elemento de menú configurado que incluía lo siguiente.

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

En mymod_main($op = '')Estoy construyendo condicionalmente una de 2 formas, pero cada construcción es, por supuesto, una nueva forma, por ejemplo, $build['mymod_admin'] = drupal_get_form('mymod_admin')o $build['mymod_delete'] = drupal_get_form('mymod_delete').

No hay problema cuando la página admin / mymod se cargó por primera vez y se llama a mymod_admin. Pero cuando se hace clic en el botón Enviar creado en mymod_admin, se llama a mymod_delete y se crea su formulario. Llega el error "El formulario ha quedado obsoleto" que arruinó el procesamiento del formulario. La solución es simplemente usar mymod_main()como devolución de llamada de página.

Ahora no hay cruce de formularios cuando la página admin / mymod se recarga para cada uno de los formularios, ya que no hay un formulario inicial desde la devolución de llamada del manual y luego el segundo formulario definido en $build.

Randy Skretka
fuente
¿Puede explicar su 'arreglo', creo que tengo el mismo problema, pero no entiendo lo que quiere decir con '---' y '+++', gracias
Iain Maitland
Significa que la devolución de llamada de la página se cambió para ser mymod_main().
kiamlaluno
0

El error significa que las form_tokennecesidades no son válidas y deben regenerarse. Esto es básicamente un campo de formulario oculto (generalmente usado para proteger contra falsificaciones entre sitios).

Normalmente, un elemento de token se agrega automáticamente a cada formulario de Drupal drupal_prepare_form(), por lo que generalmente no tiene que agregar uno usted mismo, a menos que esté escribiendo su propio código.

Si está intentando programar algún formulario de varias páginas, probablemente necesite volver a generar el token en cada envío utilizando drupal_get_token(), por ejemplo, como se muestra aquí :

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

En cuanto a la solución para forzar la regeneración del token de formulario en form_alter, verifique el siguiente ejemplo:

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

Solución de problemas

  • Vuelva a verificar si su formulario no está codificado; de lo contrario, agregue el token como lo sugiere @thirdender :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Compruebe si el error ocurre en su formulario, como podría ocurrir en otro formulario (por ejemplo, formulario dentro del formulario).

  • Depuración drupal_valid_token().
kenorb
fuente