¿Por qué mis $ mensajes retrasan la actualización de una página?

10

Tengo una página con una plantilla muy simple:

<!DOCTYPE html>
<html>
<head><title>TEST REGISTRATION PAGE</title></head>
<body>
    <?php 
        print drupal_get_form('user_register');
        print $messages;
        print $closure;
        print $main_content;
    ?>
</body></html>

Básicamente, muestra el formulario de registro y nada más.

  1. Ingreso algunos datos incorrectos en el formulario: un nombre de usuario ya utilizado (administrador) y ninguna dirección de correo electrónico.
  2. Hago clic en "crear nueva cuenta".
  3. La página parece enviarse y recargarse, pero no ha sucedido nada, no se muestran mensajes de error .
  4. Actualizo la página (F5).
  5. Firefox muestra "para mostrar esta página, Firefox debe enviar información que repita cualquier acción que se haya realizado anteriormente", por lo que sé que mi POST se realizó anteriormente.
  6. Hago clic en "reenviar" en esa ventana de diálogo.
  7. Aparecen mis mensajes de error: "el campo de dirección de correo electrónico es obligatorio", "el nombre admin ya está en uso".

Esto ocurre para todos los formularios que he probado hasta ahora, no solo el formulario de registro.

¿Por qué está pasando esto? ¿Qué puedo hacer para solucionarlo y que los mensajes de error aparezcan por primera vez?

Estoy feliz de hacer lo que sea necesario para depurar esto, pero necesito alguna dirección para comenzar a buscar. :)

Jorge
fuente

Respuestas:

4

Lo más probable es que el problema sea que está llamando al formulario cuando los mensajes ya se han creado, por lo que no aparecen. Debe llamar al formulario, antes en el proceso de creación de la página u obtener los mensajes, con drupal_get_messages.

Lo que realmente debería hacer es crear esta funcionalidad en un módulo y crear un tema en la página, en lugar de hacerlo en su tema. Potencialmente podría encontrarse con muchos más problemas como este.

googletorp
fuente
OK, creo que finalmente podría haber solucionado esto. He escrito un módulo llamado 'my_register_form' que no hace nada más que regresar drupal_get_form('user_register')en el $block['content']. Incluyo ese módulo a través del contexto y luego los mensajes de error de registro se muestran correctamente después del envío. Parece demasiado complicado, pero funciona y me permite incluir los formularios de inicio de sesión / registro como los quiero. Muchas gracias por tu ayuda.
George
3

Resolvimos el problema de validación del formulario (la validación del formulario ocurre después de que los mensajes se han procesado y se muestran en la siguiente solicitud), por ...

forzando la validación del formulario en hook_node_view

/**
 * This is a fix for a bug where the validation error messages lag a 
 * full request behind form submissions
 */
function your_module_node_view($node, $view_mode){
  // check that form id is the form you want
  if ( !isset( $_POST['form_id'] ) || $_POST['form_id'] != 'your_form_id' ){
    return;
  }
  // this forces validation of the form 
  drupal_get_form('your_form_id');
}
chim
fuente
2

También sufrí de este problema. La respuesta de @ googletorp me ayudó a resolverlo.

Al comienzo de la página tpl. Obtener el contenido procesado de los formularios, es decir, para mi caso:

$register_form = drupal_get_form('user_register_form');
$register_form_content = render($register_form);

$form_user_pass = drupal_get_form('user_pass');
$form_user_pass_content = drupal_render($form_user_pass);

$login_form = drupal_get_form('user_login_block');
$login_form_content = render($login_form);

Luego, en la sección de impresión de mensajes, obtenga los mensajes llamando a drupal_get_messages () en la página tpl. $ messages todavía no puede recuperar los mensajes sin otra actualización de la página.

<?php 
    $messages = drupal_get_messages('error');
    if(is_array($messages['error']) && count($messages['error'])) {
?>
    <div id="messages">
        <div class="section clearfix">
            <div class="messages error">
                <ul>
                    <?php 
                    foreach($messages['error'] as $item) {
                        echo '<li>'.$item.'</li>';
                    }
                    ?>
                </ul>
            </div>
        </div>
    </div>
<?php
    }
?>

Luego imprima el contenido del formulario representado en la sección adecuada y se resolvió :).

sumanchalki
fuente
1

No es una solución directa para la pregunta formulada, pero me encontré con esto cuando tenía el mismo problema:

Si su bloque de formulario se llama directamente desde el archivo tpl.php (quizás por razones de diseño), recibirá mensajes retrasados.

Es decir, estaba cargando un bloque con el siguiente código en mi archivo de plantilla:

$vars['contact_details'] = module_invoke('viewusercontact', 'block_view', 0);

Y luego renderizándolo en mi archivo tpl.php.

<?php print render $contact_details ?>
Dominic Woodman
fuente