Drupal的$messages是怎么显示的?

Drupal的默认主题bartik会在页面顶部显示系统信息,例如警告、状态等。这个过程是如何实现的?

首先,在bartik目录下找到page.tpl.php,这是bartik主题的页面显示模板。其中有一段是处理$messages的:


<?php if ($messages): ?>
<div id="messages"><div class="section clearfix">
<?php print $messages; ?>
</div></div> <!-- /.section, /#messages -->
<?php endif; ?>

这里的$messages变量从哪里来的呢?在includes/theme.inc文件中找到system_process_page()函数,这是对page
hook的处理函数,调用了theme(‘status_messages‘)输出系统信息HTML。


function template_process_page(&$variables) {
... ...

// Generate messages last in order to capture as many as possible for the
// current page.
if (!isset($variables[‘messages‘])) {
$variables[‘messages‘] = $variables[‘show_messages‘] ? theme(‘status_messages‘) : ‘‘;
}
}

status_messages是另外一个theme hook,在system模块的hook_theme钩子中定义:


function system_theme() {
return array_merge(drupal_common_theme(), array(... ...});
}

function drupal_common_theme() {
return array(
‘status_messages‘ => array(
‘variables‘ => array(‘display‘ => NULL),
),
};
}

status_messages hook是用theme_status_messages()函数输出的,在theme.inc里面:


function theme_status_messages($variables) {
$display = $variables[‘display‘];
$output = ‘‘;

$status_heading = array(
‘status‘ => t(‘Status message‘),
‘error‘ => t(‘Error message‘),
‘warning‘ => t(‘Warning message‘),
);
foreach (drupal_get_messages($display) as $type => $messages) {
$output .= "<div class=\"messages $type\">\n";
if (!empty($status_heading[$type])) {
$output .= ‘<h2 class="element-invisible">‘ . $status_heading[$type] . "</h2>\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";
}
return $output;
}

theme_status_messages()函数调用drupal_get_message()获取系统信息,与此对应地设置系统信息的函数是drupal_set_message()。


function drupal_set_message($message = NULL, $type = ‘status‘, $repeat = TRUE) {
if ($message) {
if (!isset($_SESSION[‘messages‘][$type])) {
$_SESSION[‘messages‘][$type] = array();
}

if ($repeat || !in_array($message, $_SESSION[‘messages‘][$type])) {
$_SESSION[‘messages‘][$type][] = $message;
}

// Mark this page as being uncacheable.
drupal_page_is_cacheable(FALSE);
}

// Messages not set when DB connection fails.
return isset($_SESSION[‘messages‘]) ? $_SESSION[‘messages‘] : NULL;
}

function drupal_get_messages($type = NULL, $clear_queue = TRUE) {
if ($messages = drupal_set_message()) {
if ($type) {
if ($clear_queue) {
unset($_SESSION[‘messages‘][$type]);
}
if (isset($messages[$type])) {
return array($type => $messages[$type]);
}
}
else {
if ($clear_queue) {
unset($_SESSION[‘messages‘]);
}
return $messages;
}
}
return array();
}

从theme_status_messages()可知,系统信息有三类:status、error、warning。每一类系统信息对应一个css样式,在system.messages.css中定义。换句话说,不同类别的系统信息,显示的图标和字体都在system.messages.css中控制。


div.messages {
background-position: 8px 8px; /* LTR */
background-repeat: no-repeat;
border: 1px solid;
margin: 6px 0;
padding: 10px 10px 10px 50px; /* LTR */
}

div.status {
background-image: url(../../misc/message-24-ok.png);
border-color: #be7;
}

div.warning {
background-image: url(../../misc/message-24-warning.png);
border-color: #ed5;
}

div.error {
background-image: url(../../misc/message-24-error.png);
border-color: #ed541d;
}

Drupal的$messages是怎么显示的?

时间: 2024-10-06 01:50:10

Drupal的$messages是怎么显示的?的相关文章

linux 下 messages无法删除

今天看到报警服务器报警,发现/var/log/messages 文件大小为3.9GB,为节省空间决定清空messages文件.由于此文件不能直接删除,因此考虑使用以下命令 echo "" > /var/log/messages  结果报错如下 -bash: /var/log/messages: Operation not permitted 利用ll /var/log/messages 查看权限显示为 600  而且当前用户为root llattr /var/log/messag

ionic 的下拉刷新 与 上拉加载

<ion-view view-title="消息通知"> <ion-content class="padding"> <!-- <ion-refresher> 下拉刷新指令 --> <ion-refresher pulling-text="Pull to refresh" on-refresh="vm.doRefresh()"></ion-refresher&g

深度解析VC中的消息传递机制

摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面的分析. 一.什么是消息? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定 义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键 都会使Windows发送一个

Notepad++中NppExec的使用之一:基本用法

一直用NPP,很长时间了,最近才学习它的各种插件,这篇文章是根据NppExec的用户指南写的.很多地方是翻译的,但不全是翻译,同时也有些东西没有翻译. 一.何为NppExec 简单的说,这个插件可以让用户在NPP中直接运行一些命令和程序,而不用启动这些命令和程序对应的实际工具或编译器. 1. NppExec是... NppExec是介于Notepad++和外部工具/编译器之间的一个中间件.它允许用户在NPP中直接运行这些工具/编译器. NppExec是一个控制台(Console)窗口,它能展示运

win 消息

Windows消息机制概述 消息是指什么?     消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.    消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息.例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标.这个

VC控件自绘制三步曲

http://blog.csdn.net/lijie45655/article/details/6362441 实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处),那么,让我们来看看实现一个自定义绘制控件需要的三个主要步骤. 执行一个 NM_CUSTOMDRAW 消息处理程序. 指定处理所需的绘制阶段. 筛选特定的绘制阶段(在这些阶段中,您需要加入自己的特定于控件的绘制代码). 执行一个NM_CUSTOMDRAW 消息处理程序 当需要绘制一个公共控件时,M

【干货篇】步步为营,带你轻松掌握jQuery!

写在前面:经过系统的学习了原生JS之后,会发现其具有以下三个特点: 1.是一种解释性脚本语言(代码不进行预编译). 2.主要用来向 HTML 页面添加交互行为. 3.可以直接嵌入 HTML 页面,但写成单独的js文件有利于结构和行为的分离. 而接下来要讲的jQuery 就对原生javascript的一个扩展,封装,就是让javascript更好用,更简单. 换而言之,jquery就是要用更少的代码,漂亮的完成更多的功能.{Write less, Do more!} 1. jQuery 作为 Ja

AndroidStudio3.0 下载使用新功能介绍

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> AndroidStudio3.0 下载使用新功能介绍 - 天平 - 博客频道 - CSDN.NET 天平 向着目标一步一步走. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的Python,终于等到你!    &

Windows消息机制详解

消息是指什么?      消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序. 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息.例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标.这个记录类型叫做MSG,MSG含有来