Cetak $ Messages dalam file node.tpl.php


23

Dalam Drupal 7, secara default $messagesvariabel dicetak di page.tpl.php.

Apakah ada cara untuk mencetak $messagesdalam file node.tpl.php (misal $ node-mycontenttype.tpl.php).

Hanya menempatkan <?php print $messages; ?>atau <?php print render($page['messages']); ?>tidak berhasil.

Ada tutorial di sini untuk mencetak $ messages dalam satu blok, tetapi saya ingin meletakkannya di file node.tpl.php saya.


Saya pikir theme_status_messages dipanggil sebelum template_preprocess_nodejadi drupal_get_messages kosong ketika Anda menyebutnya.
pengembang anonim

Jawaban:


30

Sebenarnya, yang ingin Anda lakukan adalah ini:

function YOURTHEME_preprocess_page(&$variables) {
  // This disables message-printing on ALL page displays
  $variables['show_messages'] = FALSE;
}

function YOURTHEME_preprocess_node(&$variables) {
  $variables['messages'] = theme('status_messages');
}

Cara kerjanya: Inti Drupal memeriksa nilai show_messages di theme_process_page. Jika itu BENAR (default) maka ia memanggil tema ('status_messages') seperti di atas, dan secara efektif mengosongkan penyimpanan pesan, jadi memanggil fungsi tema yang sama nanti hanya akan mengembalikan string kosong. Namun, jika kita menetapkan variabel itu ke FALSE, ini mencegah fungsi tema tersebut dipanggil dalam process_page, memungkinkan kita untuk mendapatkan semua pesan menggunakan fungsi tema yang sama, dalam templat pilihan kita.


1
Dan jika Anda hanya ingin ini mengambil tindakan pada halaman simpul, cukup bungkus $ variabel ['show_message'] = FALSE dengan syarat untuk melihat apakah (isset ($ variabel ['simpul'])).
areynolds

Dan Anda harus melakukan hal yang sama untuk semua halaman lain (tampilan, panel, dll)
Maria Ioannidou

8

Jawaban di Cara menampilkan pesan dari blok secara terpisah dari $ messages di page.tpl.php yang Anda rujuk dalam pertanyaan Anda adalah cara yang baik untuk melangkah. Pada dasarnya Anda membutuhkan sesuatu seperti ini di mana YOURTHEME adalah nama tema Anda dan fungsi ini harus ada di template.php Anda. Saya belum benar-benar menjalankan kode ini tetapi memiliki celah dalam hal itu.

function YOURTHEME_preprocess_node(&$vars) {
  $output = '';
  foreach (drupal_get_messages(NULL, FALSE) as $type => $messages) {
    $output .= "<div class=\"messages $type\">\n";
    if (count($messages) > 1) {
      $output .= " <ul>\n";
      foreach ($messages as $message) {
        $output .= '  <li>' . $message . "</li>\n";
      }
      $output .= " </ul>\n";
    }
    else {
      $output .= $messages[0];
    }
    $output .= "</div>\n";
  }

  $vars['messages'] = $output;
}

Anda kemudian dapat menghasilkan $ messages di node.tpl.php Anda


Terima kasih atas solusinya. Saya sudah mencobanya tetapi sepertinya tidak berhasil. Saya menggunakan yang berikut ini untuk mencetak $ messages: <? Php print $ messages; ?> Apakah itu benar?
big_smile

8
Berhati-hatilah saat mengeluarkan barang dari page.tpl.php. Templat simpul tidak digunakan untuk setiap halaman, jadi Anda mungkin kehilangan pesan yang ditampilkan pada halaman non-simpul (seperti halaman admin, misalnya). Ketika Anda akan melakukan ini, saya sarankan Anda menyimpan fallback di page.tpl.php yang akan menampilkan pesan Anda ketika mereka belum dicegat oleh node.tpl.php.
marcvangend
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.