你在这里

Chapter 01: How Drupal Works

本章将给你一个Drupal的概述。系统如何工作的每个细节将在后面的章节逐一提供。在此,将大略展示一下drupal的运行技术堆栈、构成drupal的文件层级以及诸如节点(nodes)、钩子(hooks)、区块(blocks)、主题(themes)等drupal使用的一些术语。

Drupal是什么?

Drupal用来创建Web站点。它是高度模块化、强调合作的开源web内容管理框架。它可扩展、遵从标准并力求使用清洁的代码占用更小的空间。

Drupal靠一些由激活的内建模块和第三方模块提供的基本核心功能和一些附加功能运行。Drupal被设计成可定制化,但是定制是由覆写核心或附加模块的方式来完成,而不是修改核心代码。Drupal的设计成功地分离了内容的管理和内容的表现。

Drupal可以用来构建internat门户、个人网站、部门的或公司的站点;电子商务站点、资源目录;在线报纸、社交网站;相册、intranet、虚拟现实及其它你能猜想出来的web站点。
有专门的团队通过应对威胁并发布安全更新来努力保证Drupal的安全。非盈利的Drupal Association组织通过提高drupal.org基础设施、组织会议和活动来提供Drupal支持。有一个繁荣的网上用户社区,包括设计者、管理员、开发者,辛苦工作,不断地提供软件,请浏览http://drupal.org 和 http://groups.drupal.org。
 

技术堆栈

Drupal设计的目标是既可用于运行于便宜的主机的小站点,也要适用于大尺寸的复杂的分布式站点。前一点目标意味着使用大量流行的技术,后一个目标意味着细致小心的、严格紧密的编码。Drupal的技术堆栈如下图1-1:

 figure 1-1 Drupal's technology stack

操作系统处于堆栈的底层,Drupal不用太关心它们,Drupal成功地运行于任何支持PHP的操作系统上。

被Drupal使用的web服务器是apache,但是其它也可以使用,包括微软的IIS,只是因为Drupal在历史上长期使用apache,Drupal利用.htaccess文件来安全安装Drupal。Clean URL -- 没有 问号、'&'等其它奇怪字符的URL是靠一组apache的mod_rewrite规则来提供。这一点非常重要,因为当从其它内容管理系统或者从静态文件移植过来时,需要不更改原有URL,并且按照Tim Berners-Lee (http://www.w3.org/Provider/Style/URI)的说法,不变的URI很酷。其它web服务器上的Clean URL依照这些服务器得url重写特性来生效。

Drupal技术堆栈的通过数据库层(database)有一个轻量级的数据库抽象层,Drupal7 完全重写了数据库层,此数据库接口提供一个基于PHP数据对象(PDO)的API来允许Drupal去支持任何支持PHP的数据库,包括常用的MySql、PostgreSQL等,Drupal7现在也支持SQLite。

Drupal是用PHP写的,严格追寻编码标准(http://drupal.org/nodes/318)并且通过了彻底的开源检查。对于Drupal7简单的PHP学习曲线意味着可以很容易成为贡献者,他们只要着手开始,并且检查流程保证最终产品能轻易访问而不牺牲质量,初学者可以从社区获得帮助来提高他们的技能。Drupal要求PHP是5.2版本。

 

核心

一个轻量级的框架组成了Drupal的核心(core),这就是你从drupal.org下载的那个,核心负责提供一些基本的功能,用来支持系统的其它部分。

核心包括允许在接收到一个请求时Drupal自启动的代码、drupal频繁使用的公共函数库、以及支持诸如用户管理、分类、模板等功能的模块。如图1-2

 figure 1-2 An overview of the Drupal core (not all core functionality is shown)

核心还包含了建立适于多数站点的区块的功能、包含了feed聚合、blog、投票、论坛。

管理接口

Drupal内的管理接口紧密地与Drupal的其他部分整合到了一起,所有的管理功能都可以通过管理工具条上的菜单访问到,这个工具条当你以管理员登陆后显示在窗口的顶部。

模块

Drupal是个真正的模块化框架,功能被包含在模块中,可以激活或者停用,通过激活存在的模块、安装drupal社区成员写的模块或者自己新写的模块的方式将特性添加到Drupal站点。按照这种方式,Drupal可以尽量按需使用模块来运行于精干的环境,还能达到需要的特性,需要加什么模块就加什么模块,如下图展示:

figure 1-3 Enabling additional module s gives more functionality.

模块通过添加新的内容类型来扩展Drupal,比如食谱、博客帖子、文件,及e-mail通知、端对端发布、聚合器。Drupal颠倒了控制设计模式,在恰当的时机框架将调用模块化函数,为模块做它们的某些东西的时机叫钩子。

钩子


钩子被认为是个Drupal内部事件,它们也被叫做回调,但是因为它们习惯上由命名函数构成,而不是通过一个监听者注册,所以不是真正的回调。钩子允许模块“钩进”drupal接下来的发生的事情。
既定一个用户登录进Drupal站点,当用户登录时,Drupal击发hook_name_login。这意味着任意一个按照惯例命名的函数会被调用,命名方法是模块名+钩子名,例如comment模块中是comment_user_login(),locale模块中叫locale_user_login(),node模块中叫node_user_login(),并且任何其它相似名称的函数也会被调用,如果你写了一个自定义的模块叫spammy.module并且包含一个函数叫spammy_user_login()给用户发一个E-mail,你的函数也会被调用,并且不高兴的用户在每次登录后都受到一个主动发来的邮件。
大多数利用Drupal核心功能的通用方法是通过在模块中实现钩子完成。

tip 更多的关于Drupal钩子细节,请看在线文档http://api.drupal.org/api/7下的“Module System(Drupal hooks)”一节。

主题

 当建立一个web页面并发送到一个浏览器,实际上要考虑两个方面:组织恰当数据并将为web做标记数据。在Drupal中,主题层负责创建浏览器准备接收的HTML(或JSON、XML等)。Drupal使用PHP Template作为主要的模板引擎,或者你可以另选Easy Template System(ETS)。大多数开发者在组织新的Drupal主题时倾向于标准的模板引擎。一个重要的东西需要记住,Drupal鼓励内容和表象分离。
Drupal允许几种方式去定制和覆写你的web站点的面貌和感觉。最简单的方式是使用层叠样式表CSS去覆写Drupal内建的类和id。然而,你希望超越这个方法去定制实际的HTML输出,你能发现这很容易去做,Drupal模板文件由标准的HTML和PHP组成,加之,每个Drupal页面动态例如一个面包屑导航,能简单地通过声明一个恰当名称的函数来覆写,然后Drupal将使用这个函数替代原来的函数去建立页面的这个部分。

节点

Drupal的内容类型源于单一的被称为节点(node)的基础类型,不论它是一个博客条目、一个菜谱甚或一个计划任务,最根本的数据结构是相同的。天才背后的方式是它的可扩展性。模块开发者可以附加诸如评级、评论、文件附件、地理位置信息给节点而不用担心它是博客条目、菜谱什么的,然后网站管理员依照内容类型混合、匹配各功能,例如,管理员可以选择为博客激活评论功能但是关闭菜谱的评论功能,只为计划任务激活文件上传功能。
节点还包含一个基本的行为特性,由其他内容类型继承。任何一个节点能放置到站点的首页、发布或不发布或可查找,并且由于这是统一的结构,管理接口能够在一个节点工作时提供一批编辑屏幕。

字段

Drupal的内容由一些独立的字段构成,比如节点的标题就是一个字段,就想节点的主体一样。在Drupal中你可以用字段去构建任何的你可以想象出来的内容类型,例如,一个事件。如果你想象一个事件,它典型地包含一个标题、一个描述(或叫主体)、一个开始日期、一个开始时间、一段时期、一个位置、还可能有一个注册该事件的连接,每一个此类元素都表现为一个字段。在Drupal中,我们有能力用字段去创建内容类型--可以使用模块编程的方式或者使用管理接口创建一个新的内容类型,通过用户接口给它分配字段,方法可以二选一。使用Field API可以极其简单地使用少量编程来创建从简单到复杂的内容类型。

区块

一个区块是在你的站点模板特殊位置能被激活或禁用的信息。例如,一个区块可以显示你的站点上活跃用户数量,你可以区块去包含一个站点热门内容的链接或未发生事件的列表。区块典型地被安排在模板的边栏、头部或页脚。区块能被设置成在某些特定类型节点上显示,只能在首页上或依照其它准则。
通常,区块用来表现定制给当前用户的信息,例如,用户区块只包含一个到当前用户有权访问的管理界面链接,诸如“My account”页面。区域(Regions)就是定义在站点主题中的一块区域,在那里区块可以表现出来,例如header、footer、或左右边栏,区域中的区块布局和可视化是通过web基础的管理接口来管理。

文件布局

理解默认的Drupal安装实例的目录结构将教你几个重要的实践经验,诸如下载的模块和主题应该怎么放置以及怎样去弄个不同的Drupal安装profile。一个默认的drupal安装有下图1-4中的结构。

figure 1-4 The default folder structure of a Drupal installation


文件夹中每一项的细节如下:
include目录包含Drupal使用的库和公共函数
misc目录存储Drupal安装时使用的javascript和杂项的图标、图片。
modules目录包含核心模块,里面的每个模块都有一个自己的目录。别往里加任何东西,或任何其他目录,除了profiles和sites,你应该将扩展模块加到sites目录。
profiles目录中包含了不同的站点安装profile。
scripts目录包含检查语法、清理代码、命令行运行Drupal、处理cron特别情况、运行测试包(D7)等所需要的脚本。这个目录不在drupal请求生命周期内使用,它们是shell及perl实用脚本。
sites目录(图1-5)包含了你在设置表单中对设置、主题、模块的修改。当你从贡献模块仓库或写一个模块时,你应当将它们加入到-sites/all/modules中,这是保存所有你的Drupal变更的单独目录。在sites目录中有一个名叫default的子目录,保存一个你的Drupal站点默认的配置文件default.settings.php,Drupal安装器将在你提供的信息基础上修改这些初始设置并且为你的站点生成一个settings.php文件,默认的目录是典型地拷贝并重命名为你的站点的URL,你最终的设置文件将是sites/www.example.com/settings.php。
sites/default/files目录包含Drupal默认基本安装信息,它需要用来存储那些上传到你的站点以备后用的任何文件。一些例子是用来存放用户logo,激活用户头像或其他上传的媒体文件。这些子目录需要drupal运行的服务器的可读可写的权限,如果有权限,Drupal安装器将创建子目录。此外sites/default/files,一个sites/default/private目录可能建立用来存储比较敏感的和不应展示的文件,除非有适当的证明。你可以通过浏览Configuration>FileSystem并进入你想保存私有文件的方式来创建私有文件目录,文件路径就是标题是Private的文本域的文件系统路径。
themes目录包含模板引擎和Drupal默认的主题,你下载的和创立的附加主题不应该放在这里,将它们放到sites/all/themes中。
cron.php用来执行周期性的任务,例如修剪数据库表和计算统计等。
index.php是服务请求的主入口点。
install.php是Drupal安装器的主入口点。
update.php在Drupal版本更新后更新数据库关系模式。
xmlrpc.php接收XML-RPC请求,不打算使用XML-RPC时可以从部署中删除。
robots.txt默认的机器人排除规则。
authorize.php运行授权文件操作的管理脚本,例如从drupal.org下载并安装一个新的主题或模块。

figure 1-5 The sites folder can store all yo ur Drupal modifications.
其它没有列出来的文件是文档。

服务一个请求

对于Drupal接收到一个请求时发生了什么有个概念上的框架非常有帮助,这节提供一个快速排练。如果你要自己跟踪,那么使用一个好的debugger,在index.php处开始,它接收大多数它的请求。这个序列对于显示简单网页来说比较复杂,但它具有普遍的灵活性。
   

     web服务器规则


Drupal运行于web服务器之上,通常是Apache。如果web服务器遵循Drupal的。.htaccess文件,有些PHP这是初始设置的,并且URL是被检查的。差不多所有对Drupal的调用都是通过index.php,例如一个到http://example.com/foo/bar的调用经历下列流程:
1、Drupal的.htaccess文件的mod_rewrite规则查看送入的URL并从路径中分离出基本URL,本例中,路径是foo/bar。
2、路径被指派为URL请求操作符q的参数、
3、结果URL是http://example.com/index.php?q=foo/bar
4、Drupal像内部路径一样处理foo/bar并且交由index.php开始处理。
如同这个处理结果,Drupal精确地一同样方式处理http://example.com/index.php?q=foo/barhttp://example.com/foo/bar,因为这两种情况内部路径相同,这可以使Drupal不使用怪异的URL字符,而使用Clean URL。
在作为替代的其它web服务器,如微软的IIS,clean URL可以使用ISAPI模块像ISAPI重写那样取得。IIS 7 和后面版本支持直接重写。如果你的站点运行于IIS7或更高版本,你应当校验用于激活clean URL的web.config文件,并且使它不能被窥探到,像.install, .module, .test, .theme, .profile, .info和.inc 文件一样。
   

     启动过程


Drupal每个请求的自启动过程都经历一系列启动阶段,这些阶段在bootstrap.inc中定义,如下表描述:
阶段                             目标
Configuration            设置贯穿启动过程的公用变量。
Database                    初始化数据库系统且注册自动装入函数。
Variables                    装入系统变量和所有已激活的启动模块。
Session                       初始化会话处理。
Page Header              启动hook_boot(),初始化锁系统并且发送默认的HTTP头。
Language                   初始化所有定义的语言类型。
Full                              最终阶段:Drupal现在完全装入,此阶段校验和修正输入数据。
   

     处理请求

回调函数的工作是必须处理和累积要完成请求所必需的数据。例如,如果接收到一个内容请求http://example.com/q=node/3,URL被映射到node.module的函数node_page_vies(),进一步处理是从数据库检索出这个node数据并将它放进一个数据结构,然后就是主题化它的时候了。
   

     主题化数据

主题化牵扯翻译检索出的数据、操作或新建HTML(或XML或其它输出格式)。Drupal将使用管理员选择的主题给web页面以恰当的视觉和感觉,结果输出被送到web浏览器或其它HTTP客户端。

总结

读完这章,你能大概了解Drupal怎样工作并且对Drupal处理一个请求时发生什么有个大概的了解。一些创造web页面的组成部分将在下面章节详细叙述。

 

 

Comments

1. 原文:Drupal makes use of the inversion of control design pattern, in which modular functionality is called by the framework at the appropriate time.

   译文:Drupal颠倒了控制设计模式,在恰当的时机框架将调用模块化函数

   问题:其中“inversion of control”应翻译为“控制反转