




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、总目录§§§§§·····················关于作者技术审稿人关于译者致谢导言第 1 章 Drupal 的工作原理第 2 章 创建一个模块(Module) 第 3 章 钩子,动作,和触发器第 4 章 Drupal 菜单系统第 5 章 Drupal 的数据库层第 6 章 Drupal 用户第 7 章 Drupal 节点第 8
2、章 主题系统第 9 章 Drupal 区块第 10 章第 11 章第 12 章第 13 章第 14 章第 15 章第 16 章第 17 章第 18 章第 19 章第 20 章第 21 章表单 API处理用户输入:过滤器系统搜索和索引内容Drupal 文件使用分类(Taxonomy)缓存会话使用 jQuery本地化和翻译XML-RPC编写安全的代码开发最佳实践2 / 451序在一年多以前,我书的第一版写了序言。那时,在 Drupal 世界里缺少的就是一本开发。通过编写本书的第一版,John VanDyk 和 Matt Westgate 为Drupal 的持续发展,做出了难以置信的贡献。在我遇到的
3、 Drupal 开发者中,每人都有一本第一版的 Drupal 专业开发指南。Drupal,通过它的开源本性,已经成为了一个伟大的软件,这比我预期的要好很多。Drupal 开发者社区勇于创新,同时以极大的热情拥抱 web 开发的每个技术,并努力为 web 开发者提供近乎无限的可能性。在 Drupal 社区中,变是永恒的,也是我们的关键所在。在本书的第一版以后,我们发布了 Drupal 6,这向前迈进了一大步,它包含了新的和改进了的 API。事实上,有超过 700 多的开发者为 Drupal6 的代码贡献了力量。通过共同努力,我们对主题系统作了重要改进,对多语言提供了更好的支持,此外还改进了菜单系
4、统、表单 API、JavaScript,等等。最终的结果是,与 Drupal5 相比,Drupal6 是一个更优秀的 web 应用开发平台。这可能让 John 和 Matt 失望了(对不起!),Drupal 专业开发指南最初版本的所有章节,都已经或多或少的过时了。幸好,本书的第 2 版修正了所有的这些问题。本书覆盖了 Drupal6 下的各种功能和开发工具,为底层开发提供了深度视角,并揭示了 Drupal6 背后的设计理念。每当我们为 Drupal 发布一个新的主版本的时候,Drupal 都会吸引的用户和开发者。所以,如果对于 Drupal6 还缺少什么的话,那么它就是本书了,我非常感谢 Jo
5、hn 修订并扩展了本书。有了本书和 Drupal 源代码的一份拷贝以后,你就可以参与到 Drupal 社区之中,并为 Drupal 的开发贡献力量了。如果你指出了如何可以做的更好,比如与原有方式相比,使用了更少的代码或者更优雅的方式或者速度更快,那么请把它告诉我们,我们专注于 Drupal者也非常乐意这样。的稳定、灵活、强大。我非常乐意去评估和提交你的 Drupal补丁,我敢肯定其他的维护Dries BuytaertDrupal 创始人和项目3 / 451关于作者 JOHN VANDYK 最初开始接触计算机,是在一个黑色的 Bell & Howell Apple II 上,为 Litt
6、le Brick Out,打印和检查BASIC 代码,以增加 paddle 宽度。在发现 Drupal 以前,John 参与了 UserLand Frontier 社区,并使用 Ruby 编写了自己的内容管理系统(和 Matt Westgate)。John 是一名 web 架构师,效力于 Lullabot,一个著名的 Drupal 教育和咨询公司。在此以前,John 在 Iowa 州立科技大学的昆虫系工作,他是一名系统分析员和助理教授。他的用相片来创建 3 维虚拟昆虫。是关于鹿鸣的耐寒性的,他的博士关于正在研究的使John 和他的妻子 Tina 生活在Ames, Iowa。他们在家里教育他们的
7、一群孩子,他们已经习惯了在睡觉前听父亲讲段 Drupal故事“节点修订本在多个关联之地上的历险记”。技术审稿人ROBERT DOUGLASS 的 Drupal 探索始于 2003 年,他创建了的个人RobsH。在 2005 年,他与人合著了使用 Drupal, phpBB, 和 WordPress 构建和熟手提供了颇有价值的指南。社区。作为第一本深度讲解 Drupal 的书籍,它为 Drupal 的初学者ROBERT 还负责夏季代码项目中的 Drupal 相关部分,他还在许多会议上宣传 Drupal,同时在网上了许多Drupal 相关的技术文章,另外他还是德国柏林 Drupal 用户小组的创始
8、人。作为 Acquia 的高级顾问,ROBERT 努力让各种各样的个人、组织能够方便高效的使用Drupal。ROBERT 喜欢经典音乐和开源软件,并把它们看作是动力和精神的源泉。致谢首先,感谢家庭,在编写本书的过程中,特别是在“一个简单的修订”转变为了一个和第一版同样巨大的工程时,他们的理解和支持,给了我莫大的鼓舞。Drupal 是一个基于社区的工程。如果没有这么多人的共同努力,编写文档,提交错误报告,创建和检查改进,Drupal 就不会像今天这样,当然也就有这本书了。但是在这么多人当中,请我感谢那些对本书做出特别贡献的人。4 / 451它们包括#drupal IRC(internet rel
9、ay chat)栏目所有成员,他们耐心的回答各种问题,包括 Drupal 是怎么工作的,为什么要用特定的方式编写代码,以及为什么有些代码是好的而另一些为什么是坏的,等等。很多人书作出了重要贡献,这包括,Brandon Bergren, Øivind Binde, Larry “Crell” Garfield, Dmitri Gaskin,Gordon, GerhardKillesreiter, Greg Knaddison, Druplicon, Rob Loach, Chad Phillips,和 Oleg Terenchuck.。对于那些做出贡献而在此遗漏的人表示歉意。Rober
10、t Douglass, Károly Négyesi, Addison Berry, Angela Byron,Heine Deelstra, Jeff Eaton, Nathan Haug,Kevin Hemenway, Gábor Hojtsy, Barry Jaspan,Earl在这里,对他们表示特别的感谢。, 和 James Walker 认真的检查了本书的全部或部分手稿,感谢爱荷华州立大学(Iowa State University)的 Joel Coats,感谢 Lullabot 的全体成员,感谢他们对本书的支持。感谢 Apress 小组在示例代码需要
11、不断修改时的和理解,以及魔术般的将手稿转变为了一本书籍。最后,感谢 Dries Buytaert 将 Drupal 贡献给了整个世界。5 / 451导言程序员的学习历程就是一个非常有趣的旅程。首先是,分别的去学习、摸索一个软件系统的各个的子模块,通过对这些模块的学习来理解整个系统。当你达到了一定的程度以后,接着你就开始研究系统的内核,尝试着编写的代码来操纵系统的行为。这就是我们如何学习的多读别人的代码、多写的代码。你坚持这一模式一段时间以后,你发现达到了一个新的高度,你可以从头构建一个的系统了。例如,你编写了一个内容管理系统,并把它部署到多个站点上,这样是不是很酷,觉得撬动了地球。但是接着又会
12、到达一个关键点,当你发现对你系统的维护比构建该特性所耗费的时间还要多时,你就到达了这一关键点。你想根据现在所掌握的知识来从头构建整个系统。你还发现,许多其它的系统出现了,你的系统能做的,它们能做甚至做的更好,你的系统不能做的,它们也能实现。而且它们还有一个社区,在这里,来自全球各地的开发者在一起努力的改进这个软件,这时,你终于发现,这些系统在大多数方面都优于你的系统。更让人难以置信的是,这个软件是的,并且是开源的。这就是我们的经历,你可能也会遇到类似的情况。旅程的终点让人感到欣慰成千上万的开发者在为同一个项目而努力。在这里,你找到了朋友;你编写了的模块;最重要的,和你单打独斗的时候一样,你仍然
13、感觉到在做一件有意义的事情。这本书适用于 3 种读者。首先,这里有大量的插图,包括各种图表和流程图;还有许多内容摘要,这为想了解 Drupal 是什么、Drupal 能做什么的初学者提供了方便。其次,本书包含了大量的代码片段和示例模块。这适用于有些基础,想在 Drupal 框架之上做定制开发的读者。我们建议你,安装 Drupal,在阅读本书的同时动手实践这些例子(最好再有一个调试器),这样你很快就会熟悉 Drupal 了。最后,本书包含了大量的评论、提示、还有对代码图片的详细解释,这将整本书有机的到了一起。这适用于想成为 Drupal 高手的人。如果你是初学者,我们建议你从头逐章阅读本书,因为
14、前面的是基础,是后面章节的预备条件。最后,你可以从祝您好运并欢迎来到 Drupal 社区!或者到本书的示例代码,流程图和图片。中文版说明:Drupal 专业开发指南第二版(Pro.Drupal.Development.2nd Edition)由 JOHN VANDYK 先生编写。)根据原文档翻译,文档由 xLight 打包。由于葛先生和本人都没有取得出本中文版由葛鸿儒先生(版方的,翻译文档学习参考使用,私自或用于商业目的。由此造成的任何纠纷葛先生和本人概不负责。6 / 451Drupal 的工作原理第一章为你展示 Drupal 的概貌。会在以后章节中,对 Drupal 中的每个部分的工作原理进
15、行详细的介绍。在本章中,讨论 Drupal 运行所用到的技术堆栈, Drupal 包含的各种文件,和 Drupal 使用的各种不同的概念术语,在这里,比如节点,钩子,区块和主题。什么是 Drupal?Drupal 是用来构建的。它是一个高度模块化,开源的 web 内容管理框架,并且非常注重合作,互动的重要性。它的特点包括可扩展性强,符合标准,追求简洁代码,内核精练。Drupal 自带了一些基本的功能,其它的额外功能可通过安装模块可选模块或者第 3 方模块来实现。我们可以基于 Drupal 进行定制,但是定制是通过覆写模块或者增加模块来完成的,而不是修改组件中的代码。它还将内容管理和内容表示这二
16、者进行了的分离。Drupal 可被用来构建一个互联网门户;个人的,部门的,或者公司的;一个电子商务站点;一个分类站点;一个报纸;一个图库;一个内部网,Drupal 的应用非常广泛,这里仅仅提到了其中的一部分。它甚至可用于有一个专门的安全小组,他们通过对回应危害和发布安全更新来保证 Drupal 的安全。另外还有一个非教育。性的组织,Drupal,它通过改进 的基础设施,组织 Drupal 聚会和各种活动,来推动 Drupal 的发展。Drupal的社区也非常活跃,里面包括各种用户,站点管理员,设计者,和 web 开发者,大家都在非常努力的工作着,并不断地改进着 Drupal
17、 系统;可参看和。7 / 451§§技术堆栈§§§§§§§§§§§管理界面模块钩子主题节点区块文件布局服务一个请求引导指令流程完成总结8 / 451技术堆栈Drupal 的设计目标是,既可以运行在廉价的 Web 虚拟主机上,也可以适应高负载的分布式站点。前一个目标则意味着需要使用最流行的技术,而后者则意味着严谨的编码。Drupal 的技术堆栈如图 1-1 所示。图 1-1 Drupal 的技术堆栈操作系统位于技术堆栈的最底层,Drupal 基本不用关心底层的操作系统
18、。只要它支持 PHP,就可以运行 Drupal。Drupal 最常用的web 服务器是Apache,当然也可以使用其它的web 服务器(包括微软的IIS)。由于Drupal 和Apache的这种长期的友好关系,所以在 Drupal 的根目录下自带了一个.htaccess,用来确保 Drupal 安装的安全。可以使用 Apache的 mod_rewrite 模块来实现简洁(Clean)URLs-将 URL 中的“?”,“&”以及其它奇怪的符号清除掉,在 Drupal 中去掉的是“?q=”。这一点特别重要,当从其它的内容管理系统或者静态文件中迁移到 Drupal 上时,依照 Tim Ber
19、ners-Lee),内容的 URL 不需要改变,而不改变 URI 则有利于 SEO。对于其它的 web(服务器,通过使用它的 URL 重写能力,也可以实现简洁 URL。Drupal 使用一个轻量级的数据库抽象层与堆栈的下一层次(数据库层)进行交互。这一抽象层能够处理 SQL 语句的安全;通过使用 Drupal 数据库 API,你不须重构代码,便可以使用不同厂商的数据库。在 Drupal 中最常用的数据库是MySQL 和 PostgreSQL,不过对 Microsoft SQL 和 Oracle 的支持也在不断增加。Drupal 使用的编程语言是PHP。因为 PHP 比较好学,所以大量的 PHP
20、 代码都是由新手编写的。而新手的水平大家也知道,他们所写的代码总是存在这样或者那样的问题,这就给 PHP 的名声带来了比较坏的影响。然而, PHP 也可以用于构建严谨的代码。Drupal中的所有代码都遵守了严格的编码规范(),通过开源,其代码也经过了成千上万人的锤炼。对于Drupal 来讲,PHP 的入门门槛比较低,这就意味着有的人能够为Drupal 贡献代码,通过开源,会有很多人对这些代码进行检查,这样就保证了代码的质量。通过向社区贡献代码,这样就可以收到他人的反馈,帮助,从而提高大家的技能。(Core)Drupal 的是由一个轻量级的框架的。当你从 Drupal 时,得
21、到的就是 Drupal。它负责提供基本的功能,用以支持系统的其它部分。内核包括当 Drupal 接到请求时所要调用的系统引导指令的代码,一个 Drupal 常用函数库,和提供基本功能的模块比如用户管理、分类、和模板,如图 1-2 所示。9 / 451图 1-2 Drupal 内核的概貌(没有展示完所有的功能)管理界面(AdministrativeInterface)Drupal 的管理界面与站点的前台部分紧密的集成在了一起,并且在默认情况下,使用相同的主题。第一个用户,也就是用户 1,是一个超级用户,他对站点拥有全部权限。以用户 1 的登录后,你将在你的用户区块(参看“区块”部分)中看到管理站
22、点的一个。点击这一,你将进入到 Drupal 的管理界面。根据用户对站点权限的不同,每个用户的区块都会有一个不同的。模块(Modules)Drupal 是一个完全模块化的框架。模块中包含了各种功能,而模块可被启用或者禁用(一些必须的模块不能被禁用)。有 3种方式可以用来向 Drupal 站点添加特性:启用已有模块,安装 Drupal 第 3 方模块,编写的模块。这样,就可以根据站点的需要来添加相应的模块,需要的功能少,则所需的模块也就少;需要功能多,则所需的模块也就多。如图 1-3 所示。10 / 451图 1-3 通过启用其它模块来添加新增的内容类型比如处方、日志、或者文件,新增的行为比如的
23、功能通知、P2P 发布、和聚合,等等都是通过模块来实现的。Drupal 使用了反转(IOC)设计模式,这样框架就会适时的调用相应的模块化功能了。这些为了模块完成它们的任务所提供的机会,被称为钩子。钩子(Hooks)可以把钩子看做 Drupal 的内部。有时也将其称为回调函数,这是由于它们是根据函数命名约定来构建的,而不是器(listener),它们也不是真的被回调。模块通过使用钩子,就可以与 Drupal 的其它部分整合在一起了。一个假定有一个用户登录了你的 Drupal 站点。在用户登录时,Drupal 调用用户钩子。这意味将调用所有的根据约定“模块名”+“钩子名”创建的函数。例如,评论模块
24、中的 comment_user(),本地化模块中的 locale_user(),节点模块中的node_user(),还有任何其它具有类似名称的函数也都将被调用。如果你编写了一个名为 spammy.module 的定制模块,其中包含一个名为 spammy_user()的函数,用来向用户录都将收到一封不请自来的电子邮件。电子邮件,那么你的这个函数也将被调用,倒霉的用户每次登与 Drupal功能进行交互的最常用的方式,就是在模块中实现钩子。提示Drupal 支持的钩子的信息,可参看块系统(Drupal 钩子)”。,查看“Drupal 的组成部分”,接着“模文档11 / 451主题(Themes)当创
25、建一个 web 页面,以给浏览器时,实际上主要考虑两个方面:把所需的数据收集起来,为这些数据添加 HTML 标签。在 Drupal 中,主题层用来负责创建 HTML(或者 JSON,XML 等等),以传递给浏览器。Drupal 可以使用多种流行的模板方式,比如 Smarty,PHP 模板属性语言 (PHPTAL),和 PHPTemplate。这里需要记住的要点是,Drupal 提倡将内容和标记区别开来。在Drupal 中可以使用多种方式来为你的定制外观。最简单的方式是使用 CSS 来覆盖Drupal 内置的类和 ID。然而,如果你不想局限于此,并且想定制实际的 HTML 输出时,你会发现很容易
26、就可以实现你的目标。Drupal 的模板文件由标准的 HTML 和 PHP 组成。另外,Drupal 页面的每个动态部分(比如盒子、列表、或者面包屑),都可以通过适名字的函数进行覆写。接着,Drupal 将使用你的函数来创建页面的该部分。一个具有合节点(Nodes)Drupal 中的内容类型,都根源于一个唯一的基本类型,在这里称之为节点。无论它是一篇日志、一个处方,甚至一个工程任务,它的底层数据结构都是相同的。采用这种方式的优势在于它的扩展性。模块开发者可以为节点添加各种特性,比如评分、评件附件、地理位置信息等等,而不用担心节点的具体类型,无管它是日志、处方还是其它。站点管理员可以根据内容类型
27、混合和匹配功能;例如在日志而不是在处方上启用评论,或者仅为工程任务启用文件上能。节点还包含了一个基本的行为属性集,而所有其它的内容类型都继承了这一属性集。任何节点都可以被推到首页、发布或者未发布,或者甚至被搜索。正是由于这个统一的结构,管理界面才能够为节点提供了一个批量编辑页面。区块(Blocks)区块是在你模板的特置上,可以启用或者禁用的信息。例如,一个区块可以用来显示你站点当前用户的人数。你可以区块中包含一些,用来指向站点的热门内容,或者包含一些即将到来的列表。区块一般放置在模板中的边栏、页首、或者页尾中。区块也可以用来显示特定类型的节点,一般仅用于首页,或者根据其它标准才这样实现。,比如
28、“我管理接口区块常常用于为当前用户显示定制的信息。例如,用户区块中仅包含了当前用户的管理界面的的账号”。区块放到区域(比如页首,页脚,或者左右边栏等等)中,而区域则定义在站点的主题中。可以通过页面,对这些区域中区块的位置和可视性进行管理。文件布局(FileLayout)通过了解 Drupal 默认安装的目录结构,能够学会一些重要的最佳实践,比如的 Drupal 安装轮廓。一个 Drupal 默认安装的目录结构如图 1-4 所示。的模块和主题的放置位置,如何拥有不同12 / 451图 1-4 Drupal 默认安装的目录结构文件夹目录中的每一元素的详解如下:includes :包含了 Drupa
29、l 常用的函数库。misc:用来Drupal 安装中可用的 JavaScript,和其它各种图标和图片文件。modules:包含了所有模块,其中一个模块对应一个文件夹。最好不要乱动这个文件夹(包括 profiles 和 sites 以外的其它目录)下面的任何东西,你要添加的其它模块须放到 sites 目录下。profiles:包含一个站点的不同安装轮廓。如果在这个子目录下面,除了默认的轮廓以外,还有其它的轮廓,那么在你第一次安装你的 Drupal 站点时,Drupal 将向你询问想要安装哪一个轮廓。安装轮廓的主要目的是,用来自动的启用第 3 方的模块。比如一个电子商务轮廓,它将自动把 Drup
30、al 安装成为一个电子商务平台。的或者scripts:包含了许多,这些可用于语法检查,代码清洁,从命令行运行 Drupal,使用 cron 处理特定情况等等。在 Drupal 的请求生命周期中,用不到它;里面包含一些 shell 和 Perl 的实用。sites:包含了你对 Drupal 所进行的修改,包括设置、模块、主题等形式(参看图 1-5)。你从第 3 方模块库中的模块,或者你编写的模块,都放在 sites/all/modules 下面。这使得你对 Drupal 所进行的任何修改都保存在单个文件夹里。在目录sites 下面有一个名为default 的子目录,里面包含了你的Drupal 站
31、点的默认的设置文件- default.settings.php。Drupal 安装器,将会基于你提供的信息来修改这些原始设置,并为你的站点创建一个 settings.php 文件。站点的部署通常会拷贝默认目录,并将其重命名为你站点的 URL,所以你最终的设置文件就位于,sites/.13 / 451sites/default/files:Drupal 默认是不包含这个文件夹,但是当你需要上传文件接着提供对外时,就需要用到这个目录了。一些示例包括,定制的 logo,启用用户头像,或者向你的站点上传其它文件时,你就用到了这个文件夹。运行 Drupal的 web 服务器需要具有对这个子目录进行读和写
32、的权限。如果可以的话,Drupal 的安装器将会为你自动的创建这个子目录,并检查是否设置了相应的权限。themes:包含了Drupal 的模板引擎和默认主题。你中。的或者创建的其它主题,不能放在这里;应该放在sites/all/ themescron.php:用来执行周期性任务,比如过期缓存数据,以及计算统计信息。index.php:处理请求的主。install.php: Drupal 安装器的主。update.php: Drupal 版本升级后,用来更新数据库模式(schema)。xmlrpc.php: 用来接收 XML-RPC 请求,如果你的不打算接收 XML-RPC 请求的话,那么可以将
33、其从中删除。robots.txt:它是搜索引擎爬虫排除标准的默认实现。在这里没有列出的其它文件都是文档文件。图 1-5 sites 文件夹用来你 Drupal 所做的修改服务一个请求(ServingaRequest)当 Drupal 收到一个请求时都呢?如果对此能有一个概括性的了解,那么对以后的学习将会很有帮助,所以本部分将对这一框架提供一个简要的介绍。如果你也想追踪一下的话,使用一个好的调试器,从 index.php 开始就可以了,Drupal 的大多数请求都从这里开始。对于一个简单 web 页面,这里所列的序列看起来有些复杂,但这也是灵活性所必需的。Web服务器的(The Web Serv
34、ers Role)Drupal 运行在 web 服务器上,通常是 Apache 上。如果 web 服务器识别 Drupal 的.htaccess 文件,那么将初始化一些 PHP 设置,并启用简洁 URL。基本上对 Drupal 的所有调用都是从 index.php 开始的。例如,调用,将会经历以下步骤:1.首先,基于 Drupal 的.htaccess 文件中的 mod_rewrite 规则,对输入 URL 进行检查,并将基路径从路径中分离出去。在我们的例子中,路经就为 foo/bar。2. 将这个路径指定给 URL3. 最终的 URL 就为参数 q。14 / 4514.Drupal 把 fo
35、o/bar 作为 Drupal 内部路径,并在 index.php 中开始进行处理。这一流程的结果就是,Drupal 对和的处理方式是一样的,因为对于 Drupal 来说,这两者的内部路径是一样的。这就使得 Drupal 可以使用不带“?q=”的 URL了。这些 URL 被称为简洁 URL。在备选的 web 服务器中,比如微软的 IIS,可以使用一个 ISAPI 模块比如 ISAPI_Rewrite 来实现简洁 URL。IIS 7 及以后的版本可能会内置对重写的支持。引导指令流程(TheBootstrapProcess)引导指令流程(The Bootstrap Process)对于每个请求,D
36、rupal 引导指令本身都会经历一系列的引导指令阶段。这些阶段定义在 bootstrap.inc 中,在接下来的部分中,会为你描述处理流程。初始配置(Configuration)在这一阶段,将会填充 Drupal 的内部配置数组,并建立站点的基 URL($base_url)。通过 include_once()来settings.php 文件,任何已被覆写的变量或者字符串都可被应用了。文件中的“变量覆写”和“字符串覆写”部分。前期页面缓存(Early Page Cache)参看 sites/all/defauefault.settings.php在有些情况下,可能会需要更高水平的性能,甚至在建立
37、数据库连接之前,可能就需要要调用缓存系统了。前期页面缓存阶段,会让你(使用 include())包含一个 PHP 文件,里面带有一个名为 page_cache_fastpath()的函数,该函数接收内容并将其返回给浏览器。通过将 page_cache_fastpath 变量设置为 TRUE,就可以启用早期页面缓存阶段了,而包含进来的文件则通过将 cache_inc 变量设置为文件的路径来定义。具体示例可参看缓存一章。初始化数据库(Initialize Database)在数据库阶段期间,将决定数据库的类型,将建立初始化以供数据库使用。基于主机名/ID地址进行Drupal 支持基于主机名/ IP
38、 地址来(Hostname/IP-Based Access Control)主机(对站点的)。在阶段,会快速的检查请求是否来自一个被禁的主机;如果是,那么将拒绝。初始化会话处理(Initialize Session Handling)Drupal 利用了 PHP 内置的会话处理,但是它使用的基于数据库的会话处理器,覆写了 PHP 的一些处理器。在会话阶段,将初始化或者重新构建会话。代表当前用户的全局对象$User 也会在这一阶段初始化,不过出去效率的对象的所有属性都是可用的(当需要时,可以通过明确的调用函数 user_load()来加载这些属性)。后期页面缓存(Late Page Cache)
39、在后期页面缓存阶段,Drupal 会加载足够的支持代码,来决定是否需要从页面缓存中提供一个页面。这包括,把来自于,并不是数据库的设置合并到在初始化配置阶段创建的数组中,并且加载或者模块代码。如果在会话中显示请求来自于用户,并启用了页面缓存,那么将从缓存中返回页面,执行将在此停止。语言判定(Language Determination)在语言判定阶段,将会初始化 Drupal 的多语言支持,并基于站点和用户的设置,来决定为当前页面使用哪一个语言。Drupal 支持多种方式来判定语言,比如路径前缀和层的语言。15 / 451路径(Path)在路径阶段,将加载处理路径和路径别名的代码。该阶段使得用户
40、可读的 URL 被转化为 Drupal 路径,并处理 Drupal 内部路径的缓存和查找操作。完成(Full)该阶段是引导指令的最后一个阶段,它包括加载一个通用函数库,主题支持,和支持回调 ,文件处理,Unicode,PHP 图片工具集,表单的创建和处理,自动排序的表格,和结果集的分页。在这里将设置 Drupal 定制的错误处理器,并加载所有启用了的模块。最后 Drupal 调用 init 钩子,这样在对请求正式开始处理以前,将有机会通知相应的模块。一旦 Drupal 整个引导指令完成以后,那么框架中的所有部分现在都可以使用了。现在就可以获得浏览器的请求并将它委托给一个处理函数。在 URLs
41、和处理函数之间的,是使用一个回调登记来完成的,这个回调登记负责 URL和信息,参看第 4 章)。模块使用菜单钩子来它们的回调函数(对于浏览器请求的 URL,如果 Drupal 为其找到一个存在的转移给回调函数。回调函数,并且用户此回调函数,那么权将处理一个请求(Processing a Request)回调函数完成了流程所要做的事情,并收集完成请求所需要的数据。例如,收到了一个对内容的请求比如,URL 将被到 node.module 里面的函数 node_page_view()上。进一步的处理包括,将从数据库中取回该节点的数据,并将它放到一个数组中。接着,就到了主题化的时候了。主题化数据(Th
42、eming the Data)主题化涉及到将已被取回,操作过或者创建了的数据转化为 HTML(或者 XML 以及其它输出格式)。Drupal 将使用管理员选用的主题,来为网页提供一个合适的外观,并将生成的 HTML 返回给 web 浏览器。总结(Summary)读完本章后,你应该能大致的了解 Drupal 的工作原理,并对当 Drupal 为一个请求服务时都有个概念。对于该服务处理流程的各个部分,会在后面章节中作出详细介绍。16 / 451第 2 章创建一个模块(Module)法, 用来获得你想要的功能;但是在 drupal 中,一般在许多开源的应用中,你可以通过修改源代码来定制应用。这是不赞
43、成这样做,只有在万不得已的情况下才使用这段。修改源代码,意味着随着 Drupal 的每次更新,你必须要做的工作你必须测试一下你的修改是否还能正常工。代替的,Drupal 的设计从底层便考虑了模块化和扩展性。Drupal 是个非常精简的框架,用于构建各种应用,其默认安装通常被称作为 Drupal。如果你需要向 Drupal添加功能的话,那么可以通过启用模块来实现,而模块则是一些包含 PHP 代码的文件。模块放置在你的 Drupal 安装的子目录 modules 下面。现在看一下这个子目录,然后导航到“管理站点构建 模块”,比较一下子目录下的模块与管理界面上模块列表中的模块。在本章,从头开始创建一
44、个模块;在你创建模块时,你将学到模块必须遵守的一些标准。我们需要一个现实的目标,所以让我们考虑以下现实中的注释问题。当用户在 Drupal上浏览内容时,如果管理员启用了评论模块,那么用户可能会对内容评论。但是如果是在一个网页上添加一个注释(一种仅有用户可见的笔记类型),那该怎么样?这对私密的内容评审可能非常有用(我知道这看起来可能有点做作,但是大家还是一下吧)。17 / 451§§§§§§§§§§§§创建相应的文件实现一个钩子添加特定于模块的设置添加数据输入表单把数据到数据库
45、表中定义你的管理部分为用户呈现一个设置表单验证用户提交的设置设置使用 variable_get()来取回的值篇外话总结18 / 451创建相应的文件首先我们要做的是为模块起一个名字。名字“annotate”看起来还是比较合适的简洁而生动。接着,我们需要找个地方来放置这个模块。我们可以把这个模块放在模块所在的目录中去,不过这样的话,我们需要记住哪些是模块,哪些是我们的模块,这样一来,就增加了维护成本。让我们把它放在目录 sites/all/modules 下面,以将其与模块区来。如果 sites/all/modules 不存在,那么首先需要创建它。接着在 sites/all/modules 下面
46、在创建一个名为 custom 的目录,然后在 sites/all/modules/custom 下面创建一个名为annotate 的目录。这样就可以将你开发的自定义模块与你的第 3 方模块区了。如果有一天,你需要将你的委托给另一个开发者,那么这一点还是很有帮助的,不过是否将它们区 来,取决于你的决定。我们创建的是一个子目录,而不是一个 annotate.module 文件,这是因为在我们的模块中, 除了模块文件以外,我们还需要一些其它的文件。比如我们需要一个 README.txt 文件,用来向其他用户解释我们的模块是做什么的,以及如何使用它,还有一个 文件用来向 D
47、rupal 提供一些关于我们模块的信息。准备好了吗?现在让我们正式开始。我们的 文件内容如下:; $Id$name = Annotatedescription = Allows users to annotate nodes. core = 6.xpackage = Pro Drupal Development这个文件的格式非常简单,在这里一个键对应一个值。我们从版本管理系统(CVS)的标识开始。如果我们想和其他用户这一模块,通过将它提交到 Drupal 的第 3 方模块库中,这个值将会被 CVS 自动替换。接着,我们为 Drupal 提供了一个名称和一个描述,用来
48、显示在的模块管理部分。我们明确的定义了我们的模块所兼容的 Drupal 主版本;在这里,就是版本 6.x。Drupal 6 以及以后的版本将不启用不兼容的模块。模块是按组来显示的,而组的划分是由包(package)决定的;这样,如果我们有 3 个不同的模块,它们都有 package=Pro Drupal Development,那么它们将被放在同一组中。除了前面所列的这些,我们还可以指定一些可选的值。我们再看一个例子,下面的这个模块,它需要 PHP5.2,依赖于和分类模块:; $Id$name = Forum confusiondescription = Randomly reassigns
49、replies to different discussion threads. core = 6.xdependencies = forum dependencies = taxonomypackage = "Evil Bob's Forum BonusPak"php = 5.219 / 451注意 你可能会想,为什么我们需要一个单独的.info 文件呢?为什么不在我们的主模块中写一个函数来返回这些元数据呢?这是因为在加载模块管理页面时,它将不得不加载并超出分配给 PHP 的内存上限。每一个模块,不管有没有启用,这比需要的内存并且可能通过使用.info 文件,可以
50、更快的加载信息并使用最小的内存。现在我们准备好创建一个实际的模块了。在你的 sites/all/modules/custom/annotate 子目录下面创建一个名为annotate.module 的文件。在文件的开始出使用 PHP 的开始<?php/ $Id$/* file* Lets users add private annotations to nodes.* Adds a text field when a node is displayed* so that authenticated users may make notes.*/和一个 CVS 标识,并紧跟一个注释:首先,
51、让我们看一下注释的风格。我们从/*开始,在接下来的每一行中缩进一格并以*开头,最后以*/结束。令牌file 意味着在接下来的一行是一个描述,给出这个文件的用途。模块 api.module,Drupal 的自动化文档提取器和格式器,可以使用这一行描述来找出这个文件的用途。空了一行以后,我们为可能检查(并且改进)我们代码的程序员提供了一个更长的描述。注意,我们在这里有意的不使用结束 ?>这对于 PHP 来说是可选的,如果包含了它,就可能导致文件的尾部空格问题(参看)。注意 为什么我们在这里这么详细的讲述每一个细节?这是因为,如果来自世界各地的成百上千的人开发同一个项目的话,如果大家采用一种标
52、准的方式,将会节省大量的时间。关于 Drupal 的代码风格的更详细的内容可以从 Drupal 开发用户手册的“代码标准”一节中找到()。下面我们要做的就是定义一些设置,这样我们就可以使用一个基于 web 的表单来选择哪些节点类型可以添加注释。这需要两步。首先我们定义一个路径,用来我们的设置。然后我们创建设置表单。实现一个钩子回想一下,我们曾经说过 Drupal 是建立在钩子系统之上,有时候钩子也被称为回调。在执行的过程中,Drupal 询问模块看它们是不是想要做些事情。举例来说,为了判定哪一个模块负责当前的请求,它向所有的模块询问是否提供了相应的路径。通过创建一个所有模块的列表,并且调用每个
53、模块中名为:模块名+_的函数,来实现这一点。当它遇到我们的 annotate模块时(应该会比较早的遇到,因为模块列表默认是按照字母顺序排列的),它调用函数 annotate_(),后者返回一个包含菜单项的数组。每一项(我们这里只有一项)都以路径为键,在这里就是 admin/settings/annotate。菜单项的值是在该路径被请求时 Drupal 要做什么的。这方面的详细,可参看第 4 章一个数组,里面包含的键和值是,该章讲述了 Drupal 的菜单/回调系统。下面给我们模块添加点内容:20 / 451/* Implementation of hook_*/().function anno
54、tate_() $items'admin/settings/annotate' = array( 'title' => 'Annotation settings','description' => 'Change how annotations behave.', 'page callback' => 'drupal_get_form','page arguments' => array('annotate_admin_settings
55、'),'access arguments' => array('administer site configuration'),'type' =>_NORMAL_ITEM,'file' => 'annotate.admin.inc',);return $items;此 时 不 要 过 于 关 注 这 里 的 具 体 细 节 。 这 段 代 码 说 , “ 当 用 户页 面时, 调用函数 drupal_get_form, 并向它传递了一个表单 ID annotate_admin_settin
56、gs,在文件 annotate.admin.inc 中查找描述该表单的函数。只有具有管理站点配置权限的用户才 查看这个菜单。”当需要显示表单时,Drupal 就会让我们提供一个表单定义(一会儿就对这一点详细讲解)。当 Drupal完成了向所有的模块询问它们的菜单项时,它就为正被请求的路径找到一个菜单,根据这个菜单就会找到一个要被调用的函数。注意 如果你对钩子机制感的话,参看文件 includes/module.inc 里面的函数 module_invoke_all()。现在你应该清楚我们为什么把它叫作 hook_Drupal 钩子。()或者菜单钩子了。可以通过在钩子的名字前加上你的模块名来创建
57、提示 Drupal 的钩子几乎你修改这个软件的任何方面。你可以在 Drupal 的 API 文档站点()上,找到 Drupal 钩子的完整列表和它们的使用说明。添加特定于模块的设置Drupal 有多种不同的节点类型(在用户界面称之为内容类型),比如 Story 和 Page。我们想将注释的使用限定在特定的一些节点类型上。为了实现这一点,我们需要创建一个页面,在里面告诉我们的模块我们想注释哪些节点类型。在该页面,呈现一组复选框,每一个复选框就对应一个已有的内容类型。这样终端用户就可以通过选中或者取消选中复选框(如图 2-1 所示),就可以决定哪些内容类型可被注释。这样的页面就是一个管理页面,只有在需要的时候才加载和该页面的代码。因此,我们把代码放在了一个单独的文件中,而不是放在我们的 annotate.module 文件里,而对于每个web21 / 451请求,都会加载和运行 annotate.m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年同学聚会策划方案
- 2025年第一季渣打香港中小企领先营商指数报告
- 2025年电工收缩带项目可行性研究报告
- 2025年玄米茶项目可行性研究报告
- 2025年牛蹄筋串项目可行性研究报告
- 2025春新版三年级下册科学•必背知识点考点
- 荆楚理工学院《管理统计》2023-2024学年第二学期期末试卷
- 江西工程学院《声乐(2)》2023-2024学年第一学期期末试卷
- 珠海科技学院《体育与生存》2023-2024学年第一学期期末试卷
- 湖南工程学院《英语视听说四》2023-2024学年第二学期期末试卷
- 2025年高考作文备考训练:知足与进取(附思路指引、立意参考、结构建议、4篇范文示例)
- 社区文化活动服务行业跨境出海战略研究报告
- 2025年第33批 欧盟REACH SVHC高度关注物质清单247项
- 碳中和目标下的公路建设策略-全面剖析
- 2025年山东省东营市广饶县一中中考一模英语试题(原卷版+解析版)
- 地面推广协议
- 雷雨剧本文件完整版电子书下载
- 工贸行业隐患排查指导手册
- GB/T 36187-2024冷冻鱼糜
- 2023年江苏省五年制专转本英语统考真题(试卷+答案)
- 20S805-1 雨水调蓄设施-钢筋混凝土雨水调蓄池
评论
0/150
提交评论