เหตุใดข้อความ $ ของฉันจึงล่าช้าหนึ่งหน้ารีเฟรช


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

สิ่งที่คุณควรทำคือการสร้างฟังก์ชั่นนี้ในโมดูลและธีมหน้าแทนการทำสิ่งนี้ในธีมของคุณ คุณอาจพบปัญหาอื่น ๆ อีกมากมายเช่นนี้


ตกลงฉันคิดว่าในที่สุดฉันก็อาจจะแก้ไขได้ ผมเคยเขียนโมดูลที่เรียกว่า '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 ช่วยให้ฉันแก้ปัญหาได้

ที่จุดเริ่มต้นของหน้า 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 ข้อความ $ ยังคงไม่สามารถดึงข้อความโดยไม่ต้องรีเฟรชหน้าอื่น

<?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 ?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.