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.
Cela se produit pour tous les formulaires que j'ai testés jusqu'à présent, pas seulement 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. :)
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.
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');
}
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 :).
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. 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 ?>