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是怎么显示的?的更多相关文章
- 整合Django的信息显示框架messages framework
		##主要用在view.login函数,不管登录是否成功,都会设置message变量,然后在login.html显示 from django.contrib import messages#需要导的包 ... 
- ionic 的下拉刷新 与 上拉加载
		<ion-view view-title="消息通知"> <ion-content class="padding"> <!-- & ... 
- Windows消息机制详解
		消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ... 
- Windows消息机制概述
		消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程 ... 
- Windows消息传递机制详解
		Windows是一个消息(Message)驱动系统.Windows的消息提供了应用程序之间.应用程序与Windows系统之间进行通信的手段.应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理 ... 
- 【转载】 ionic 的 下拉刷新 与 上拉加载
		这篇文章是讲解 Ioinc中怎么实现 下拉刷新和上拉加载的.也是我们日常做项目是必不可少的功能.有兴趣的小伙伴可以来学习一下. 更多关于 IONIC 的资源: http://www.aliyue.ne ... 
- Notepad++中NppExec的使用之一:基本用法
		一直用NPP,很长时间了,最近才学习它的各种插件,这篇文章是根据NppExec的用户指南写的.很多地方是翻译的,但不全是翻译,同时也有些东西没有翻译. 一.何为NppExec 简单的说,这个插件可以让 ... 
- 运维工程师必会的109个Linux命令
		运维工程师必会的109个Linux命令 版本1.0 崔存新 更新于2009-12-26 目录 1 文件管理 6 1.1 basename 6 1.2 cat 6 1.3 cd 7 1.4 chgrp ... 
- ActionErrors 使用说明 struts1 validate 处理流程 详细教程(转)
		转自(http://blog.csdn.net/wyx100/article/details/8736445). struts1 处理流程是 jsp --> ActionForm 中的A ... 
随机推荐
- python笔记1-用python解决小学生数学题
			前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为6角,7角,8角,请问你最大的不可支付邮资是多少元? 小编掰着手指头和脚趾头算了下,答案是:1.7元 那么问题来了?为啥是1.7 ... 
- Spring Framework 4.0.0发布,首次支持Java 8
			Spring项目组今天发布了Spring 框架4.0.0版本.Spring是一个开源的轻量级Java SE和Java EE开发应用框架,其目的是用于简化企业级应用程序开发. Spring框架第一个版本 ... 
- Nginx和Tomcat负载均衡实现session共享
			以前的项目使用Nginx作为反向代理实现了多个Tomcat的负载均衡,为了实现多个Tomcat之间的session共享,使用了开源的Memcached-Session-Manager框架. 此框架的优 ... 
- MySQL连接查询(inner join,left join和right join的区别)
			关系数据库由多个相关表组成,这些表使用已知为外键列的常用列链接在一起. 因此,从业务角度来看,每个表中的数据是不完整的. 例如,在示例数据库(yiibaidb)中,使用orderNumber列链接的o ... 
- sscanf,sprintf用法
			#include<string.h> #include<stdio.h> int main() { ],sztime1[],sztime2[]; sscanf("12 ... 
- Latex:表格制作全攻略
			给出一个制作复杂表格的例子,制作表格主要用到multicolumn,multirow和cline,其中,要使用multirow,必须usepackage{multirow} 如果要制作出如下图所示的表 ... 
- 【12c】root container 和 pdb  的一些差别
			 Where\what ? root pdb 备注 Control files and redo log files Y belongs to the CDB and not to a spec ... 
- 使用标准模板find函数来对结构体容器进行查找
			最近在写一个项目,项目中需要获得类下面的所有对象,所以我采用了map容器,以string为关键字,list容器为内容来进行查找,而list中是一些struct结构体.由于在插入操作的时候需要判断该对象 ... 
- Best Time to Buy and Sell Stock III leetcode java
			题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ... 
- 7 个 Bootstrap 在线编辑器用于快速开发响应式网站
			Bootstrap 已经使响应式网站开发变得简单很多. 但是如果你不必手动写全部代码,事情会如何呢? 如果你可以自由地选择你想要使用的Bootstrap 组件.并可以把它们拖拽到画布中,事情会如何呢? ... 
