Чому мої повідомлення $ затримуються на оновлення однієї сторінки?


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. Я ввожу у форму деякі погані дані - вже використано ім’я користувача (адміністратор), а не електронну адресу.
  2. Я натискаю "створити новий рахунок".
  3. Здається, сторінка надсилається та завантажується, але нічого не сталося - не відображаються повідомлення про помилки .
  4. Я оновлюю сторінку (F5).
  5. Firefox відображає "для відображення цієї сторінки. Firefox повинен надіслати інформацію, яка повторить будь-яку дію, яка була виконана раніше" - тому я знаю, що моя POST проходила раніше.
  6. Я натискаю "повторно" у цьому діалоговому вікні.
  7. З'являються мої повідомлення про помилку - "поле електронної пошти обов'язкове", "адміністратор імені вже прийнято".

Це трапляється для всіх перевірених нами форм, а не лише для реєстраційної форми.

Чому це відбувається? Що я можу зробити, щоб виправити це, щоб повідомлення про помилки відображалися вперше?

Я радий робити все, що мені потрібно, щоб це налагодити, але мені потрібен певний напрямок, щоб почати шукати. :)

Відповіді:


4

Найімовірніше, проблема полягає в тому, що ви телефонуєте у форму, коли повідомлення вже створені, тому вони не з’являються. Вам потрібно зателефонувати в форму, раніше в процесі створення сторінки або отримати повідомлення, з drupal_get_messages.

Що ви насправді повинні це зробити, це створити цю функціональність у модулі та замість того, щоб тематизувати сторінку, робити це у своїй темі. Ви могли потенційно зіткнутися з багатьма такими проблемами, як ця.


Гаразд, я думаю, що я, нарешті, це виправив. Я написав модуль під назвою "my_register_form", який не робить нічого, крім повернення drupal_get_form('user_register')в $block['content']. Я включаю цей модуль через контекст, а потім повідомлення про помилки реєстрації відображаються правильно після надсилання. Це здається надто складним, але воно працює, і це дозволяє мені включати форми для входу / реєстрації, як я хочу їх. Дякую купи за вашу допомогу.
Джордж

3

Проблему перевірки форми ми вирішили (перевірка форми відбувається після надання повідомлень та відображення при наступному запиті).

примушуючи перевірити форму в кук_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 допомогла мені вирішити це.

На початку сторінки tpl. Отримати виведений вміст форм, тобто для мого випадку:

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

Потім надрукуйте вміст наданої форми у відповідному розділі і це вирішено :).


1

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

Якщо ваш бланк форми викликається безпосередньо з файлу tpl.php (можливо, з міркувань), то ви отримаєте повідомлення із затримкою.

Тобто я завантажував блок із таким кодом у свій файл шаблону:

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

А потім рендерінг у моєму файлі tpl.php.

<?php print render $contact_details ?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.