it-swarm-vi.com

Tại sao tin nhắn $ của tôi bị trì hoãn làm mới một trang?

Tôi có một trang với một mẫu rất đơn giản:

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

Về cơ bản, nó hiển thị các hình thức đăng ký và không có gì khác.

  1. Tôi nhập một số dữ liệu xấu trên biểu mẫu - tên người dùng (quản trị viên) đã sử dụng và không có địa chỉ email.
  2. Tôi bấm vào "tạo tài khoản mới".
  3. Trang dường như gửi và tải lại, nhưng không có gì xảy ra - không có thông báo lỗi nào được hiển thị.
  4. Tôi làm mới trang (F5).
  5. Firefox hiển thị "để hiển thị trang này, Firefox phải gửi thông tin sẽ lặp lại bất kỳ hành động nào đã được thực hiện trước đó" - vì vậy tôi biết rằng POST của tôi đã trải qua trước đó.
  6. Tôi bấm "gửi lại" trong cửa sổ hộp thoại đó.
  7. Thông báo lỗi của tôi xuất hiện - "trường địa chỉ email là bắt buộc", "tên quản trị viên đã được sử dụng".

Điều này xảy ra cho tất cả của các biểu mẫu tôi đã kiểm tra cho đến nay, không chỉ là biểu mẫu đăng ký.

Tại sao chuyện này đang xảy ra? Tôi có thể làm gì để khắc phục nó để thông báo lỗi hiển thị lần đầu tiên?

Tôi rất vui khi làm bất cứ điều gì tôi cần để gỡ lỗi này, nhưng tôi cần một số hướng để bắt đầu tìm kiếm. :)

10
George

Vấn đề rất có thể là bạn đang gọi biểu mẫu khi các tin nhắn đã được tạo, đó là lý do tại sao chúng không xuất hiện. Bạn cần gọi biểu mẫu, trước đó trong quá trình trang được xây dựng hoặc nhận thông báo, với drupal_get_messages.

Những gì bạn thực sự nên làm là tạo chức năng này trong một mô-đun và thay đổi chủ đề trang thay vì thực hiện điều này trong chủ đề của bạn. Bạn có khả năng có thể gặp nhiều vấn đề như thế này.

4
googletorp

Chúng tôi đã giải quyết vấn đề xác thực mẫu, (xác thực mẫu xảy ra sau khi tin nhắn được hiển thị và hiển thị theo yêu cầu tiếp theo), bởi ..

buộc xác thực mẫu trong 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');
}
3
chim

Tôi cũng bị vấn đề này. Câu trả lời của @ googletorp đã giúp tôi giải quyết nó.

Ở đầu trang tpl. Lấy nội dung được hiển thị của các biểu mẫu, tức là cho trường hợp của tôi:

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

Sau đó, tại phần in tin nhắn, nhận các tin nhắn gọi drupal_get_messages () tại trang tpl. $ tin nhắn vẫn không thể tìm nạp các tin nhắn mà không làm mới trang khác.

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

Sau đó in nội dung biểu mẫu được hiển thị ở phần thích hợp và nó đã được giải quyết :).

2
sumanchalki

Không trực tiếp là một giải pháp cho câu hỏi được hỏi, nhưng tôi đã gặp phải vấn đề này khi tôi gặp vấn đề tương tự:

Nếu khối biểu mẫu của bạn được gọi trực tiếp từ tệp tpl.php (có lẽ vì lý do bố cục), thì bạn sẽ nhận được tin nhắn bị trì hoãn.

I E. Tôi đã tải một khối với mã sau đây trong tệp mẫu của mình:

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

Và sau đó kết xuất nó trong tập tin tpl.php của tôi.

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