Dlaczego moje $ wiadomości opóźniają odświeżenie jednej strony?

10

Mam stronę z bardzo prostym szablonem:

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

Zasadniczo wyświetla formularz rejestracyjny i nic więcej.

  1. W formularzu wpisuję złe dane - już użytą nazwę użytkownika (admin) i brak adresu e-mail.
  2. Klikam „utwórz nowe konto”.
  3. Strona wydaje się przesyłać i ładować ponownie, ale nic się nie wydarzyło - nie wyświetla się żaden komunikat o błędzie .
  4. Odświeżam stronę (F5).
  5. Firefox wyświetla „aby wyświetlić tę stronę, Firefox musi wysłać informacje, które powtórzą wcześniejszą akcję” - więc wiem, że mój test POST przeszedł wcześniej.
  6. Klikam „wyślij ponownie” w tym oknie dialogowym.
  7. Pojawiają się moje komunikaty o błędach - „pole adresu e-mail jest wymagane”, „nazwa administratora jest już zajęta”.

Dzieje się tak w przypadku wszystkich formularzy, które do tej pory testowałem, a nie tylko formularza rejestracyjnego.

Dlaczego to się dzieje? Co mogę zrobić, aby to naprawić, aby komunikaty o błędach były wyświetlane po raz pierwszy?

Cieszę się, że mogę zrobić wszystko, co trzeba, aby to debugować, ale potrzebuję jakiegoś kierunku, aby zacząć szukać. :)

Jerzy
źródło

Odpowiedzi:

4

Najprawdopodobniej problem polega na tym, że wywołujesz formularz, gdy wiadomości zostały już utworzone, i dlatego się nie pojawiają. Musisz zadzwonić do formularza, wcześniej w trakcie budowy strony lub otrzymać wiadomości, za pomocą drupal_get_messages.

Naprawdę powinieneś to zrobić, tworząc tę ​​funkcję w module i motywując stronę, zamiast robić to w swoim motywie. Możesz potencjalnie napotkać o wiele więcej takich problemów.

googletorp
źródło
OK, myślę, że w końcu mogłem to naprawić. Napisałem moduł o nazwie „my_register_form”, który robi tylko powrót drupal_get_form('user_register')w $block['content']. Dołączam ten moduł przez kontekst, a następnie komunikaty o błędach rejestracji pojawiają się poprawnie po przesłaniu. Wydaje się to zbyt skomplikowane, ale działa i pozwala mi dołączyć formularze logowania / rejestracji, jak chcę. Wielkie dzięki za pomoc.
George
3

Rozwiązaliśmy problem sprawdzania poprawności formularza (sprawdzanie poprawności formularza następuje po wyrenderowaniu wiadomości i pojawia się przy następnym żądaniu) przez ...

wymuszanie sprawdzania poprawności formularza w 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
źródło
2

Cierpiałam również na ten problem. Odpowiedź @ googletorp pomogła mi go rozwiązać.

Na początku strony tpl. Uzyskaj renderowaną treść formularzy, tj. W moim przypadku:

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

Następnie w sekcji drukowania wiadomości pobierz wiadomości wywołujące drupal_get_messages () na stronie tpl. $ messages nadal nie może pobrać wiadomości bez odświeżenia strony.

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

Następnie wydrukuj renderowaną treść formularza w odpowiedniej sekcji i to rozwiązało :).

sumanchalki
źródło
1

Nie bezpośrednio rozwiązanie zadanego pytania, ale natknąłem się na to, gdy miałem ten sam problem:

Jeśli twój blok formularza jest wywoływany bezpośrednio z pliku tpl.php (być może z powodów układu), otrzymasz opóźnione wiadomości.

To znaczy ładowałem blok z następującym kodem w moim pliku szablonu:

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

A następnie renderowanie w moim pliku tpl.php.

<?php print render $contact_details ?>
Dominic Woodman
źródło