Warum verzögern sich meine $ -Nachrichten um eine Seitenaktualisierung?

10

Ich habe eine Seite mit einer sehr einfachen Vorlage:

<!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>

Grundsätzlich wird das Registrierungsformular und sonst nichts angezeigt.

  1. Ich gebe einige schlechte Daten in das Formular ein - einen bereits verwendeten Benutzernamen (admin) und keine E-Mail-Adresse.
  2. Ich klicke auf "Neues Konto erstellen".
  3. Die Seite scheint zu senden und neu zu laden, aber es ist nichts passiert - es werden keine Fehlermeldungen angezeigt .
  4. Ich aktualisiere die Seite (F5).
  5. Firefox zeigt an, "um diese Seite anzuzeigen, muss Firefox Informationen senden, die alle zuvor ausgeführten Aktionen wiederholen" - damit ich weiß, dass mein POST zuvor durchlaufen wurde.
  6. Ich klicke in diesem Dialogfenster auf "Erneut senden".
  7. Meine Fehlermeldungen werden angezeigt - "E-Mail-Adressfeld ist erforderlich", "Der Name admin ist bereits vergeben".

Dies gilt für alle Formulare, die ich bisher getestet habe, nicht nur für das Registrierungsformular.

Warum passiert dies? Was kann ich tun, um das Problem zu beheben, damit die Fehlermeldungen beim ersten Mal angezeigt werden?

Ich bin glücklich, alles zu tun, was ich brauche, um dies zu debuggen, aber ich brauche eine Richtung, um nachzuschauen. :)

George
quelle

Antworten:

4

Das Problem ist höchstwahrscheinlich, dass Sie das Formular aufrufen, wenn die Nachrichten bereits erstellt wurden, weshalb sie nicht angezeigt werden. Sie müssen das Formular früher im Erstellungsprozess der Seite aufrufen oder die Nachrichten mit drupal_get_messages abrufen.

Was Sie wirklich tun sollten, ist, diese Funktionalität in einem Modul zu erstellen und die Seite zu thematisieren, anstatt dies in Ihrem Thema zu tun. Sie könnten möglicherweise auf viele weitere Probleme wie dieses stoßen.

googletorp
quelle
OK, ich glaube, ich hätte das endlich behoben. Ich habe ein Modul namens 'my_register_form' geschrieben, das nichts anderes tut, als drupal_get_form('user_register')in das zurückzukehren $block['content']. Ich füge dieses Modul über den Kontext hinzu und dann werden die Registrierungsfehlermeldungen nach dem Absenden korrekt angezeigt. Es scheint zu kompliziert, aber es funktioniert und ich kann die Anmelde- / Registrierungsformulare so einfügen, wie ich sie haben möchte. Vielen Dank für Ihre Hilfe.
George
3

Wir haben das Problem der Formularüberprüfung (Formularüberprüfung erfolgt nach dem Rendern der Nachrichten und wird bei der nächsten Anforderung angezeigt) durch ... gelöst.

Erzwingen der Formularüberprüfung in 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
quelle
2

Ich habe auch unter diesem Problem gelitten. Die Antwort von @ googletorp hat mir geholfen, das Problem zu lösen.

Am Anfang der Seite tpl. Holen Sie sich den gerenderten Inhalt von Formularen, dh für meinen Fall:

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

Rufen Sie dann im Abschnitt zum Drucken von Nachrichten die Nachrichten ab, die drupal_get_messages () auf der Seite tpl aufrufen. $ messages kann die Nachrichten ohne eine weitere Seitenaktualisierung immer noch nicht abrufen.

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

Dann drucke den gerenderten Formularinhalt im richtigen Bereich und es wurde gelöst :).

Sumanchalki
quelle
1

Keine direkte Lösung für die gestellte Frage, aber ich bin darauf gestoßen, als ich das gleiche Problem hatte:

Wenn Ihr Formularblock direkt aus der Datei tpl.php aufgerufen wird (möglicherweise aus Layoutgründen), erhalten Sie verzögerte Nachrichten.

Dh ich habe einen Block mit dem folgenden Code in meine Vorlagendatei geladen:

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

Und dann in meiner tpl.php-Datei rendern.

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