node.tpl.phpファイルの$ Messagesを印刷します


23

Drupal 7では、デフォルトで$messages変数はpage.tpl.phpに印刷されます。

$messagesnode.tpl.phpファイル(例:$ node-mycontenttype.tpl.php)で印刷する方法はありますか。

置くだけ<?php print $messages; ?>でも <?php print render($page['messages']); ?>機能しません。

そこのチュートリアルですここではブロック内の$メッセージを印刷するために、私は私のnode.tpl.phpファイルに入れたいと思います。


theme_status_messagesは前に呼び出されていると思うtemplate_preprocess_nodeので、drupal_get_messagesを呼び出すと空になります。
匿名開発者

回答:


30

実際、あなたがしたいことはこれです:

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

仕組み:Drupalコアはtheme_process_pageのshow_messagesの値をチェックします。TRUE(デフォルト)の場合、上記のようにtheme( 'status_messages')を呼び出し、メッセージストレージを事実上空にします。したがって、後で同じテーマ関数を呼び出すと、空の文字列が返されます。ただし、その変数をFALSEに設定すると、上記のテーマ関数がprocess_pageで呼び出されなくなり、選択したテンプレートで同じテーマ関数を使用してすべてのメッセージを取得できます。


1
ノードページでのみアクションを実行する場合は、$ variables ['show_message'] = FALSEを条件付きでラップしてif(isset($ variables ['node']))を確認します。
アリーノルズ

そして、他のすべてのページ(ビュー、パネルなど)でも同じことを行う必要があります
マリアイオアニドゥ

8

質問で参照したpage.tpl.phpの$ messagesとは別にブロックからのメッセージを表示する方法の答えは、良い方法です。基本的には、YOURTHEMEがテーマの名前であり、この関数がtemplate.phpにある必要があるこのようなものが必要です。実際にこのコードを実行したわけではありませんが、クラックがあります。

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

その後、node.tpl.phpで$ messagesを出力できるはずです。


解決策をありがとう。試しましたが、うまくいかないようです。以下を使用して$ messagesを印刷しています。<?php print $ messages; ?>それは正しいですか?
big_smile

8
page.tpl.phpからデータを取り出すときは注意してください。ノードテンプレートはすべてのページで使用されるわけではないため、非ノードページ(たとえば、管理ページなど)に表示されるメッセージが欠落している可能性があります。これを行うときは、page.tpl.phpでフォールバックを保持し、node.tpl.phpによってインターセプトされていないときにメッセージを表示することをお勧めします。
marcvangend
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.