Почему мои $ сообщения задерживаются на одну страницу обновления?

10

У меня есть страница с очень простым шаблоном:

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

По сути, он отображает регистрационную форму и больше ничего.

  1. Я ввожу в форму некоторые неверные данные - уже использованное имя пользователя (admin), а не адрес электронной почты.
  2. Я нажимаю «создать новую учетную запись».
  3. Кажется, что страница отправляется и перезагружается, но ничего не произошло - сообщения об ошибках не отображаются .
  4. Я обновляю страницу (F5).
  5. Firefox отображает «чтобы отобразить эту страницу, Firefox должен отправить информацию, которая будет повторять любое действие, которое было выполнено ранее» - так что я знаю, что мой POST прошел ранее.
  6. Я нажимаю «повторно» в этом диалоговом окне.
  7. Появляются мои сообщения об ошибках - «поле адреса электронной почты обязательно», «имя администратора уже занято».

Это происходит для всех форм, которые я тестировал до сих пор, а не только для регистрационной формы.

Почему это происходит? Что я могу сделать, чтобы исправить это, чтобы сообщения об ошибках отображались в первый раз?

Я счастлив сделать все, что мне нужно для отладки, но мне нужно какое-то направление, чтобы начать поиск. :)

Джордж
источник

Ответы:

4

Скорее всего, проблема в том, что вы вызываете форму, когда сообщения уже созданы, поэтому они не появляются. Вам нужно вызвать форму, ранее в процессе создания страницы или получить сообщения, с drupal_get_messages.

То, что вы действительно должны сделать, это создать эту функциональность в модуле и вместо темы создать страницу, а не делать это в своей теме. Вы могли бы потенциально столкнуться со многими другими проблемами, как эта.

googletorp
источник
Хорошо, я думаю, что наконец-то мог это исправить. Я написал модуль my_register_form, который ничего не делает, но возвращает drupal_get_form('user_register')в $block['content']. Я включаю этот модуль через контекст, и после отправки сообщения об ошибках регистрации отображаются правильно. Это кажется слишком сложным, но это работает, и это позволяет мне включать формы входа / регистрации, как я хочу их. Спасибо огромное за вашу помощь.
Джордж
3

Мы решили проблему проверки формы (проверка формы происходит после того, как сообщения были обработаны и отображаются при следующем запросе), ..

форсирование проверки формы в 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');
}
Хим
источник
2

Я тоже страдал от этой проблемы. Ответ @ googletorp помог мне решить эту проблему.

В начале страницы тпл. Получить визуализированный контент форм, т.е. для моего случая:

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

Затем в разделе печати сообщений получите сообщения, вызывающие drupal_get_messages () на странице tpl. $ messages по-прежнему не может получить сообщения без обновления другой страницы.

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

Затем распечатайте предоставленное содержание формы в соответствующем разделе, и это решено :).

sumanchalki
источник
1

Непосредственно решение поставленного вопроса, но я столкнулся с этим, когда у меня возникла такая же проблема:

Если ваш блок формы вызывается непосредственно из файла tpl.php (возможно, из-за разметки), вы получите отложенные сообщения.

Т.е. я загружал блок со следующим кодом в мой файл шаблона:

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

И затем рендеринг в моем файле tpl.php.

<?php print render $contact_details ?>
Доминик Вудман
источник