在node.tpl.php文件中打印$ Messages


23

在Drupal 7中,默认情况下,$messages变量打印在page.tpl.php中。

有没有一种方法可以$messages在node.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为空。
匿名开发人员

Answers:


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']))。
areynolds

您必须对所有其他页面(视​​图,面板等)执行相同的操作
Maria Ioannidou16年

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 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.