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?
<input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
el formulario se pudo enviar correctamente.Respuestas:
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.
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
.fuente
mymod_main()
.El error significa que las
form_token
necesidades 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í :En cuanto a la solución para forzar la regeneración del token de formulario en form_alter, verifique el siguiente ejemplo:
Solución de problemas
Vuelva a verificar si su formulario no está codificado; de lo contrario, agregue el token como lo sugiere @thirdender :
Compruebe si el error ocurre en su formulario, como podría ocurrir en otro formulario (por ejemplo, formulario dentro del formulario).
drupal_valid_token()
.fuente