回答:
実際、あなたがしたいことはこれです:
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で呼び出されなくなり、選択したテンプレートで同じテーマ関数を使用してすべてのメッセージを取得できます。
質問で参照した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を出力できるはずです。
template_preprocess_node
ので、drupal_get_messagesを呼び出すと空になります。