it-swarm.asia

لماذا تأخرت رسائلي $ عن تحديث صفحة واحدة؟

لدي صفحة ذات قالب بسيط للغاية:

<!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. تظهر رسائل الخطأ الخاصة بي - "حقل عنوان البريد الإلكتروني مطلوب" ، "اسم المسؤول مأخوذ بالفعل".

يحدث هذا لـ جميع النماذج التي اختبرتها حتى الآن ، وليس فقط نموذج التسجيل.

لماذا يحدث هذا؟ ما الذي يمكنني فعله لإصلاحه بحيث تظهر رسائل الخطأ في المرة الأولى؟

يسعدني أن أفعل كل ما أحتاج إليه لتصحيح هذا الخطأ ، لكني أحتاج إلى بعض الاتجاه لبدء البحث. :)

10
George

على الأرجح المشكلة هي أنك تتصل بالنموذج عندما تم إنشاء الرسائل بالفعل ، وهذا هو سبب عدم ظهورها. تحتاج إلى استدعاء النموذج ، في وقت سابق من عملية إنشاء الصفحة أو الحصول على الرسائل ، باستخدام drupal_get_messages.

ما يجب عليك فعله حقًا هو إنشاء هذه الوظيفة في وحدة نمطية وموضوع الصفحة بدلاً من القيام بذلك في موضوعك. من المحتمل أن تصادف العديد من المشاكل مثل هذا.

4
googletorp

قمنا بحل مشكلة التحقق من صحة النموذج ، (يحدث التحقق من صحة النموذج بعد تقديم الرسائل ، والظهور في الطلب التالي) ، من خلال ..

فرض التحقق من صحة النموذج في 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

عانيت أيضا من هذه المشكلة. ساعدني إجابة 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
    }
?>

ثم قم بطباعة محتوى النموذج المقدم في القسم المناسب وحلها :).

2
sumanchalki

ليس حلًا مباشرًا للسؤال المطروح ، ولكني صادفت هذا عندما كنت أواجه نفس المشكلة:

إذا تم استدعاء كتلة النموذج مباشرة من ملف tpl.php (ربما لأسباب تتعلق بالتخطيط) ، فستتلقى رسائل متأخرة.

بمعنى آخر. كنت أقوم بتحميل كتلة مع الكود التالي في ملف القالب الخاص بي:

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

ثم جعله في ملف tpl.php الخاص بي.

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