$ İletilerim neden bir sayfanın yenilenmesini geciktiriyor?


10

Ç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'umun 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 formu için değil, şimdiye kadar test ettiğim tüm formlar için geçerlidir.

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 bazı yönlere ihtiyacım var. :)

Yanıtlar:


4

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.


Tamam, sanırım sonunda bunu düzeltmiş olabilirim. Hiçbir şey ama geri dönüşü yok 'my_register_form' adlı bir modül yazdım drupal_get_form('user_register')içinde $block['content']. Bu modülü bağlam yoluyla dahil ediyorum ve daha sonra kayıt hata mesajları gönderildikten sonra doğru bir şekilde görüntüleniyor. Çok karmaşık görünüyor ama çalışıyor ve giriş / kayıt formlarını nasıl istediğimi eklememe izin veriyor. Yardımlarınız için teşekkürler yığınlar.
George

3

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

2

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

Sayfanın başında tpl. Benim durumum için formların işlenmiş içeriğini 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ü :).


1

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 nedeniyle), gecikmiş iletiler alırsınız.

Şablon şablonuma aşağıdaki kodla 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 ?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.