一切福田,不離方寸,從心而覓,感無不通。

Druapl7权威指南

第一部分

入门

   第一章

■■■

建立一个drupal7站点

本杰明 梅兰肯 丹 哈基姆扎德 达妮 诺丁著

“好吧,我们能用艰难的方法完成这事,或者我们可以用Drupal的方法完成这事。”

                                                                                                                                    弗莱斯特 玛斯(红茶菌)

本书通过介绍使用Drupal 7创建网站的所有各个方面的内容,将会使你在Drupal的学习中少走弯路:它将会涉及结构和配置,模块开发,前台开发,持续运行项目,以及贡献Drupal的代码,文档,还有社区等等。

在第一章中还有什么比创建一个完整的站点更好的方法开始呢?在27页中,你要每小时从零点走到60英里(或每小时100公里,视情况而定)。在后面的章节中,你要使用Views【视图】的动态页面添加涡轮增压器,主题化赛车的条纹;以及Jquery奖杯的获得者;你还要执行一些商业方面花哨的练习等等。

在整本书中,我们将设法引导你以Drupal的方法做事。从来就没有只有一种方法能达到目地,但是有些方法忽视乃至反对Drupal的产品。相比之 下,Drupal的方式在Drupal的优点基础上是任何方式无法相比的。(第8章讲述了其中的优点之--一个活跃的在课程中能够持续给你提供帮助的社 区。)

在本章中你要创建的这个站点会允许用户轻松地创建和分类内容。方案不是假设的。本书需要一个网站,而你正在创建它!你将要:

•使用基本方法规划一个站点。

•安装Drupal 7。

•配置Drupal核心,提供一个面向协作的站点,接受作者和观众的内容和评论。

•把该站点和它的首页静态(半永久性)内容和最近更新进行组合。

•给作者和观众不同的添加和编辑内容的访问级别。

这仅仅是第一章,所以就到这儿吧!

规划:设置参数和了解你所在的位置

在开始做任何项目之前,你应该对它需要什么有些了解,如果只设置一些你要输入的参数。适当提交的关键是设置预期。(关于使用灵活的方法规划和管理方面更多的内容参见第九章)。

发现:为什么要建这个站点?

开始一个项目时,要弄清楚的第一件事情不是如何去做这件事情,而是为什么要做这件事情。发现这个目标的过程是一个项目的发现阶段,它精确地解释了本书中的介绍和第9章中进一步的论述。

■提示  虽然很明显,但是极为重要的发现阶段有时很少受到关注。即使是只为你自己建立的一个网站,也应该以确定你的目标开始。忽略这个步骤可能意味着当了解的需求发生变化和在这个过程的后期发现了新的需求时会重复进行所有其他的阶段。

询问站点发起人(作者)有关他们对该站点透露的目标,他们希望人们获得更多有关Drupal7权威指南的知识,并且他们希望该站点可以帮助交流,并且在多个作者、读者,和感兴趣的Drupal人士【Drupalistas】之间合作。

总的来说,DefinitiveDrupal.org网站(以下简称为DGD7站点)将会补充本书的目标,其中包括以下:

 

•给人们提供各种各样大量使用Drupal的技巧背景环境。

•帮助人们学会如何更加了解他们自己。

•鼓励那些对Drupal软件感兴趣,参加社区,可能会做出软件的人们。

本书要达到的目标,要是人们购买本书它可以提供帮助,因为所有网站访问者一定能够看到有关本书的基本信息,挑选和奖励内容,以及图书购买信息。作者必须能 够添加,编辑,并安排这些信息。人们必须能够对本书中包括的概念或将来的版本提出意见。以后,本书的读者必须能够发表评论或对特别章节询问问题。(这些交 互的结构表单会比联系表单或站点范围论坛的作者更加合理利用。)站点必须能够扩展新的功能以及新的内容,当添加了有关Drupal重要的新信息时,游客必 须能够登入收到更新。

第二部分:网站建设基础】

第3章 使用views创建动态页面

视图改变了我的生活。如果你已经建立了一段时间的动态网页,有两个任务要重复执行。建立内容,并存在一个数据库里,然后将内容调出来建立网页。后面的请求常常需要复杂的公式,稍有差错就将返回错误的项目,或者更有可能,什么都没有。

视图模块让你更轻松地为显示内容子集,甚至是合并多种内容类型,制定标准。你还能得知显示数据的格式.新的内容添加到网站,由此产生的视图则是动态更新的,以反映新的内容.它可以帮助你做到这一切,而不需要编写任何代码。视图改变了我的生活,谢谢!现在是时候改变你的了!

什么是Views?

该名称来自数据库术语。数据库视图是一个复杂的存储查询,使用起来就像是数据库中的表格。当您在数据库视图里查询项目的时候,您用您需要的方式得到您需要的东西。

Drupal视图的工作方式是类似的,但是他们让您用的是一个图形用户界面去创建数据库查询。如果您建立了Drupal视图,该模块会为您编写查询,所以您根本不必知道任何相关的数据库管理。

视图模块是由迈尔斯设想,创建并维持的(drupal.org上的merlinofchaos)。所有可下载的版本、文件和列队均可在drupal.org/project/views的工程网页上找到。

该工具本质上是一种智能查询生成器,给予了足够的配置,可以建立正确的查询,执行它,就能显示结果。

撇开别的不说,视图可以用来生成报表,创建摘要,显示图像和其他内容的集合。

--摘自drupal.org/project/views

就像Drupal本身,视图模块提供了强大的功能。只需要点击几下,您就可以放一个板块到您的主页上,罗列网站的新内容。再点几下,您就可以将之变成一个选项卡式菜单,第一个标签显示您网页上最流行的内容,第二个便签显示最新评论,第三个则罗列最新成员。

该视图模块在动态网站上提供了一个发电机。它使您的工作(建设网站,特别是维护网站)更轻松更强大。可以很轻松地写一本关于视图的书,并不觉得无聊。

出于这些原因,本章该学到的本质不是在视图的帮助下你能做什么,或者是如果去做,而是该如何用简便的方式去做,使您维护网站起来更便利,并将责任传 递给下一个人。换句话说,我希望您真正学到的是过程,标签,面熟命名约定。一旦学到这些,您将能够想象并用视图建立几乎所有的东西。

运用Views的例子

以下只是视图的普通运用:

最新5篇新闻稿

活动预告

某人写的所有帖子(类似博客)

每月存档的内容

管理用的内容列表(见图3-1)

以下只是视图的普通运用:

最新5篇新闻稿

活动预告

某人写的所有帖子(类似博客)

每月存档的内容

管理用的内容列表(见图3-1)

图3–1. 管理用的内容列表示例

您真的可以展示任何类型的内容,也可以引进相关的内容。如果该内容在数据库中,您可以使用试图模块来展示。

视图展示的最普遍的类型是网页和板块。网页的话,您可以指定输出到它自己的URL。板块的话,您可以将输出放在网站的任何页面的任何区域。

视图模块的下载,启用和配置权限

为了使用视图开始开发,你需要以下标准程序来下载并启用模块。

下载

访问Drupal。org/project/views。往下滚动到下载部分,您可以看到名为“推荐版本”的一个绿色表题。选择与您已安装的Drupal版本(比如7。x-3。x)相匹配的格式(tar。gz或者zip),点击下载链接。

解压文件,并把它们放到贡献模块的目录里。对大部分开发者来说,这个在sites/all/modules/contrib。,或者在sites /all/modules。于是您可以在sites/all/modules/contrib/views或者sites/all/modules /views找到所有的试图文件。(Drush,第2长涉及到,可以为您下载放置文件。)

启用

在您的网站上,确保您是用有权限的账号登陆到管理员模块,或者具有管理员角色的账号(或用户/1)。使用顶部的管理菜单并点击“模块(管理/模块)”。

下拉滚动条到视图字段设置。您将看到三个模块:视图,视图输出和视图用户界面。

在视图模块定义下面,您可以看到CTools是一个视图工作所需的模块。如果您已经下载了CTools模块并在网站上启 用,你可以看到“已启用”的文本。如果您已经下载了CTools,但尚未启用,文本则显示“缺失”。如果您的网站文件中不具备所有的信赖,Drupal将 不允许您启用模块。

如果您还没有这么做,请从工程网页drupal。org/project/ctools下载CTools模块。解压文件 并将ctools文件夹放在贡献模块目录里。对大部分开发者来说,这个在/sites/all/modules,所以您可以在sites/all /modules/ctools里找到所有CTools文件。

请注意,CTools是一个为其他模块提供辅助代码的模块。

回到模块页面(管理/模块),点击刷新。下拉滚动条到视图字段设置。CTool信任文本应该为“已禁用”。有了所有需要的文件,您现在可以启用视图。点击视图和视图用户界面的复选框,然后保存配置。

我们后面将在本章讨论视图输出。

图3-2。模块列表管理页面。所需模块已下载,但尚未启用。

Drupal知道该视图模块需要启用另一个模块并通知您。

您必须启用CTools模块来安装视图用户界面。

您希望继续吗?

请“继续”。

配置权限

Drupal所提供的功能之一是能够将权限授予不同的角色,在第1和第8张涉及到。大多数模块都与权限相关。您的网站用户不是匿名用户,就是验证用户,当然也有可能还有其他其他授予的角色。

提示启用任何一个模块后,最好马上配置权限。如果等到开发结束后才配置,会导致超量的权限审核。

在顶部的管理菜单,点击“人们”。在该页面上,点击权限标签。下拉滚动条至底部,找到视图部分。视图模块有两个权限“管理员视图”和“所有视图”。

请注意:您也可以在模块管理页面使用视图权限链接。您将直接进入权限页面的视图部分。

“管理视图”将访问视图管理页面,用户将可以创建,编辑或删除视图。请将该权限授予合适并能正确使用的用户。大部分“管理”权限只给管理员角色。

“跳过视图访问控制”是另一个必须谨慎使用的权限。对于某个特定的视图,你可以指定某些角色可以看到结果。为某一角色选择“访问所有视图”权限则可以忽视该设置。我们建议只将该权限授予合适并能正确使用的用户,比如您的网站管理员。

确认没有为验证用户和匿名用户角色选择这两种权限。

确认为管理员角色选择这两种权限。如果做了任何修改,请点击保存权限。

在开发过程中,请务必用不同的用户查看网页,确保各角色按照权限设置拥有正确的用户体验。用三种不同的浏览器打开,分别展示不同的角色,比如再火狐 是管理员,Chrome是验证用户,在IE是匿名用户。您需要用不同的浏览器登录每种角色,因为浏览器在打开窗口/标签共享您已经登录的账号。

恭喜!您已经成功下载并为视图模块配置权限。您现在可以管理视图了

第四部分:前端开发

第15章:主题化

Drupal的 主题层,以及主题使用到的,是负责外观或者一个Drupal站点给人的感觉。你会发现一些有名的网站上优秀的主题都包含一些相同的元素,具有符合标准的 XHTML标记,CSS和JavaScript。这些是如何组合在一起的?是什么如此特别,是什么让Drupal的主题如此灵活和强大呢?

Drupal主题可 以依据你的需要,既可以很简单也可以很复杂。主题具有对每个页面几乎所有部分的最终的决定权和控制权。和Drupal本身一样,主题也很灵活、很强大。无 可否认,充分利用Drupal的主题层意味着要克服一个相当陡峭的学习曲线,如果对引擎的内部机制不够理解的话,很容易在开始时犯一些错误。

在本章,你将学习一些关于Drupal主题层的基础知识。你将学习如何去定制和合理修改以及常见任务的最佳做法。您将用自己的方式在任何时间创建灵活和可持续定制的Drupal主题!下一章将在这个基础上创建更加深入复杂的Drupal主题。

本章和下一章的一些例子你可以在DGD7主题里找到。如果你想跟进的话,可以到这里https://github.com/jacine/dgd7去下载。

开启和设置一个默认主题

在一个全新安装的drupal7中,默认的主题(Bartik)出现在“外观”页的顶部,其次是启用和禁用的其他主题(见图15-5)。什么是默认主题?对Drupal来说,仅仅开启一个主题是不够的。设置一个主题作为默认主题就是让它成为前台主题(也就是你的站点访问者可以看到的主题)。

图15-5. 默认安装下外观页面展示开启的主题。

当你想一次同时利用多个主题时,开启一个主题而不设为默认主题是很有用的。当此设置与贡献模块一起使用时是更有益的。这 样的例子如SwitchTheme模块(http://drupal.org/project/switchtheme),它允许用户从所有启用的主题名 称列表中切换主题。

管理主题

在drupal7中,Seven主题是默认的管理主题。管理主题通常用在执行管理任务时,其中大部分是发生在“/admin”路径下。你也可以选择允许在编辑站点内容时用管理主题。虽然有些主题比其他的对Drupal管理界面支持的更好,但是如果需要的话所有的主题都可以用来作为管理的主题。

管理主题的配置位于“admin/appearance”页面主题列表的下面。如果想同时在前后台都用一个主题,只要将默认的主题设置为管理主题即可。

全局主题设置

Drupal自 带的一些主题设置,可以在管理界面配置。这是大部分网站定义个性化的地方,以及一些其他设置。全局设置页位于“admin/appearance /settings”路径下包含这些设置。当个别主题的设置页面上应用主题设置时,它们将覆盖全局设置。以下章节将详细介绍这些,以及在你的主题什么地方 会碰到。

其中一些设置确定是否将位于模板文件中的变量因此输出出来。在图15-6中描绘的设置代表Drupal提供的默认值。这 些都可以通过定义主题中的info文件里定义features来覆写,这将在“定义主题元数据”一节中进一步讨论。当在info指定一些功能时,你需要确 保包含了所有你将要支持的功能,如只是一个的话,将会覆盖所有Drupal提供的默认值。以下是他们会在info文件中一些设置的快速参考:

features[] = logo

features[] = name

features[] = slogan

features[] = favicon

features[] = main_menu

features[] = secondary_menu

features[] = node_user_picture

features[] = comment_user_picture

features[] = comment_user_verification

图15-6. 全局设置页面

Logo

默认情况下,Drupal会在主题的根目录下寻找一个名为logo.png的文件。另外也有一个选项可以指定一个不同文 件的路径作为logo,也可以上传一个logo。当Logo复选框选中时,一个叫做$logo的变量,它的路径将会输出在page.tpl.php里,若 没有选中,logo将不会输出。

名字和口号

网站的名字是在安装过程中定义的。站点名字和口号都可以在“admin/config/system/site- information”页面进行修改。在主题设置页,你可以切换他们是否可见。两者都可用在page.tpl.php中,分别为$site_name 和$site_slogan。

快捷图标

快捷图标,也称为favicon,是一个Drupal的小图标,出现在地址栏、书签和大多数浏览器的标签。和标志一样,快捷图标可以切换是否可见,也可用自定义的文件。默认的文件是“misc/ favicon.ico”。

在发布和评论中的用户图片

这些设置控制变量$user_picture和变量$picture是否分别在node.tpl.php和comment.tpl.php里输出,从而决定当查看节点和评论时图片是否显示。

评论中的用户验证状态

当用户没有一个验证的账号时,此项将显示在用户名字的旁边“(未验证)”。该文本是在 template_preprocess_username()函数中定义,作为变量$variables[‘extra’]打印在 theme_username()函数中。见“预处理和处理函数”和“主题函数”部分,了解如何改变它。

主菜单和次级菜单

当主菜单和次级菜单的复选框被选中时,变量$main_menu 和$secondary_menu就会以数组形式包含每个菜单的菜单链接在page.tpl.php中输出。在位于“admin/structure /menu/settings”菜单设置页,你可以选择每个用于哪个菜单。默认情况下,主菜单是用作填充$main_menu源的,可以通过在 “admin/structure/menu/manage/main-menu”页来管理。默认的次级菜单源用作用户菜单,可以在“admin /structure/menu/manage/user-menu”页来管理。

这些都是在page.tpl.php中使用theme_links()函数(将在本章稍后介绍)简单的单级菜单输出。

这使得他们很难样式复杂的导航设计时使用。因为往往需要复杂的导航的,很多主题开发人员为导航创建区域和使用的区块来输 出菜单,而不是使用这些菜单。我们强烈推荐Menu Block模块(http://drupal.org/project/menu_block),它允许你很容易地去使用菜单做几乎任何东西。

自定义主题设置

自定义主题设置与全局主题设置很相似,它可以由主题或者模块来提供。一个自定义主题设置的例子可以在Garland主题 中的garland.info文件里看到。它创建了一个叫做“garland_width”的可以用来设置固定或者流体的设置。快捷方式模块还提供了设置 在Seven主题里的遮罩层内的标题旁边提供小图标以显示“添加或删除快捷方式链接”。要学习如何为您的主题创建自定义主题设置,请访问 http://drupal.org/node/177868。

安装一个新主题

Drupal会 到它的主题目录去扫描可用的主题,因此将你的主题放在正确的目录下,这样Drupal才能识别它。你也有可能将新增的主题放置到Drupal的 “/themes”目录下,但从技术上来讲,这被认为是“破坏核心”,并且应当避免。在下载和解压你的主题之后,选择以下哪个目录来放置主题。使用其中任 何一个目录都可以帮你确保Drupal自身的任何升级不会覆盖你的主题。

sites/all/themes:当你想为你的Drupal中的所有站点安装使用这个目录的主题时。

sites/sitename/themes:提供给你的Drupal多站点安装在特定的网站上时。

您也可以使用主题安装程序,点击“外观”页的顶部安装新的主题链接,下载并安装来自贡献的主题。这将使你在这里您可以进 入链接到项目下载的压缩包的位置,并单击“安装”。主题安装程序会自动下载你的主题,并放置在“sites/all/themes”目录。一旦完成,您可 以像往常一样在“admin/admin/appearance”页上来启用主题。

与区域一起工作

在Drupal页 面中所见到的大多数内容是输出在一个区域里的。典型的区域包括header、footer、 sidebar以及content(见图15-8);这些区域往往在定制高级的HTML标记结构时经常用到。在“admin/structure /block”页,区块中有一个选项可以设置显示到每个区域,允许网站的管理员控制和放置区块显示在里面。

图15-8. Bartik主题的区域以及在区块管理页面中的区块放置选项。

在区域的自定义和处理输出和美化上,主题具有充分的控制权。比如,在图15-9就给出了在Bartik主题里关于这方面的一个例子。

图15-9 Bartik区域里填充着定义的区块。

另外,还有一个不太显著的用途,主题有可能也会利用区域与JavaScript或者Jquery配合。常见的用例,包括包含模式或者隐藏某些内容来提升用户体验,或者将区块嵌入到节点内容里。

默认区域

默认情况下,Drupal核 心通过程序为主题定义了9个区域。在清单15-2中的代码复制出了以“.info”文件格式默认区域。和大多数的主体层实现原理一样,主题定义区域的原因 是因为他们想要修改或者添加到默认值。除非某个主题定义了它自己的区域,否则Drupal将使用默认的区域。这意味着,假如默认的区域足以满足你的设计, 那么你将不需要在你的“.info”文件里定义区域。

清单15-2 Drupal的9个按时间顺序排列的预定义的主题区域

regions[page_top] = Page Top

regions[header] = Header

regions[highlighted] = Highlighted

regions[help] = Help

regions[content] = Content

regions[sidebar_first] = Sidebar First

regions[sidebar_second] = Sidebar Second

regions[footer] = Footer

regions[page_bottom] = Page Bottom

然 而,在主题的“.info”文件开头包含这段代码是个不错的做法。倘若你仅定义一个区域的话,它将会覆盖核心默认的,因此保持默认区域的完整列表,注释掉 已禁用的区域(而不是完全删除或者忽略)是一个很好的方法,可以跟进将用它们来做什么。其中的一些区域可能会需要,比 如:page_top,content,page_bottom这些区域。对于正常运作的网站,这些是必需的且必须在每一个Drupal主题输出的。一个如何组织“.info”文件中的区域的例子,且考虑到默认设置,如清单15-3 所示。

清单15-3. 一个在“.info”文件中实现区域的例子

; 核心区域 – 禁用的

;regions[highlighted] = Highlighted

;regions[help] = Help

;regions[header] = Header

;regions[footer] = Footer

; 核心区域 – 需要的

regions[page_top] = Page Top

regions[content] = Content

regions[page_bottom] = Page Bottom

; CORE REGIONS

regions[sidebar_first] = Sidebar First

regions[sidebar_second] = Sidebar Second

; CUSTOM REGIONS

regions[my_custom_region] = My Custom Region

提示:如果对Drupal在哪里定义默认区域感兴趣,不妨看看“_system_rebuild_theme_data()”函数,地址在http://api.drupal.org/_system_rebuild_theme_data。

如图15-10所示,展示的Drupal默认区域是一个标准的三栏布局。灰色的区域是必须的,而其余的是可选的。Header、 sidebar_first、sidebar_second、footer是布局方面的区域。page_top和page_bottom是特殊区域;它们 将在本章的“隐藏区域”部分讨论。

图15-10. Drupal的默认布局区域

Highlighted(高亮)区域取代了过去的站点任务(Mission),它过去是一个包含站点任务状态的静态变量,或者是一个在 page.tpl.php中手动输出简短的摘要文本。过去实施不够理想有多方面原因,但是最主要是因为仅显示在首页。所以说,使用自定义的区块来显示此信 息是一个更好的选择,因此创建了highlighted区域。

Help(帮助)区域曾经也是page.tpl.php中的变量,用于输出错误和状态信息。现在状态信息放在一个称为“系统帮助”的区块中,同时Help区域用于放置它。但是“系统帮助”区块可以很容易地放在内容区域中,权重设置高于内容区块也能达到同样的效果。

内容区域是drupal7新增的。据介绍,包含页面主要内容的区块,有一点比较特殊,就是它可以在区域之间切换,但是不能被禁用。

定义主题元数据(.info文件)

.info文件(读作“点info文件”)包含关于你的主题的元数据,例如,主题的名字,Drupal支持的哪个版本,以及一些如样式表和主题将包括的区域等。书写info文件通常是是创建一个主题的第一步。

文件的第一部分名字通常是机器识别的主题的名称,它是Drupal用来存储关于你的主题到数据库的信息。破折号和其它特 殊字符是不允许的。虽然下划线是被允许的,但是通常认为最佳的做法是避免使用它们命名你的info文件。使用themename.info而不是 theme_name.info。当进行主题函数覆写时,这个名字也用于函数名字的前缀。当覆写theme_menu_link()函数时,比如,当试图 确定覆写正在被执行时,函数名themename_menu_link()通常比theme_name_menu_link()更容易阅读。

注意:你的主题(机器)名字必须唯一的。不要让你的名字与已有的模块重名,因为这样有可能会导致命名空间问题和增加追踪下载PHP错误的难度。

每个主题依赖主题的info文件中的一些基本属性。名字、核心和引擎属性都是Drupal主题最起码的要求。下面章节将包含每个可选属性的概述,并且带有语法说明。

提示:为了给info文件添加注释,在每一行的开头添加一个分号,像这样:

;这是一条注释。注释非常好。经常去使用它。

必要属性

Core:Drupal将仅当你的核心设置为支持当前的Drupal主版本时,才允许你的主题可以被开启。主版本仅仅是6.x,7.x或者8.x等。

core = 7.x

Name:人类识别的主题名字。它不需要与机器识别的名字一致或者相似,这里可以自由创建。

附加属性

Base theme(基主题):Drupal允许主题间设立一点关系。创建一个子主题,它可以继承基主题(详见下一章)的功能和优点。创建子主题时,需要指定基主题。在这里用的基主题的机器名很重要。

base theme = themename(主题名称)

Description(描述):是指主题的基本功能或用途需要在此说明。描述将被显示在“admin/appearance”页面,描述也可以包含HTML。

description = The description of my theme(我的主题描述)

Engnine(引 擎):指定主题引擎。PHPTemplate是默认和最常用的,所以除非你想改变它,没有必要去手动设置。其他选项包括一个纯PHP主题的醒目和主题(比 如,到http://drupal.org/project/chameleon看一下Chameleon主题)。

engine = phptemplate

Features(功能):设置功能是覆写Drupal全局主题设置的一种方法。下面是Drupal默认主题设置的一个列表。这些设置可以在每个主题设置页面的主题界面上进行开关的切换。甚至指定禁用Drupal默认的而使用你的。

features[] = logo

features[] = favicon

features[] = name

features[] = slogan

features[] = node_user_picture

features[] = comment_user_picture

features[] = comment_user_verification

features[] = main_menu

features[] = secondary_menu

PHP:Drupal 7支持PHP 5.2.5版,默认情况下你的主题也是如此。这一点,你可能永远不会需要,但万一你的主题包含只有一定PHP版本的代码,你可以在这里指定。

php = 5.3

Regions(区域):区域是页面用来放置内容(区块)的地方。每一条 都是以“regions”为前缀,括号中为区域的系统名称,最后以人类可读得名称作为值。例如:regions[system_name] = Human readable name(人类可读的名字)。默认的区域如下:

regions[page_top] = Page Top

regions[header] = Header

regions[highlighted] = Highlighted

regions[help] = Help

regions[content] = Content

regions[sidebar_first] = Sidebar First

regions[sidebar_second] = Sidebar Second

regions[footer] = Footer

regions[page_bottom] = Page Bottom

Settings(设 置):设置属性是用来储存主题中的自定义实现的。Garland主题提供了设置站点管理员可以选择布局的类型(固定或者流式)。虽然我们不会包含自定义主 题的设置,但是我们强烈建议查看Omega(http://drupal.org/project/omega)和Fusion(http: //drupal.org/project/fusion)主题,来了解主题设置如何使用的。更多信息,请查看http://drupal.org /node/177868。

settings[garland_width] = fluid

Screenshot(截图):Drupal会自动在主题根目录下查找叫做“screenshot.png”的文件,所以此行只有在你需要使用一个主题截图替代路径或者文件名字时才是必须的。截图的推荐推荐尺寸是294 x 219像素。

sceenshot = screenshot.png

Stylesheets:Drupal 7 中有相当多的方式来加入CSS文件。如果你想在每个页面都加载CSS文件的话,你可以在主题的info文件中添加css。在下一章中的“管理CSS文件”部分将会详细介绍。

stylesheets[screen][] = path/to/screen-stylesheet.css

stylesheets[print][] = path/to/print-stylesheet.css

Scripts:JavaScript文件可以在info文件中使用scripts属性来定义。和样式表相似,当你需要在每个页面都加载某些JavaScript文件时。

scripts[] = path/to/script.js

version:贡献的主题和模块都是不提倡定义版本的。这是因为drupal.org有一个包装脚本,在发行新版本时,用来详细控制添加版本。当然,如果需要的话,你可以在自定义的主题中使用它。

version = 7.x-1.1

现在我们就通过实例看一下你的DGD7主题下初步的样子,如列表15-1中所示。

列表15-1。DGD7主题info文件的顶端部分

name = DGD7 Theme

description = A theme written for The Definitive Guide to Drupal 7 book website.

core = 7.x

核心的属性除外,所有上述的都可以在“admin/appearance”页面的用户界面中看到,如图15-7所示。这是你展开主题所需要的。

图15-7. DGD7主题显示在主题列表页admin/appearance上。

创建你的第一个主题!

根据到目前为止所学到的,创建一个自定义的主题:

1. 通过在“sites/all/themes”目录下创建一个名为dgd7的文件夹开始。

2. 在dgd7文件夹下,创建一个名为dgd7.info的文件,同时将加入以下代码:

name = DGD7 Theme

description = A theme written for The Definitive Guide to Drupal 7 book website.

core = 7.x

3. 从本章的源代码文件中取得screenshot.png并复制到dgd7文件夹下。这一步是可选的。如果没有定义截图,将会以“没有截图”来代替。

4. 现在访问并重新加载admin/appearance页面,你将看到该主题位于“禁用的主题”之列。点击“启用并设为默认”链接开始在你的站点上使用该主题。

提示:你需要清除你的网站的缓存来让info文件中的改动生效!若想清除网站的缓存,请查看位于“admin/config/development/performance”的性能页面。

第五部分:后端开发

第18章

■ ■ ■

模块开发引言

by Benjamin Melancon

截至到现在,你知道Drupal是一个强大的,高度模块化的系统。实际上,drupal的强大动力来自于它的众多模块,把很多强大功能添加到drupal基础系统当中。

怎么把你的起初想要的特定功能加入这个系统中呢?你可以通过模块开发来实现。所有你要做的就是创建两个文件。第一个告诉drupal你添加了一个模 块;它的内容并不是有编程(不是code)。第二个文件可以少到只有3行代码。在本章的第一部分,你将创建这两个文件,从而使它生效(make it work)。创建一个模块是每个人都能够做到的。开发模块的程序员也仍然在学习中。

本章是对模块构建的一个介绍,第19章和20章将会在此基础上深入,本章提供了以下内容:

* 模块基础及如何使用hooks使开发的模块来对drupal进行修改。

* 开发模块所需技能概览,包括PHP基础及drupal编码规范。

一个很简单的模块

在这一部分,你将会通过一个小模块来快速入门,之后你需要回头来再品位其细节内容。当我们在19章结束完成这个完整功能模块后,它将提供给站点创建者和模 块开发者一个对站点的分析调查的功能;理想情况下,他们会看到一个网站的骨骼结构,所以该模块被称为X-射线。此模块将在网站上每个表单顶部的打印的表格 ID。

两个文件一个(文件)夹

最简单的模块包含了2个文件夹,它们放置于同一个文件夹下:一个用来区分模块,另一个包含了功能实现的代码(the instructions for what the module should do)。包含模块信息的文件以.info为后缀名,而另一个文件则以.module结尾。可以给模块一个友好的(human-readable)名字,但 是这个名字还需遵守机读命名规范:必须小写,不包含空格及特殊字符。接着你需要用这个名字来为文件夹及文件命名,[还有在你的代码里还要经常用到这个名字 作为函数的前缀]。这样的话,我们的模块 X-ray 模块需要写成xray,那么在列表18-1和18-2中xary.info,xary.module需要放在一个名字叫xray的文件夹里。后面你将会详 细了解这些代码。

列表 18-1 xray.info文件

name = X-ray

description = Shows internal structures and connections of the web site.

core = 7.x

列表 18-2 xray.xray.module 文件,包含注释(在/**和*/直接的)

<?php

/**

* @file

* Helps site builders and module developers investigate a site.

*/

/**

* Implements hook_form_alter() to show each form's identifier.

*/

function xray_form_alter(&$form, &$form_state, $form_id) {

$form['xray_display_form_id'] = array(

'#type' => 'item',

'#title' => t('Form ID'),

'#markup' => $form_id,

'#weight' => -100,

);

}

到此为止,你已经创建了一个模块!似乎你只会了一半,本部分的后面你将会了解代码的含义。如何使用这个模块呢,和其他模块里写的那样:把文件夹 xray放到sites/all/modules/custom(必要的话创建一个custom文件夹)。然后在浏览器中查看模块管理页面(admin /modules),启用该模块(当然你可以使用drush命令来启用,不过最好你还是到管理页面确认一下他还在那里),一旦你启用xray就开始工作 了。你可以立即查看到管理模块页面的改变效果。X-ray修改了站点的表单,让他们打印出表单ID;模块管理页就是一个通过 system_modules() 函数生成的很大的表单,现在你明白了吧,(见图表 18-1)

图表 18-1 在管理模块顶部打印出来的表单ID system_modules (生成表单的函数名字)

这还不是一个令人兴奋的模块,不过他确实是一个功能完整的模块,通过简短的几行代码来影响你的站点。模块开发的专属领域的神话已被打破。你可以信心的大步向前。你将会获得通过你自己编写的模块来影响Drupal引擎系统必要知识

■ Note Don’t get caught up in trying to do something unique or awesome or even particularly useful with your

first module. A module created as a learning exercise doesn’t have to something never done before; all it needs to

be is new to you. See Chapter 20 to make modules that are both simple and useful.

■ 提醒:略。

不过,确实有点小兴奋。很简短的一段代码就能把所有的站点上的表单都添加一些东西!这是如何实现的?接下来让我们来个慢动作回放,一点一分析,它背后可以很多精彩的内容

第六部分:网站建设进阶篇

第25章 Drupal Commerce

随着drupal7的commerce模块的推出,Drupal的 电子商务功能变得更加强大了。Drupal commerce项目是由一组commerce核心模块组成的,并且利用了很多drupal7的新的改进和特性。这章将从对drupal commerce的一个广阔概述开始,在强调其关键的特性之后,才能继续进行详细的考察核心系统,它们的实现,它们如何一起使用。它还包括了针对建站者和 开发者的一些建议,使他们能够在自己的网站上更好的实现drupal commerce的功能。这一章将以一些话题讨论结束,其中包括项目的发展历史、设计理念以及如何利用好drupal7的新特性。

Drupal Commerce概述

很多方面,Drupal是一个理想的电子商务开发平台。其核心模块和系统为深度整合第三方模块和服务定义了丰富的API。它包含大量功能,用于内容管理、社区建设,使您可以围绕着产品去创建一个社区和服务,或者通过客户已有的社会网络关系来提升自己的品牌。

早在drupal4.5版的时候,所有主要的电子商务模块都是drupal的基础模块,而不是第三方模块,drupal commerce模块也不例外。随着drupal的发展,这些核心特性和主要的第三方模块比如views也越来越成熟了,使得基于它们去建设模块也越来越灵活和强大了。因此,drupal commerce头开始,围绕着drupal7的新特性和一些强大的模块比如views和rules,设计了一个全新的体系结构。

无论你的业务需求大小如何,它都能提供一套解决方案让你从头来构建自己的电子商务系统。drupal 商务站点受益于drupal的安全性、易扩展性、众多第三方模块的选择。因为内容管理和社交商务工具融入了核心本身,所以对于今天的在线业 务,Drupal是一个非常强大的平台,它不需要集成外部的电子商务应用程序。

第27章 扩放Drupal

要定义“扩放”这个术语,让我们以一个小咖啡馆为例。当它刚开业的时候,因为小,店主料理一切事务:她负责点单、准备饮料、一手端上咖啡一手收钱。 一段时间过后,咖啡馆生意变得好起来,店主因此雇了一个咖啡师和一个服务员。现在服务员负责点单和收钱,咖啡师拿到点单的纸条、准备饮料并端给顾客。在这 里你应该注意到的是,当一个人来做每件事的时候,钱和饮料的交易是同时发生的。但是现在顾客是先付钱,最后才拿到饮料。在拿到饮料之前交钱,这其中是否包 含某种风险呢?如果这时突然失火,顾客交的钱可能换不回来任何东西。然而,没有人真的会为这种可能性而担忧;为了更快得到咖啡,他们会愿意冒这么极小的一 点风险。通过把“收钱”和“上咖啡”这两个动作分离开来,小店可以更快地服务更多的顾客。它可以雇佣任意人数的咖啡师和收银员以更好地满足客流。这就是扩 放:用这样一种方式来容纳客流以致顾客较多的时候也不会减慢流程。

但是要注意的是,增加咖啡师并不会让付钱和拿到咖啡之间的时间有任何缩短。店主会确保始终有一位空闲的咖啡师,但你还是要等待他为你准备饮料。然 而,如果店里雇佣狡猾的红色机器人来更快地制作咖啡,将有助于缩短这个等待时间。这就是性能:Web应用程序在接收一个请求到完成它之间的时间。

性能是重要的,因为人们容易放弃太慢的网站。扩放使得网站能应付大流量的情况,但扩放本身并不会让网站变快,让网站变快的是性能。然而,如果你有足够多的访客,即使是最快的网站,也最终不得不让某些访客等待,然后才能开始服务他们的请求。

现在我已经定义了扩放和性能,我将在本章的后续部分告诉你,为什么你应该关心他们。然后,我将讨论Drupal 7中的一些扩放可选方案。该讨论将主要集中在数据库这块,因为数据库对于扩放Drupal是整体上的。Drupal不是想要怎么扩放都可以的,但是我将要讨论到的更改能让Drupal的扩放更加高效。

你需要关心扩放吗?

当你刚开始着手构建一个网站时,处理大流量通常不是你的重心所在。大部分人所关心的是先引来流量。毕竟只有拥有大型成功网站的人才需要担心流量问 题。没有哪个网站一开始就有数百万用户。然而,你可能恰恰在一段时间内就可以获得那么多甚至更多。如果你在花大气力做网站营销,那么就有理由为用户增长而 谋划了。即使你只是在整个互联网上有那么一个固定百分比的流量,你也可能会迎来惊喜;新的设备,甚至新类型的设备,让越来越多的人花越来越多的时间去浏览 网站。当成功就在撞击大门时,你会做什么?你的网站是否能适应呢?

如果你的网站不能适应访客的增长,你将会处于痛苦不堪的境地:本应到来的成功,将会被抓狂的用户所取代。等待页面加载,有时还可能根本就接收不到网 站的响应,不管是新进用户还是长期粉丝,无不如此。雪上加霜的是,通常网站的编码方式造成增加额外的硬件也帮不上太多忙;在这种情况下,网站就必须重构 了,通常还是从头再来。当然,这种情况不是一夜之间发生的,而且通常发生这种情况时,公司正忙于其他事情:增长。简而言之,更多的流量几乎意味着更多的潜 在业务,所以与此同时,公司要尽力应付新需求所带来的必要增长,而这时网站方面又突然需要重大重构。当这种事情发生时,网站可能每天都会崩溃。公司或组织 眼看着成功在望,却要艰难地维持网站的运转,这是我们不愿意看到的一幕。

但还有另外一个陷阱:在网站生命周期的开端就沉迷于可扩放性,以致为它耗去功能开发方面的宝贵资源。Drupal的模块化机制就一直提供针对这些问题的解决方案,Drupal 7更是在这方面上升到了一个新的高度。

缓存

缓存是指临时存储一些处理过的数据。它可以是结构化数据或是包含HTML格式化文本的字符串。用缓存数据来提供服务,比从多个数据表中读取和处理数 据更快,但另一方面,缓存数据是不可编辑的,所以不可能把它处理成另外一种格式。因此,原始数据必须保留在数据库中。现在你有了多个数据副本,原始数据和 缓存之间就有可能会失去同步。在这种情况下,缓存数据是“陈旧的”。有时这样没问题;如果你一天出产几篇文章,更新的内容在原本发布日期后的几分钟内不被 匿名用户看到可能并没有多大关系。这是可扩放性方面的另外重要一课:理论服从实践。可扩放性永远是在寻求折衷方案,对于一个给定的网站,这只是哪种折衷更 能接受的问题而已。

提示:注意用语“对于一个给定的网站”。没有放之四海而皆准的良方妙药,可扩放性永远都是因网站而异的,虽然有些实践经验适用于很多类似的网站。

Drupal可以利用缓存来存储整个页面,即页面的HTML,以供匿名用户访问。到admin/config/development/performance页面启用这个功能很简单,而且在最简单的共享主机上也能工作。注意该功能仅对匿名用户起作用,但常见的是,网站的大部分流量都来自匿名用户。默认情况下,提交新的内容会删除这部分缓存,但是可以设置一个最小缓存生命周期。还是那句话,因站而异。

提示:在共享主机上还有一个快于内建页面缓存的可选方案,Boost模块(drupal.org/project/boost)。该模块可以为你的匿名访客提供页面服务,完全绕过PHP。

让我们来看看开发者可以如何利用缓存来存储一个慢查询。假设你有一个非常慢的函数叫作very_slow_find(),下面就是如何利用缓存:

$cache = cache_get('very_slow');

if ($cache) {

   $very_slow_result = $cache->data;

}

else {

   // Run the very slow query.

   $very_slow_result = very_slow_find();

   cache_set('very_slow', $very_slow_result);

}

首先,你试图读取缓存。如果成功,就使用缓存中的数据;如果缓存不存在,你就运行你的查询并把结果存储在缓存中。采用这种方法,那个极慢的查询很少有必要发生,不过需要注意前面提到的陈旧缓存。在该例中,very_slow是缓存ID(cid)或者叫缓存键,$very_slow_result是你所存储的数据。

缓存被广为使用,并且被存储于各种不同的箱子中。把所有数据都存储在一起固然可行,但是把它们分开存储在一种Drupal称作“箱子”的东西中有两 个好处:一个箱子中的内容可以与其他箱子中的内容分开来,在必要时废弃以避免陈旧数据;并且,每个箱子可以设置不同的机制来存储数据。(我将在本章稍后讲 解一些可用的存储机制示例)在使用Drupal的缓存API提供的cache_get、cache_set以及其他函数的时候,你不用担心哪个存储机制可用。这就是为何可插拔的子系统如此重要:你可以选择不同的存储机制而无需修改任何代码。

Drupal默认使用数据库来存储缓存数据——不是因为这是最佳方案,而是因为Drupal知道它们在那里。所幸还有替代方案。下面首先你将看到一个更多关于辅助开发的例子,它还展示了如何配置可插拔子系统;然后你将看到一些性能和可扩放性的解决方案。

在开发过程中禁用缓存

对于开发目的而言,我建议使用最简单的缓存实现:无。有一种缓存实现等同于黑洞:缓存写入和清除程序不做任何事情,读取则永远是失败的。Drupal在 安装过程中就使用这种假缓存,因为还没有任何关于何处缓存存储的信息可用。这种假缓存在开发过程中也非常有用。需要提醒的是,多步骤(因此还有AJAX) 表单,需要一个工作缓存,当所有缓存都用黑洞方式处理时,它们将无法工作。要用Drupal自身的假缓存来让缓存短路,在settings.php中加入下面三行,settings.php文件在你站点的/sites文件夹下,通常它会是(相对于你的drupal安装根目录下的)/sites/default/settings.php:

$conf['cache_backends'][] = 'includes/cache-install.inc';

$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';

$conf['cache_default_class'] = 'DrupalFakeCache';

这么做了之后,复杂的数据机构,如主题注册表,将会在每个页面加载时重建(加入类和菜单项仍然需要到admin/config/development/performance页面执行明确缓存清空)。这让站点明显变慢,但却简化了开发者的生活,因为对于代码所做的修改会直接在Drupal的行为上反映出来。

settings.php中的$conf数组是指定Drupal配置信息的总中央。虽然有些配置选项有UI界面并把状态存储在数据库中,但有太多选项以致于不能为它们一一提供UI界面,并且大多数不便提供UI的选项,没有必要提供给一般用户。使用$conf而 不使用UI界面的另一个理由是,有些选项在数据库可用之前就是必须的。缓存是两点兼而有之:它不是用户需要从UI界面设置的东西——大部分人永远没有这个 必要——并且它可能在数据库加载之前就被使用。大部分人与默认的缓存实现相安无事,而缓存又可能在数据可用之前被使用。然而,因为数据库还不可用,缓存设 置比平时要更复杂一些。你需要指定文件(在$conf['cache_backends']中),而不仅仅是所用的类(如$conf['cache_default_class']中)。对于其它设置,大多数时候指定类就够了,因为Drupal会从数据库中读取到包含该类的文件所在的位置。

memcached

接下来的解决方案在共享主机上将无法工作,你需要控制你的主机环境以达到优秀的性能和扩放。

memcached是将缓存存储在内存中并允许通过网络访问的一个独立程序。做为一个独立程序没什么特别,Drupal使 用的数据库(如MySQL)也是这样的应用程序。memcached的与众不同之处在于,它的数据仅存储在内存中,这使得它非常非常快。使用该程序来取代 数据库缓存对于Drupal的性能大有裨益。并且不仅仅是Drupal——这是一个非常成熟的解决方案,在每个大型网站中都有实际应用。

注意memcached不仅仅是一个性能解决方案,同时也是易于进行良好扩放的:你只需根据需要,在任意多个服务器上,启动任意多个它的实例,并配 置Drupal来使用它们。memcached无需任何设置,因为每个独立的memcached实例不需要彼此了解。与它们每个进行对话的是 Drupal。这和MySQL非常不同,它的主从服务器模式(master-slave)需要作明确的配置。

memcached由三部分组合而成:应用程序本身、一个PHP扩展和一个drupal模块。memcached可从memcached.org获 得,网站上有安装和配置的详细介绍。如前所述,你需要添加一个PHP扩展以让PHP和memcached进行通信。有两个名字易混淆的PHP扩 展:“memcache”和“memcached”,即使专家对于它们谁更好也是各持己见。我谨慎推荐更新一些的“memcached”,它的PHP扩展 可以通过以下命令安装:

pecl install memcached

你也可以按照操作系统特定的方式来安装,比如在Debian或Ubuntu上可以如下:

apt-get install php5-memcached

第三点也是最后一点,你通过安装Memcache模块(drupal.org/project/memcache)来让Drupal使用memcached。项目页面有大量文档,在此不再赘述。

Varnish

可扩放性工具集的另一个重要部分是Varnish。Varnish是一个存储页面和提供页面服务的外部程序。普通页面缓存需要一个到达web服务器的请求,顺序是:引导Drupal、 加载页面、然后由Drupal发送请求。Boost模块提供一个更快的解决方案,因为现在请求只需到达web服务器,而Drupal并未启动。 Varnish则更快,因为它自己处理请求。在匿名页面服务方面,它确实提供了非常快并且大规模可扩放的解决方案。它以“Varnish让网站飞起来”为 座右铭,并一直为此而努力。Varnish应用程序地址在www.varnish-cache.org/,与Drupal的整合方案在drupal.org/project/varnish。

数据库方面

至此,你已经看到了一些可插拔子系统是如何配置的,你还简要地回顾了各种不同的提供快速匿名页面服务的解决方案。仅通过采用上述解决方案,你就可以 使你的站点在性能方面(感谢memcached)和对匿名访客规模化方面(感谢Varnish)有良好的表现。然而,如今是社会化网站的天下,它们需要的 是服务已登录用户。问题变得棘手起来。虽然memcached确实为你赢得一些性能,还是有很多问题需要克服。你需要退回一步,去了解网站是如何操作、存 储和读取数据,所遭遇的问题,以及解决这些互相之间不太相关问题的全新解决方案。

从更高的层面看,多数网站都执行着相同的动作:收集数据(要么是用户或管理员通过浏览器表单输入的,要么是从另一个网站聚合来的),存储数据到数据 库,然后再把数据显示给用户。显示和更改数据的操作通常称为创建(Create)、读取(Read)、更新(Update)和删除(Delete)四大操 作,简称CRUD。一个典型的网站会使用某种SQL数据库,并在其上执行这些操作。

正如你马上将要看到的那样,对于一个网站所面临的诸多问题,SQL,特别是目前流行的各种SQL实现(包括MySQL/MariaDB /Drizzle、PostgreSQL、Oracle和微软的SQL Server),并不一定是最适用的。可是既然SQL不是最优的,为什么它却如此流行呢?同样,既然SQL如此流行和管用,另辟蹊径真的是个好主意吗?简 而言之,大家一直在用这些SQL数据库,何必大惊小怪?

问得好。我们就来看看所谓的“一直”到底有多久。今天所用的大部分数据库都起源于上世纪七十年代末。确实,像MySQL或PostgreSQL这样 的数据库或许并没有多少UNIREG(MySQL的祖先)、Postgres甚至INGRES(PostgreSQL的祖先)的遗留代码。就像亚伯拉罕• 林肯用的斧子的传说,光荣地承载着一段家族通过使用而赋予的历史。几个世纪过去,斧柄被换了五次,斧头被换了三次。(此段典故来自蒂姆•波顿恶搞美国总统 林肯的电影《吸血鬼猎人林肯》——译者注。)SQL数据库的设计初衷及其导致的局限性却不像更改代码一样那么容易。亚伯拉罕•林肯的斧子仍然是一把斧子。

从这些数据库被构造的年代至今,像CUP速度、可用内存及可用磁盘空间这类因素已经增长了百万倍,磁盘速度却并未紧跟上来。并且,尽管任务也同时在增长,却没有几个增长了百万倍。最后,操作系统也变得更加复杂起来。

所有这些都意味着一些新的、以前不可想象的设计方案是必不可少的,并且具有重大意义。因为现在磁盘空间丰富而磁盘速度是制约因素,你可以把注意力集 中在让数据库变得更快而不是更小。当有如此之多的廉价存储可用时,牺牲磁盘空间来获取性能看上去是个绝好的买卖。你可以假定内存能满足整个数据库,如果不 能,问题由操作系统处理。这种设计方案影响的不仅仅是数据库:比方说,Varnish就引入了这些先进的编程范式,这也是它如此快的原因之一。

内存记忆

第一块个人电脑硬盘是希捷科技公司于1980年生产的ST-506(希捷科技公司,原文为“Shugart Technologies”,此处为原文错误。希捷科技的创始人虽然姓Shugart,但公司名称一直都是“Seagate Technology”,并未使用过“Shugart Technologies”这个名字。——译者注),它有5MB空间,和今天的DVD驱动器一样大,价值1500美元。所以,按1980年的美元市值计,1GB价值30万美元;按今天的美元市值计,已将近一百万。今天最快的硬盘可以存储300GB,价值不到300美元(这样1GB不到1美元),并且就像典型的笔记本电脑硬盘一样小。慢些的硬盘可大到3000GB(3TB),按照有些2TB的硬盘售价为80美元来算,当前硬盘每GB的最低价大约为0.04美分。

然而,不是每个方面的改变都如此之大:ST-506的寻道时间为170毫秒,1981年生产的ST-412的寻道时间为85毫秒,而今天一般硬盘的寻道时间为8到10毫秒,绝对最快的硬盘的寻道时间为3毫秒——连百倍的增长都不到。(寻道时间是指驱动器到达数据存储位置所耗费的时间。)一旦有的话,ST-506每秒读取半兆字节,而今天的典型硬盘则可能每秒读取一百多兆字节——速度仅提高了区区200倍。

快速闪存设备通过消除寻道时间,并让纯读取速度增加大约两倍,使得这一现状得以改善。对这些新设备来说,前面的路还很长:它们的可靠性还不能与硬盘相匹敌,而它们仍然比主要的内存要慢大约一百倍。

在1980年,64K内存对个人电脑来说是最大的,且价值400美元,这使得每兆字节价值6200美元(以1980年美元市值计)。今天,64G(100万倍)的服务器内存价值不到2000美元,这样每兆字节价值大约3美分,便宜了大约100百倍。

1980年最快的微处理器每秒运行一到两百万条指令(英特尔iAPX423,摩托罗拉68000)。今天,速度纪录高于万亿次浮点运算(IBM POWER7)——提高了一百万倍。商品化的处理器刚出现时价值200到350美元,如今仍在这个价格范围。