web-gelistirme-sc.com

$ İletilerim neden bir sayfanın yenilenmesini geciktiriyor?

Çok basit bir şablona sahip bir sayfam var:

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

Temel olarak, kayıt formunu görüntüler ve başka hiçbir şey göstermez.

  1. Formda bazı kötü veriler giriyorum - zaten kullanılmış bir kullanıcı adı (admin) ve e-posta adresi yok.
  2. "Yeni hesap oluştur" u tıklıyorum.
  3. Sayfa gönderiliyor ve yeniden yükleniyor gibi görünüyor, ancak hiçbir şey olmadı - hiçbir hata mesajı görüntülenmiyor.
  4. Sayfayı yeniliyorum (F5).
  5. Firefox "bu sayfayı görüntülemek için, Firefox'un daha önce yapılan herhangi bir eylemi tekrarlayacak bilgileri göndermesi gerekir" - bu yüzden POST daha önce geçtiğini biliyorum.
  6. Bu iletişim penceresinde "yeniden gönder" i tıklıyorum.
  7. Hata mesajlarım görünüyor - "e-posta adresi alanı gerekli", "yönetici adı zaten alınmış".

Bu, yalnızca kayıt formunda değil, şimdiye kadar test ettiğim formların tümünde oluşur.

Bu neden oluyor? Hata mesajlarının ilk kez görüntülenmesi için düzeltmek için ne yapabilirim?

Bu hata ayıklama yapmak için ne gerekiyorsa yapmaktan mutluluk duyuyorum, ama bakmaya başlamak için bir yön gerekir. :)

10
George

Büyük olasılıkla sorun, mesajlar oluşturulduktan sonra formu çağırmanızdır, bu yüzden görünmezler. Formu drupal_get_messages ile oluşturulmuş sayfanın işleminden önce çağırmanız veya iletileri almanız gerekir.

Yapmanız gereken şey, bu işlevselliği bir modülde oluşturmak ve bunu temanızda yapmak yerine sayfada tema oluşturmaktır. Potansiyel olarak bunun gibi daha birçok problemle karşılaşabilirsiniz.

4
googletorp

Form doğrulama sorununu (mesajlar oluşturulduktan sonra gerçekleşen ve bir sonraki istekte gösterildikten sonra form doğrulama) çözdük.

hook_node_view içinde form doğrulamayı zorlama

/**
 * 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

Ben de bu problemden acı çektim. @ googletorp'ın yanıtı çözmemde bana yardımcı oldu.

Sayfanın başında tpl. Formların işlenmiş içeriğini, yani benim durumum için alın:

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

Sonra mesaj yazdırma bölümünde, tpl sayfasında drupal_get_messages () çağıran mesajları alın. $ messages, başka bir sayfa yenilemesi yapılmadan iletileri getiremiyor.

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

Sonra işlenen form içeriğini uygun bölüme yazdırın ve çözüldü :).

2
sumanchalki

Sorulan soru için doğrudan bir çözüm değil, ama aynı problemi yaşarken karşılaştım:

Form bloğunuz doğrudan tpl.php dosyasından çağrılırsa (belki de düzen nedenleriyle), gecikmiş iletiler alırsınız.

Yani Şablon dosyama aşağıdaki kodu içeren bir blok yüklüyordum:

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

Ve sonra bunu tpl.php dosyamda oluşturuyorum.

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