Answers:
实际上,您要执行的操作是:
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为空。