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


10

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ác hình thức tôi đã thử nghiệm cho đến nay, không chỉ là 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. :)

Câu trả lời:


4

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.


OK, tôi nghĩ rằng cuối cùng tôi có thể đã sửa cái này. Tôi đã viết một module gọi là 'my_register_form' mà không làm gì nhưng trở lại drupal_get_form('user_register')trong $block['content']. Tôi bao gồm mô-đun đó qua ngữ cảnh và sau đó các thông báo lỗi đăng ký hiển thị chính xác sau khi gửi. Nó có vẻ quá phức tạp nhưng nó hoạt động và nó cho phép tôi bao gồm các hình thức đăng nhập / đăng ký như thế nào tôi muốn chúng. Cảm ơn rất nhiều vì sự giúp đỡ của bạn.
George

3

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');
}

2

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 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 :).


1

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.

Tức là tôi đã tải một khối với mã sau 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 ?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.