Pourquoi mes messages sont-ils retardés d'une actualisation d'une page?

10

J'ai une page avec un modèle très 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>

Fondamentalement, il affiche le formulaire d'inscription et rien d'autre.

  1. J'entre des données incorrectes sur le formulaire - un nom d'utilisateur déjà utilisé (admin) et aucune adresse e-mail.
  2. Je clique sur "créer un nouveau compte".
  3. La page semble se soumettre et se recharger, mais rien ne s'est produit - aucun message d'erreur ne s'affiche .
  4. Je rafraîchis la page (F5).
  5. Firefox affiche "pour afficher cette page, Firefox doit envoyer des informations qui répéteront toute action effectuée précédemment" - je sais donc que mon POST a déjà été effectué.
  6. Je clique sur «renvoyer» dans cette fenêtre de dialogue.
  7. Mes messages d'erreur apparaissent - "le champ d'adresse e-mail est obligatoire", "le nom admin est déjà pris".

Cela se produit pour tous les formulaires que j'ai testés jusqu'à présent, pas seulement pour le formulaire d'inscription.

Pourquoi cela arrive-t-il? Que puis-je faire pour le corriger afin que les messages d'erreur s'affichent pour la première fois?

Je suis heureux de faire tout ce dont j'ai besoin pour déboguer cela, mais j'ai besoin d'une direction pour commencer à chercher. :)

George
la source

Réponses:

4

Le problème est probablement que vous appelez le formulaire lorsque les messages ont déjà été créés, c'est pourquoi ils n'apparaissent pas. Vous devez appeler le formulaire, plus tôt dans le processus de création de la page ou obtenir les messages, avec drupal_get_messages.

Ce que vous devez vraiment faire, c'est de créer cette fonctionnalité dans un module et de thème la page à la place, de le faire dans votre thème. Vous pourriez potentiellement rencontrer beaucoup plus de problèmes comme celui-ci.

googletorp
la source
OK, je pense que j'aurais finalement pu résoudre ce problème. J'ai écrit un module appelé 'my_register_form' qui ne fait que retourner drupal_get_form('user_register')dans le $block['content']. J'inclus ce module via le contexte, puis les messages d'erreur d'enregistrement s'affichent correctement après la soumission. Cela semble trop compliqué mais cela fonctionne et cela me permet d'inclure les formulaires de connexion / enregistrement comme je les veux. Merci beaucoup pour votre aide.
George
3

Nous avons résolu le problème de validation du formulaire, (la validation du formulaire se produisant après le rendu des messages et apparaissant à la prochaine demande), par ..

forcer la validation du formulaire dans 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
la source
2

J'ai également souffert de ce problème. La réponse de @ googletorp m'a aidé à le résoudre.

Au début de la page tpl. Obtenez le contenu rendu des formulaires, c'est-à-dire pour mon cas:

$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);

Ensuite, dans la section d'impression des messages, récupérez les messages appelant drupal_get_messages () sur la page tpl. $ messages n'est toujours pas en mesure de récupérer les messages sans une autre actualisation de page.

<?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
    }
?>

Imprimez ensuite le contenu du formulaire rendu dans la section appropriée et il est résolu :).

sumanchalki
la source
1

Pas directement une solution à la question posée, mais je suis tombé sur ce problème lorsque j'avais le même problème:

Si votre bloc de formulaire est appelé directement à partir du fichier tpl.php (peut-être pour des raisons de disposition), vous obtiendrez des messages différés.

C'est-à-dire que je chargeais un bloc avec le code suivant dans mon fichier modèle:

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

Et puis le rendre dans mon fichier tpl.php.

<?php print render $contact_details ?>
Dominic Woodman
la source