Mengapa $ message saya menunda satu halaman refresh?

10

Saya memiliki halaman dengan templat yang sangat sederhana:

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

Pada dasarnya, ini menampilkan formulir pendaftaran dan tidak ada yang lain.

  1. Saya memasukkan beberapa data buruk pada formulir - nama pengguna (admin) yang sudah digunakan, dan tidak ada alamat email.
  2. Saya klik "buat akun baru".
  3. Halaman tersebut tampaknya mengirimkan dan memuat ulang, tetapi tidak ada yang terjadi - tidak ada pesan kesalahan yang ditampilkan .
  4. Saya menyegarkan halaman (F5).
  5. Tampilan Firefox "untuk menampilkan halaman ini, Firefox harus mengirim informasi yang akan mengulangi tindakan apa pun yang dilakukan sebelumnya" - jadi saya tahu bahwa POST saya telah melewati sebelumnya.
  6. Saya klik "kirim ulang" di jendela dialog itu.
  7. Pesan kesalahan saya muncul - "bidang alamat email diperlukan", "nama admin sudah diambil".

Ini terjadi untuk semua formulir yang telah saya uji sejauh ini, bukan hanya formulir pendaftaran.

Mengapa ini terjadi? Apa yang bisa saya lakukan untuk memperbaikinya sehingga pesan kesalahan ditampilkan pertama kali?

Saya senang melakukan apa pun yang saya perlu lakukan debug ini, tapi saya perlu arahan untuk mulai mencari. :)

George
sumber

Jawaban:

4

Kemungkinan besar masalahnya adalah Anda memanggil formulir ketika pesan sudah dibuat, itulah sebabnya mereka tidak muncul. Anda perlu memanggil formulir, sebelumnya dalam proses membangun halaman atau mendapatkan pesan, dengan drupal_get_messages.

Apa yang benar-benar harus Anda lakukan adalah membuat fungsi ini dalam sebuah modul dan tema halaman sebagai gantinya, melakukan hal ini dalam tema Anda. Anda berpotensi mengalami lebih banyak masalah seperti ini.

googletorp
sumber
OK, saya pikir saya akhirnya bisa memperbaikinya. Saya telah menulis sebuah modul yang disebut 'my_register_form' yang tidak melakukan apa-apa selain mengembalikan drupal_get_form('user_register')di $block['content']. Saya menyertakan modul itu melalui konteks dan kemudian pesan kesalahan registrasi muncul dengan benar setelah pengiriman. Tampaknya terlalu rumit tetapi berfungsi dan saya bisa memasukkan form login / register seperti yang saya inginkan. Terima kasih banyak atas bantuan Anda.
George
3

Kami memecahkan masalah validasi formulir, (validasi formulir terjadi setelah pesan diberikan, dan muncul pada permintaan berikutnya), oleh ..

memaksa validasi formulir di 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');
}
chim
sumber
2

Saya juga menderita masalah ini. Jawaban @ googletorp membantu saya menyelesaikannya.

Di awal halaman tpl. Dapatkan konten formulir yang diberikan yaitu untuk kasus saya:

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

Kemudian di bagian cetak pesan, dapatkan pesan yang memanggil drupal_get_messages () di halaman tpl. $ messages masih tidak dapat mengambil pesan tanpa penyegaran halaman lain.

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

Kemudian cetak konten formulir yang diberikan di bagian yang tepat dan dipecahkan :).

sumanchalki
sumber
1

Bukan secara langsung solusi untuk pertanyaan yang diajukan, tetapi saya menemukan ini ketika saya mengalami masalah yang sama:

Jika blok formulir Anda dipanggil langsung dari file tpl.php (mungkin karena alasan tata letak), maka Anda akan menerima pesan yang tertunda.

Yaitu saya sedang memuat blok dengan kode berikut dalam file templat saya:

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

Dan kemudian merendernya di file tpl.php saya.

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