第 4 章:Drupal 页面






4.67/5 (6投票s)
在本章中,您将学习如何将零散的知识点联系起来,构建上下文相关的页面模板。
![]() |
作者:Konstantin Käfer, Emma Hogbin 由 Prentice Hall 出版 ISBN-10: 0-13-713669-2 ISBN-13: 978-0-13-713669-8 |
本试读章节摘自新书《Front End Drupal: Designing, Theming, Scripting》,作者为 Emma Jane Hogbin 和 Konstantin Kafer,由 Prentice Hall Professional 出版,出版时间为 2009 年 4 月,ISBN 为 0137136692。版权所有 2009 Pearson Education, Inc.。更多信息请访问:http://www.informit.com/store/product.aspx?isbn=0137136692,示例代码可在此处获取:http://frontenddrupal.com/。Safari Books Online 订阅用户可在此处访问本书:http://techbus.safaribooksonline.com/9780137007752
拿出你们的蜡笔和涂色本吧!在本章中,您将学习如何将零散的知识点联系起来,构建上下文相关的页面模板。本章的冒险之旅将从剖析 Drupal 如何构建呈现给您 Web 浏览器的页面开始。然后,您将了解全站变量,以便您能将页面模板拆分成一个干净的 HTML 框架,并将 Drupal 提供的数据在正确的时间注入到正确的位置。接下来,您将学习如何通过自定义页面变量和基于类别、页面别名及内容类型的页面模板来“打破常规”。对于那些根本不喜欢涂色的人来说,本章最后将提供有关创建打印友好型模板以及构建 Web 站点移动友好型克隆的信息。在本章中,您将深入了解 Drupal 主题的内部机制。请注意,此处包含的代码片段需要您对 PHP、CSS 和 XHTML 有基本了解。
页面元素
一旦您理解了 Drupal 如何构建其主题,实现复杂任务就会变得非常容易。一个常见的问题是:“我需要在首页的内容中插入一个区块——我该如何做到?” Drupal 并非这样考虑这个问题,因此答案似乎非常困难。与其从 Web 浏览器中看到的页面来思考,您必须分别考虑每个元素。图 4.1 说明了 Drupal 如何使用其模板文件来定制页面。

Drupal 页面通过使用多种不同的模板进行定制。
整个页面由 page.tpl.php 模板控制。在整个页面中,会注入几个更小的模板文件来定制不同的组件。这些模板对 Drupal 中各种模块的输出进行主题化。图 4.1 展示了区块和节点模板。输出内容到页面的每个模块都有自己的模板,您可以随时进行定制。
剖析主题
大多数主题都包含页面、区块和节点模板的定制,它们是构建页面布局的主要构建块。如果您正在处理一个下载的主题,请在其主题目录中查找以下文件:
- page.tpl.php
- block.tpl.php
- node.tpl.php
这三个文件是定义您站点标记的构建块。关于定制 page.tpl.php 的详细信息将在本章后面介绍,关于定制 node.tpl.php 的更多信息可以在第 5 章找到。
这里有一个关于思考 Drupal 页面模板的类比:它有点像一个大型的带编号停车位的停车场。停车场本身并不关心每个车位停放的是哪种汽车、卡车或摩托车;它只是提供了标示出车辆可能停放区域的线条。停车场可能为每个楼层设置不同的颜色,以便人们更容易记住他们停在哪个楼层。停车场的工作人员可能制定了关于每个人可以将车辆停放在哪个车位的规则。在停车场里,一辆车不可能同时停放在两个地方。
用 Drupal 的术语来说,页面模板定义了区块可以出现的区域(停车场中的楼层),区块可以被分配到这些区域(停放车辆的车位)。一个区块在一个页面上不能出现多次(车辆一次只能停放在一个车位);然而,这个区域在页面模板中的位置可能会根据上下文而改变(停车场可能为每个楼层设置不同的颜色)。在本章后面,您将学习如何为您的“停车场”分配新的蓝图。
当然,这个类比并不完美:在现实生活中,车辆可以停放在指定位置之外的地方。相比之下,Drupal 中的区块在整个 Web 站点中只能被分配一个位置。尽管如此,停车场类比仍然是思考页面模板如何在不了解页面显示内容的情况下保持秩序的一种有益方式。
在第 3 章中,您创建了一个基本的页面模板,其中仅包含 Drupal 的输出和一个骨架 HTML 框架。现在,您将在此基础上进行构建,以创建更复杂的页面模板。
全站页面变量
在 page.tpl.php 模板文件中可用的变量分为几个类别:
- 通用实用变量 用于构建上下文相关的模板,并使用与服务器上主题位置路径相关的目录名。
- 页面元数据 包括页面语言、与页面相关的样式和脚本标签以及 body 类。
- 站点标识 以站点名称、站点标语、站点使命和 logo 的形式呈现。
- 导航 包括与主导航和次导航相关的项目,以及搜索框。
- 页面内容 包括页面标题、动态帮助文本和 Drupal 系统消息,以及选项卡。
- 页脚和闭合数据 包括 RSS feed 图标、页脚消息以及任何模块(“闭包”)的最终标记。
图 4.2 展示了常用变量,该图描绘了使用 Garland 主题的 Drupal 新安装界面。

Garland 主题中显示的常用变量。
页模板变量的完整列表可在 Drupal 目录 -modules/system,在 page.tpl.php 文件中找到,该文件也可在线获取:http://api.drupal.org/api/file/modules/system/page.tpl.php。
通用实用变量
通用实用变量代表了一个非常基础的工具包,您可以使用它根据访问者的特征来定制您的站点模板。它们包括以下变量:
- 在链接到您站点中的图像和文件时非常实用的变量,例如 $base_path(Drupal 安装的基础 URL)和 $directory(此主题的基础目录)。
- $is_front,报告当前页面是否为站点的首页。
- 用户状态检查,包括访客是否登录站点($logged_in)以及用户是否具有访问管理页面的权限($is_admin)。
页面元数据
页面元数据变量用于页面模板的 <head> 标签。这组变量包括:
- 一个包含站点显示语言的对象。要将语言的文本表示形式打印到您的模板中,请使用以下变量:$language->language。
- $head_title:页面标题的修改版本,包含站点名称,用于 <title> 标签。
- $head:用于在 <head> 部分插入的元数据,包括 metatags 和 keyword 标签。
- $styles:用于链接页面所有 CSS 文件的样式标签。
- $scripts:用于加载页面 JavaScript 文件和设置的脚本标签。
除了这些元数据,还有一个很棒的变量,它包含一组条件,可以帮助您为每个页面设置样式:$body_classes。$body_classes 变量包含以下信息:当前布局(多列、单列);当前访客是否为已认证用户;以及正在显示的节点的类型(例如,node-type-book)。此变量仅包含可供您的样式表使用的类名。要在您的主题中使用它,您必须包含以下 PHP 片段:
站点标识
站点标识信息包含一组变量,用于输出关于您站点的信息。您可以通过导航到 Administer, Site configuration, Site information 来修改 Drupal 管理区域中这些变量的内容和/或禁用它们。
- $front_page:站点的首页 URL。链接到首页时,请使用此变量而不是 $base_path。它包含语言域名或前缀。
- $logo:在主题中定义的 logo 图像的路径。
- $site_name:您的 Web 站点的名称。
另外两个变量可以在 Drupal 管理区域的站点标识部分设置:
- $site_slogan:站点的标语。
- $mission:站点使命的文本。
没有规定说您必须将最后这两个变量用于其预期目的;事实上,您可以将它们用于存储任何您想在页面模板中显示的信息。
页面内容、Drupal 消息和帮助文本
内容是您 Web 站点最重要的部分。您必须告诉 Drupal 在页面模板中插入内容的位置!这是通过一个简单的变量 $content 来完成的。您可以将此变量放置在 page.tpl.php 模板文件的任何位置。通过这个简单的变量,Drupal 可能会显示一个节点,或者一个节点列表,或者 Drupal 为任何给定页面准备的任何其他“内容”。
您还必须使用 $title 变量打印此内容。它不同于 $head_title 变量,后者包含 Web 站点的名称,通常打印在页面的 <title> 标签中。
每个节点有两种模式:查看和编辑。可以通过节点上显示的选项卡访问这些模式。在您的页面模板中,变量 $tabs(主选项卡级别)和 $tabs2(在多个管理页面中存在的子导航)用于放置访问每个节点的“查看”和“编辑”模式的链接。选项卡变量通常打印在 $title 和 $content 变量之间。
面包屑导航 - 尽管有一个变量包含每个页面的面包屑路径,但面包屑导航通常不完整。许多主题选择仅在 Web 页面的管理部分显示此变量。
Drupal 通过 $messages 变量与用户沟通系统消息。此变量可能包含描述新内容成功提交或内容修改、与表单提交相关的错误,或管理系统内的消息等有用信息。消息有三种类型:状态、警告和错误。通过您的样式表,您可以使这些消息在视觉上独一无二。通常用于这些消息的颜色是:状态消息为绿色,警告消息为黄色,错误消息为红色。消息作为 CSS 类可用,并带有相应的名称(例如,警告消息使用 CSS 选择器 .warning)。
除了这些系统消息,Drupal 偶尔还会提供“帮助”文本,这可以通过 $help 变量获取。为了确保将适当的系统消息传递给您的 Web 站点用户,必须在您的页面模板中指定帮助文本和消息。
创建新的页面变量
除了使用 Drupal 提供的变量外,您还可以创建自己的变量。每次 Drupal 构建一个页面时,它都会收集显示该页面所需的信息,并确保信息的安全。这个“预处理”在页面使用模板文件构建之前完成。为了使您的模板文件仅专注于 HTML 输出,您可以在相关的预处理函数中插入任何自定义编程。其输出将作为变量返回给相关的 tpl.php 模板文件。在预处理函数中创建的变量仅在相关的模板文件(tpl.php)中可用。
将 PHP 代码片段放入模板 - 在本章的其余部分,您将使用预处理函数并创建新的主题变量。预处理函数始终放在您主题的 template.php 文件中。主题变量始终放在相关的模板文件(例如,page.tpl.php)中。
预处理函数的命名方式是根据您要“挂钩”新变量的模板来确定的。任何具有模板文件的模块都可以使用预处理函数。例如,page、node、comment 和 block 类型都有关联的 .tpl.php 文件;因此,它们都可以挂钩到预处理函数。预处理函数的完整列表可从 API 文档中获取:http://api.drupal.org/api/search/6/preprocess。有关创建其他模板文件的更多信息将在本章后面提供。
在以下示例中,您将添加一个新变量,该变量可在 page.tpl.php 模板中使用。您的想象力是这些变量可以包含内容的唯一限制!Zen 主题会插入额外的、复杂的 body 类,允许您通过 CSS 创建非常专业的页面定制。Garland 主题使用预处理 page 函数来挂钩 color 模块。在本章后面,您将学习如何根据您正在查看的 Web 站点部分添加新的图像横幅。
在此示例中,如果访客已登录站点但当前未查看首页,我们将向页面添加一个新图形。
function bolg_preprocess_page (&$variables) { // Add a "go home" button to page.tpl.php if ($variables['logged_in'] == TRUE && $variables['is_front'] == FALSE) { $image_path = $variables['directory'] . "/images/go_home.jpg"; $image_text = t("Go home!"); $image = theme('image', $image_path, $image_text, $image_text); $variables['go_home'] = l($image, "<front>", array('html'=> TRUE)); } } // End of the preprocess_page function
在 page.tpl.php 文件中,您现在可以将新变量 $go_home 放在您希望按钮出现的位置。尽管可以通过硬编码图像的 HTML 来简化该代码片段,但此方法易于在许多不同的主题中重用,并且允许文本字符串被翻译成多语言 Web 站点。
修改页面变量
您还可以选择修改 Drupal 已设置的变量。Zen 主题使用此技术来移除空帮助消息的标记。Newswire 主题定制页面变量,以根据正在查看的页面修改内容标题的 HTML;Newswire 还定制了显示在前页和站点内页上的 logo。Acquia Marina 主题在侧边栏未使用时会移除其标记,以创建干净、可折叠的模板布局。您也可以实现自己的定制。
要重置变量,只需使用与现有页面变量相同的变量名即可。请勿取消设置未使用的变量,因为如果 page.tpl.php 文件尝试打印一个不再存在的变量,此操作可能会导致难看的 PHP 错误。相反,将未使用的变量设置为一个空字符串。
function bolg_preprocess_page (&$variables) { // From the Zen theme // Don't display empty help from node_help(). if ($variables['help'] == "<div class=\"help\"><p></p>\n</div>") { $variables['help'] = ''; } }
除了本章后面将遇到的技术外,您还可以从其他主题中获得很多启发。下载并检查各种主题,看看其他人是如何通过添加和修改他们的模板变量来定制他们的页面模板的。
导航和菜单
您的页面模板包含两个包含导航菜单的变量,您可以将它们放置在 Web 页面的任何位置:$primary_links 和 $secondary_ links。这些变量包含来自同名(主链接和次链接)的两个 Drupal 菜单的项目。Drupal 菜单是到站点内和站点外 URL 的链接集合。
要向菜单添加新项目,您可以使用以下两种方法之一:
- 要添加指向现有节点的链接,请导航到节点的编辑屏幕,并按照图 4.3 中的方式调整其菜单设置。

从节点编辑屏幕将节点添加到菜单。
- 您还可以使用菜单管理系统将页面添加到菜单,如图 4.4 所示,通过导航到 Administer, Site building, Menus, Add item。此方法允许您添加指向站外 URL 的链接。
要添加子菜单项,您可以使用与上述相同的技术,但将“父项”更改为您新子菜单项应包含的菜单项。例如,假设您有一组主链接,其中包含“哺乳动物”、“两栖动物”和“爬行动物”。要将“小猫”作为“哺乳动物”的子项,在添加“小猫”节点的菜单信息时,您应将“父项”设置为“哺乳动物”。
更多菜单到您的页面模板 - menu 模块为每个菜单提供一个区块,而区块可以放置在站点的任何区域。要在一个区块中显示菜单,请导航到 Administer, Site building, Blocks。按照屏幕上的说明将菜单添加到 Web 站点区域。关于创建自定义、基于任务的菜单的更多信息将在第 8 章中介绍。

从菜单管理区域将路径添加到主链接。
在菜单管理区域,您可以指定哪个菜单用于 $primary_links,哪个菜单用于 $secondary_links。默认情况下,变量 $primary_links 包含“Primary links”菜单的项目,而变量 $secondary_links 包含“Secondary links”菜单的项目。要更改用于这两个导航变量的菜单,请导航到 Administer, Site building, Menus, Settings 并进行相应的调整。
$secondary_links 变量可以通过两种方式配置:要么此菜单可以包含第二个站内链接集,用于您的站点的“次要”内容(例如,法律声明、联系信息),要么您可以将 $secondary_links 配置为包含与您的主链接相关的子导航。使用以下步骤更改默认行为:
- 导航到 Administer, Site building, Menus。
- 选择 Settings 选项卡。
- 将“Source for the secondary links”更改为与“Source for the primary links”中设置的菜单匹配。
- 滚动到 Web 页面的底部,然后单击“Save configuration”。
$secondary_links 页面模板变量现在包含为 $primary_links 中每个项目定义的子链接。参考前面的示例,“小猫”现在将在您从 $primary_links 变量提供的菜单选项列表中选择“哺乳动物”时,在 $secondary_links 的输出中显示。
主题化菜单
菜单由三个嵌套部分构成:菜单树、菜单项(菜单树上的“叶子”)以及菜单项链接。可以更改这三个组件的 HTML,尽管在大多数情况下,定制默认 XHTML 标记的 CSS 就足以使您的菜单看起来很棒。除了基本结构外,菜单还包含有关菜单叶子的信息。例如,图 4.5 显示了当前页面的活动路径,模块,并包含一个已折叠和已展开的项目菜单。

菜单由菜单树、菜单项和菜单项链接构成。
根据您想更改的菜单项类型,有两种相关策略:
- 要更改 $primary_links 和 $secondary_links 变量的内容,请使用页面的预处理函数。
- 要更改所有菜单的标记,请使用主题函数。
下拉菜单 - 变量 $primary_links 和 $secondary_links 仅包含各自菜单的顶级菜单项。如果您想为您的主链接或次链接使用树状结构(适用于下拉或弹出菜单),您必须使用菜单的区块版本而不是主题变量。MenuTree 和 Nice Menus 模块都可以从您的导航变量创建下拉菜单。这两个模块的项目页面分别位于 http://drupal.org/project/menutree 和 http://drupal.org/project/nice_menus。比较它们的功能,并选择最适合您需求的模块。
$primary_links 和 $secondary_links 是注册的主题变量。您可以通过使用页面的预处理函数来更改它们的内容。变量本身包含一个链接和属性的数组。要进行更改,您必须循环遍历链接列表并单独修改每个链接。例如,如果您决定为每个菜单项添加一个与其在菜单中位置相关的类,您可以使用下面的代码片段。此技术在您想为每个菜单项添加图标时非常有用,因为它依赖于菜单项的精确顺序。一旦设置了此顺序,您就不能更改菜单项的顺序而不更新相应的 CSS 样式。
function bolg_preprocess_page(&$variables) { // Make a shortcut for the primary links variables $primary_links = $variables['primary_links']; // Loop through the menu, adding a new class for CSS selections $i = 1; foreach ($primary_links as $link => $attributes) { // Append the new class to existing classes for each menu item $class = $attributes['attributes']['class'] . " item-$i"; // Add revised classes back to the primary links temp variable $primary_links[$link]['attributes']['class'] = $class; $i++; } // End of the foreach loop // reset the variable to contain the new markup $variables['primary_links'] = $primary_links; } // End of the preprocess function
使用主链接的适当唯一标识符,将新类添加到您的样式表中。
#primary_links .item-1 { /* styles for the first menu item */ }
如果您想根据菜单选项的顺序添加样式,这项技术效果很好。菜单存储在关联数组中,并且每个项目都有一个唯一的键。要创建唯一的菜单项标识符,请在前面的代码片段中将变量 $i 替换为变量 $link。您的菜单项现在将分配一个唯一的标识符,即使菜单项的顺序发生变化也不会改变。
有关菜单如何构建和主题化的更多信息,请阅读 API 文档:http://api.drupal.org/api/function/theme_links/6 和 http://api.drupal.org/api/group/menu/6(滚动到主题函数列表)。
网格布局
在本本书的第一章中,您阅读了关于 Web 页面设计的内容,并了解了页面模板中的“区域”。现在,您已准备好在自己的页面模板中定义区域,然后将信息插入到这些定义的空间中。区域在页面模板中的大小没有限制。您可以选择将许多区块堆叠在一个区域中,或者您可能更喜欢一个区域只包含一个区块。图 4.6 展示了 Zen 主题中可用的五个区域,用黑色条表示。正如您所见,这些区域的大小因其在页面中的位置而异。

Zen 主题中的五个区域,每个区域都有不同的位置和大小。
区域
区域用于将 Drupal“区块”放置到 Web 站点中。这些区块可以包括站点导航菜单、自定义视图、模块工具或自定义 PHP 代码片段。要查看您站点当前可用的区块列表,请导航到 Administer, Site building, Blocks。图 4.7 展示了“Hear the North”站点可用的区块。这个 Web 站点只安装了几个模块,包括一个新闻通讯管理工具 Simplenews。

“Hear the North”Web 站点上可用的区块。
您可以通过拖放十字准星图标到新区域来调整这些区块的位置。要启用禁用的区块,请将它们拖到新区域。要禁用区块,请将它们拖回“Disabled”部分。更新区块位置后,您必须单击“Save blocks”按钮将更改提交到数据库。您还可以使用相同的技术更改区域内多个区块的顺序。
向您的模板添加新区域是一个多步骤的过程:
- 编辑您主题的 info 文件,并按如下方式添加区域:
regions[new_region_name] = Human-readable region name regions[second_region_name] = Another region name
- 编辑 page.tpl.php 文件,并将您的新区域打印到页面结构中。使用您在主题 info 文件中建立的变量名。
<?php print $new_region_name ?>
- 清除缓存以重置主题注册表并启用新区域。导航到 Administer, Site configuration, Performance。滚动到 Web 页面的底部,然后单击“Clear cached data”。
- 您现在应该可以通过导航到 Administer, Site building, Blocks 来将区块放置到您的新区域中。
以下是重复自第 3 章的基本页面模板。已进行了一些更改,包括包含新的 HTML divisions 和一个(以粗体标出的)新区域,该区域可以通过 CSS 定位。将这些区域放在站点主内容之后,将使内容对搜索引擎更重要,从而提高其在搜索引擎结果中的排名。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
lang="<?php print $language->language ?>"
xml:lang="<?php print $language->language ?>">
<head>
<title><?php print $head_title; ?></title>
<?php print $head; ?>
<?php print $styles; ?>
<?php print $scripts; ?>
</head>
<body class="<?php print $body_classes ?>">
<div id="main">
<div id="page_title"><?php print $title; ?></div>
<div id="utils-help"><?php print $help; ?></div>
<div id="utils-messages"><?php print $messages; ?></div>
<div id="utils-tab"><?php print $tabs; ?></div>
<div id="main_content"><?php print $content; ?></div>
<div id="utils-rss"><?php print $feed_icons; ?></div>
<div id="new-region-name"><?php print $new-region-name; ?></div>
</div>
<div id="sidebar-left"><?php print $left; ?></div>
<div id="sidebar-right"><?php print $right; ?></div>
<div id="footer"><?php print $region_footer; ?></div>
<?php print $closure; ?>
</body>
</html>
区块
在您建立好区域后,就可以用区块填充它们了。区块可以由 Drupal 核心模块、贡献模块或自定义 PHP 代码片段生成,包括 Views 模块创建的内容列表。有关创建自定义视图的更多信息,请参阅第 2 章。
常用区块包括:
- 导航菜单(在 Administer, Site building, Menus 中创建)
- 内容列表(Views 模块;参见第 2 章)
- 登录表单(Drupal 核心;默认开启)
- 站点分类(Drupal 的 Taxonomy 模块)
- 最近评论(Drupal 的 Comment 模块)
- 搜索(Drupal 的 search 模块)
- 作者信息(Drupal 的 profile 模块)
- 五星评分(http://drupal.org/project/fivestar)
- Facebook、Digg 和社交书签链接(http://drupal.org/project/service_links)
- 相似条目(http://drupal.org/project/similar)
您还可以创建包含文本、图像甚至您自己 PHP 代码片段的自定义区块。示例 PHP 代码片段可在 Drupal 网站上找到:http://drupal.org/node/21867。要创建自定义区块,请按照以下步骤操作:
- 导航到 Administer, Site Building, Modules 并启用 PHP Filter 模块。您可能还需要通过导航到 Administer, Site configuration, Input formats 并单击 PHP filter 旁边的“configure”链接来调整此输入格式的权限。
- 导航到 Administer, Site building, Blocks。
- 选择“Add block”选项卡。
- 添加“Block description”。此描述指定了区块在管理区域中的标识方式,并且是必填字段。
- 如果您希望在显示的区块顶部显示标题,请添加“Block title”。此字段是可选的。
- 将您的文本、图像和 PHP 代码片段放入“Block body”中。如果适合您的区块,您也可以在此处使用纯文本或 HTML 标记。
- 将“Input format”更新为 PHP。
- 调整“User”、“Role”和“Page”角色的可见性设置。
- 滚动到 Web 页面的底部,然后单击“Save”。
区块中的 PHP 代码片段 - 包含自定义 PHP 代码片段的区块如果包含错误,可能会破坏您的站点显示。在将代码片段放入区块之前,请务必仔细测试。将您的 PHP 代码片段放入私有页面的正文中,以确认它不会破坏您的站点,然后再将代码片段部署为区块。
站点有时会为区块分配比页面上的主要内容更多的屏幕空间,特别是当区块为页面上显示的节点提供额外信息时,例如作者资料信息或相关内容。不要吝啬!为 Web 站点的每个部分启用最合适的区块。区块包含在 Drupal 的缓存系统中,不会损害您站点的整体性能。要启用区块缓存,请导航到 Administer, Site configuration, Performance。在“Block cache”部分,选择“Enabled”。滚动到 Web 页面的底部,然后单击“Save configuration”。
定制区块的标记
您可以通过创建一个新的模板文件 block.tpl.php 来更改页面模板中显示的区块的标记。Drupal 的此模板默认值仅包含几个包装 HTML 元素。
<div id="block-<?php print $block->module .'-'. $block->delta; ?>" class="block block-<?php print $block->module ?>"> <?php if ($block->subject) { ?> <h2><?php print $block->subject; ?></h2> <?php } ?> <div class="content"> <?php print $block->content ?> </div> </div>
对于 Drupal 核心提供的区块,变量 $block->delta 代表此区块创建的顺序。例如,第一个区块的 delta 值为 1,第二个为 2,依此类推。在渲染的 HTML 中,第一行将如下所示:
正如您所见,输出并不像变量所示那么复杂!检查输出以查看您的模块使用了什么作为其 delta 值。有些模块提供文本 delta 而不是数字 delta。
区块模板变量的完整列表可在默认区块模板中找到。此文件位于您的 Drupal 系统文件中:modules/system/block.tpl.php。变量的完整列表也可在线获取:http://api.drupal.org/api/file/modules/system/block.tpl.php。
搜索
默认的 Drupal 核心引擎带有一个允许您搜索您站点内容的模块。启用站点搜索有四个步骤:启用搜索模块;更新用户搜索内容的权限;通过使用“cron 任务”定期索引内容;以及向站点访问者显示搜索表单。
- 搜索模块默认未启用。要启用此模块,请导航到 Administer, Site Building, Modules;通过在其旁边打勾来启用该模块,滚动到 Web 页面的底部,然后单击“Save”。
- 接下来,您必须为您的站点的相应角色启用权限。导航到 Administer, User Management, Permissions。要为所有用户启用搜索,请确保为“anonymous user”启用了“search content”和“advanced search”。
- Drupal 的搜索模块不直接搜索数据库内容,因为该操作将耗时过长。相反,它搜索您内容的索引(类似于书本末尾的索引)。要启动创建或更新索引的过程,请导航到 Administer, Reports, Status report。单击“run cron manually”链接。页面将自动刷新,显示最后一次运行的 cron 维护任务“less than a few seconds ago”。有关配置 Drupal cron 作业的更多信息,请参阅第 2 章。
- Drupal 主题有两种搜索工具可用;图 4.8 比较了这两种搜索表单。在屏幕左侧,第一个选项是主题的搜索框(没有标题);第二个选项是 Search form block(有标题)。如果您愿意,您可以定制 Search form block 以移除标题。尽管这两种搜索表单外观非常相似,但它们的实现方式却截然不同。Search form block 只能放置在现有区域中;相反,主题的搜索框可以放置在页面模板的任何位置。

有两种方法可以在 Drupal 主题中启用搜索框。在屏幕左侧,顶部选项是主题的搜索表单;底部选项是 Search form block。
要启用主题的搜索框,请将以下 PHP 代码片段添加到您主题的 page.tpl.php 文件中的适当位置:
<?php print $search_box ?>
要启用搜索区块,请按照以下步骤操作:
- 导航到 Administer, Site Building, Blocks。
- 向下滚动到“Disabled”部分。
- 从选择菜单中为搜索表单选择一个区域。
- 滚动到 Web 页面的底部,然后单击“Save blocks”。
您的搜索框现在应该显示为 Web 站点中的一个区块。要进一步自定义搜索区块的选项,您可以导航到 Administer, Site building, Blocks 并单击“Search form”旁边的“configure”链接。
更改模板
在本章中,您学习了如何为您的页面创建模板以及如何定制页面元素。在本节中,您将看到如何为 Web 站点的不同部分更改使用的页面模板。您可能希望对以下任务和页面类型使用不同的模板:
- 编辑内容
- 显示内容类型
- 用户登录
- 首页
- 分类
- 离线或维护页面
其中一些模板是默认提供的;其他的您需要从头开始构建。在线文档提供了 Drupal 提供的所有默认模板的完整列表:http://www.drupal.org/node/190815。本节描述了几个特定于页面的模板选项。
为站点的不同部分分配主题 - 本节描述了如何在单个主题内更改使用的模板。如果您需要为 Web 站点的不同部分分配整个主题,您将需要更强大的工具。名为 sections 的贡献模块将允许您做到这一点。有关此项目的更多信息,请访问 http://drupal.org/project/sections。
如果您需要为每个部分提供更多定制,您可能需要 The Organic Groups 模块。该模块允许授权用户创建和管理他们自己的“群组”。每个群组都有自己的主题、语言和分类。本书中描述的技术可以应用于每个群组在 Web 站点上的每个主题。有关此项目的更多信息,请访问 http://dru.org/project/og。
自定义首页
如果您的首页需要比某个模板提供的更多的(或更少的)区域怎么办?如果首页需要一个更大的横幅和一个更小的内容区域怎么办?如果您需要进行如此多的更改,以至于感觉首页需要一个完全独立的主题怎么办?幸运的是,为您的 Drupal 站点创建自定义首页模板非常容易——实际上非常容易,以至于在本章中很难用信息填满一个完整的章节来介绍如何制作一个新的首页模板!
要制作自定义首页模板,请按照以下步骤操作:
- 创建一个名为 page-front.tpl.php 的新页面模板文件。这是一个 Drupal 识别的特殊文件名,它被用作仅在 Web 站点首页上使用的唯一模板。
- 通过导航到 Administer, Site configuration, Performance 清除主题注册表;滚动到 Web 页面的底部,然后单击“clear cached data”。
- 导航到您的 Web 站点首页并惊叹吧!
首页以外的所有页面将继续使用 page.tpl.php 模板文件(除非站点其他地方使用了其他页面特定的模板)。
在首页使用视图 - 如果您使用 Views 模块,您可以使用页面视图来创建自定义首页。一旦您创建了视图并为其分配了别名,请导航到 Administer, Site configuration, Site information。滚动到 Web 页面的底部,并调整“Default front page”的设置,使其使用新的视图页面别名作为默认首页。
自定义离线页面
不幸的是,好事有时也会发生在好站点上,导致站点不得不离线。Drupal 在无法连接到数据库时提供默认模板。此外,站点还可以被指示进入“维护”模式,以便您执行一些升级或其他功能增强。图 4.9 和图 4.10 展示了这两个离线页面的默认模板。

站点“维护中”的离线消息。
数据库连接失败时的离线消息。
离线消息模板将仅显示给非认证访客;在站点“维护中”时,管理员仍可访问 Web 站点以执行其升级。要定制这些页面,请完成以下步骤:
- 将维护页面的默认模板从 Drupal 核心目录 modules/system/maintenance-page.tpl.php 复制到您的主题目录。
- 为离线模板制作文件的第二个副本,并将其命名为 maintenance-page-offline.tpl.php。
- 您现在应该在主题目录中有两个新文件:
- maintenance-page.tpl.php:“维护”模式
- maintenance-page-offline.tpl.php:“数据库离线”
- 根据您的需求调整这两个新模板。
- 在文本编辑器中打开您站点的配置文件。(此文件位于 sites/yourdomainname.com/settings.php。它不是主题文件,很可能是写保护的。)
- 删除以下行前面的 # 符号:
- 第 173 行:# $conf = array(
- 第 175 行:# 'theme_default' => 'your_theme_name'
- 第 187 行:# 'maintenance_theme' => 'your_theme_name'
- 第 214 行:# );
- 保存更改,并将文件再次设置为只读。
下次将 Web 站点置于维护模式时(或者如果您的数据库服务器发生故障),您就可以向世界展示您定制的道歉消息,而不是默认的 Drupal “维护”消息了。
内部路径
在“自定义首页”部分,您学习了如何创建自定义首页模板。当当前页面是 Web 站点的首页时,该模板将被激活。您可以利用此技术来针对其他类型的页面。页面模板根据当前页面的内部路径激活。
内部路径和 URL 别名 - 此技术仅适用于页面的内部路径。您不能使用 URL 别名。下一节将介绍如何处理别名。目前,您只能使用与 Drupal 核心术语相关的路径。例如,node/5 和 node/5/edit 都是可以链接到特定页面模板的内部路径,而 books/fiction/story-about-ping 是 URL 别名。使用 Devel 模块获取每个页面建议模板的列表。如果没有任何建议的模板符合您的需求,请考虑跳到下一节,了解创建模板文件的替代方法。
Drupal 从最具体到最不具体的顺序查找建议的模板列表,并在您的主题目录中查找匹配的模板文件。一旦找到符合条件的模板,它就会将该模板应用于页面。以下列表举例说明了每个页面匹配的模板:
- http://www.example.com/node/5
- page-node-5.tpl.php
- page-node.tpl.php
- page.tpl.php
- http://www.example.com/node/5/edit
- page-node-edit.tpl.php
- page-node-5.tpl.php
- page-node.tpl.php
- page.tpl.php
- http://www.example.com/admin/build/block
- page-admin-build-block.tpl.php
- page-admin-build.tpl.php
- page-admin.tpl.php
- page.tpl.php
- http://www.example.com/books/fiction/story-about-ping
- page-node-2665.tpl.php
- page-node.tpl.php
- page.tpl.php
列表中的最后一项使用了 URL 别名。默认情况下,没有一个模板可以用来匹配 URL 中的任何单词以分配模板。相反,您必须知道页面的确切节点 ID 才能找到与节点相关的模板匹配项。这些模板建议是自动存在的,因此,当您需要创建具有相同文件名的新模板并根据您的需求进行主题化时,请使用它们。您可能还需要清除主题注册表才能看到您的新模板生效。
别名:页面
您还记得电视节目《Alias》吗?里面充满了假发、伪装、诡计、欺骗和阴谋!URL 别名有点像给系统路径戴上假发——它们改变了路径的外观,但内容保持不变。如果您希望您的站点使用与页面内容更紧密相关的 URL,而不是 node/2868,您就需要使用 Path 模块来创建 URL 别名。坏消息是,Drupal 的主题系统无法识别您用假发和墨镜创建的 URL 别名。相反,您必须明确地向 Drupal 展示您希望如何将这些 URL 转换为模板建议。在下一节中,您将学习如何进一步定制此过程,为每个类别创建模板建议。
模板重载 - 您真的需要一个全新的页面模板吗?在实施本节提出的想法之前,请仔细考虑。对于您创建的每个新页面模板,您都需要维护一个全新页面的标记。您添加的越多,需要维护的就越多。可能有其他时间效率更高的方法来简化布局——例如,仅在特定页面上显示区块。
此过程的第一步是获取 URL 并检查其组件,然后在页面模板被处理之前。使用 URL 别名,您将编译一个新的建议页面模板列表。注意匹配您要重新设计的页面的别名,然后将一个新模板文件添加到您的主题中。现在,当 Drupal 查找页面模板的最佳匹配项时,它将使用您新建议的文件名列表并找到新的页面模板。
从别名 URL 创建的新模板
编译新建议模板列表的工作发生在您主题的 template.php 文件中的页面预处理函数中。如果您已经在主题的 template.php 文件中创建了一个 preprocess_page 函数,您可以将此代码片段添加到函数的开头或结尾。如果您还没有此函数,您需要在主题的 template.php 文件中包含此代码片段的第一行(和最后一行)。
编译 URL 别名的建议模板的新列表需要几个步骤:
- 确认 path 模块已启用。没有此模块,您的站点将没有 URL 别名,此函数将无关紧要。
- 默认情况下,Drupal 允许您访问系统路径,但不能访问 URL 别名。您需要使用一个特殊的解码器,drupal_get_path_alias,将系统路径转换回其 URL 别名。
- 使用 PHP 函数 explode 将 URL 别名分解成其组件。您将使用这些组件来构建新的页面模板文件名。
- 确保您的 Web 页面不是编辑页面。如果是,可以使用 Drupal 的模板,此函数将无关紧要。
- 创建一个变量来保存新的模板建议,并确定新模板文件名的基本词。您可以使用任何单词,但使用基本词“page”允许您将所有页面模板放在一起。例如,page-your-custom-url.tpl.php 将在字母顺序上接近 page-front.tpl.php。
- 循环遍历 URL 的每个部分并构建新的模板建议。这模仿了 Drupal 提供其模板的方式。例如,如果您的 URL 别名是 books/fiction/story-about-ping,您现在可以创建三个新的页面模板:page-books.tpl.php、page-books-fiction.tpl.php 和 page-books-fiction-story-about-ping.tpl.php。
- 将新的模板建议添加到将返回给 Drupal 的列表中。
- 最后,将建议的模板名称列表返回给 Drupal。
在您的 template.php 文件中,这些八个步骤的 PHP 代码片段如下:
function bolg_preprocess_page(&$variables) { // Step 1: if (module_exists('path')) { // Step 2: $path_alias = drupal_get_path_alias($_GET['q']); // Step 3: $alias_parts = explode('/', $path_alias); // Step 4: $last = array_reverse($alias_parts); $last_part = $last[0]; if ($last_part != "edit") { // Step 5: $templates = array(); $template_name = "page"; // Step 6: foreach ($alias_parts as $part) { $template_name = $template_name . '-' . $part; // Step 7: $templates[] = $template_name; } // Step 8: $variables['template_files'] = $templates; } // End of the edit check } // End of the check for the path module } // End of the preprocess_page function
将此代码片段放在您的主题的 template.php 文件后,您可以使用 URL 别名的任何部分作为页面模板名称。但请注意,您必须刷新主题注册表,Drupal 才能识别您新的模板建议。
视图的页面模板
Views 模块非常智能。当您为页面视图提供 URL 别名时,它会自动执行与上一节所述功能相对应的版本。例如,如果您有一个别名为 recent/screencasts 的视图,Views 模块将自动生成以下页面模板建议:page-recent.tpl.php 和 page-recent-screencasts.tpl.php。如果这些文件都不存在于主题目录中,将使用默认的页面模板 page.tpl.php。
添加 CSS 类
Zen 主题允许设计者根据应用于 body 的类来调整他们的布局。您也可以为您的主题添加此级别的自定义。要为您的页面添加类,您需要修改 page 变量 $body_classes 的内容。此变量包含一个由空格分隔的类列表。要为此变量添加新类,您可以使用本章前面描述的相同函数。在“从别名 URL 创建的新模板”部分的代码中,将第 8 步替换为以下行(第一行是注释,不是功能代码):
// Step 8: $classes = implode(' page-', $templates); $variables['body_classes'] = $variables['body_classes'] . ' $classes';
这将把您的新 body 类添加到默认类列表的末尾。
额外的 body 类可用 - 如果您想获得更多用于主题化的类,Themer 模块可能会很有用。这个小模块创建了一套 CSS 类,可以应用于您的主题的各个部分。有关更多信息,请访问其项目页面:http://drupal.org/project/themer。
内容类型的页面模板
如果需要,您可以使用 Drupal 的节点模板来更改节点在页面中的显示方式。但是,如果您知道您的内容类型之一需要不同的页面布局,您可以为该内容类型分配一个新的页面模板。此过程几乎与前面示例中的过程相同。
要创建特定于内容类型的页面模板,您需要知道您正在查看哪种类型的内容。您能确定这一点只有在您查看只包含一个节点的页面时才有可能。此页面通常会使用 page-node.tpl.php 模板。
要创建基于内容类型的模板建议,您需要将“从别名 URL 创建的新模板”部分中描述的预处理函数的第 6、7 和 8 步替换为以下代码片段。请注意此示例中 arg() 的使用;arg() 是一个特殊变量,用于从显示页面的系统路径中获取单个参数。例如,node/2868 的 arg(0) 的值为“node”,arg(1) 的值为 2868。
if (arg(0) == "node" && is_numeric(arg(1))) { $node_type = $variables['node']->type; $variables['template_files'] = "$template_name-node-$node_type.tpl.php"; }
如果您想同时为 URL 别名和内容类型创建模板,您可以在“从别名 URL 创建的新模板”部分的代码片段中的第 8 步之后添加此代码片段:
if (arg(0) == "node" && is_numeric(arg(1))) { $node_type = $variables['node']->type; array_push($variables['template_files'], "$template_name-node-$node_type.tpl.php"); }
本节的示例应该为您提供了创建独特页面模板的坚实工具包。您也可以想到更多定制模板的方法!
分类模板
上一节描述了如何根据 URL 别名和内容类型构建新模板。当您设计一个站点以进行分类特定增强时,您很可能希望更改页面模板的颜色或图形元素。本节探讨了创建新页面模板以添加颜色特定部分和新变量的方法。要完成此壮举,您将使用与上一节中学到的相同技术。
不幸的是,分类很容易编辑,并且不与永久的机器名称相关联。您可能会发现将分类变量打印到页面以查看分类是如何存储和访问的很有帮助。您还可以使用 Devel 模块的 Themer Info 工具来获取此信息。有关使用此模块的更多信息,请参阅第 2 章。
以下是其中一个分类变量的内容:
[taxonomy] => Array ( [3] => stdClass Object ( [tid] => 3 [vid] => 1 [name] => Available for retail and wholesale. [description] => [weight] => 0 ) [11] => stdClass Object ( [tid] => 11 [vid] => 2 [name] => Books Published by The Ginger Press [description] => [weight] => 0 ) )
在此示例中,用于更改模板变量的类别是分类变量数据数组中包含的第一个类别。重复“从别名 URL 创建的新模板”部分中预处理_page 函数的前四个步骤。此时,您应该调整变量 $target_tax,使其与您想用于区分站点不同部分的类别的位置匹配。此函数假定您正在处理一个词汇表,并且每个术语是一个不同的模板。如果您的站点与此模型不同,您需要调整脚本。
步骤 1 到 4 的说明可以在“从别名 URL 创建的新模板”部分找到。新步骤执行以下操作:
- 检查此页面是否具有 node/nid 的系统路径。此代码片段仅在您显示任何内容类型的单个节点时才有效。
- 检查此页面是否已分配类别。如果已分配,则检索整个类别数组。
- 检索类别的名称。
- 将类别名称转换为纯文本字符串,适合用作文件名。此操作包括将空格替换为连字符并将所有字符转换为小写。
- 将新的模板建议添加到模板建议列表;将类别名称添加到现有的 body 类列表中。
function bolg_preprocess_page(&$variables) { // Step 1: if (module_exists('path')) { // Step 2: $url_alias = drupal_get_path_alias($_GET['q']); // Step 3: $alias_parts = explode('/', $url_alias); // Step 4: $last = array_reverse($alias_parts); $last_part = $last[0]; if ($last_part != "edit") { // Step 5: if (arg(0) == "node" && is_numeric(arg(1))) { // Step 6: if (isset($variables['node']->taxonomy)) { $target_tax = 0; $node_tax = $variables['node']->taxonomy; // Step 7: $tid = array_keys($node_tax); $name = $node_tax[$tid[$target_tax]]->name; // Step 8: $clean_name = check_plain($name); $dash_name = str_replace(" ", "-", $clean_name); $lc_name = strtolower($dash_name); // Step 9: array_push($variables['template_files'], "page-tax-$lc_name.tpl.php"); $variables['body_classes'] .= $variables['body_classes'] . " tax-$lc_name"; } // End of the taxonomy check } // End of the node/nid check } // End of the edit check } // End of the check for the path module } // End of the preprocess_page function
图形标题
本章介绍的最后一个函数允许您根据分配给页面的类别来更改模板或添加新的 CSS 类。如果可以更改该页面的图形标题,那不是很棒吗?通过此处提供的代码片段,您可以将图像放置到主题目录中的一个文件夹中,并让它们自动显示在 Web 站点的唯一类别中。
此代码片段可以用作前面部分第 9 步的替代,或者用作进一步增强。它假定所有图像都位于主题的子目录 tax 中,并且所有图像文件都以小写扩展名 jpg 命名。如有必要,您可以更改这些设置。图像文件应遵循以下约定命名:使用术语名称,将所有空格替换为连字符,并将所有字母转换为小写。如果找不到匹配的分类特定图像,也应提供默认图像。
$image_dir = "tax"; $ext = "jpg"; $default_image_file = "FILENAME.jpg"; $image_dir = drupal_get_path('theme', 'bolg') . "/$image_dir"); $default_image = "$image_dir/$default_image_file"; $image = "$image_dir/$lc_name.$ext"; if (file_exists($image){ $variables['tax_header'] = theme('image', $image, $clean_name, $clean_name); } elseif (file_exists($default_image){ $variables['tax_header'] = theme('image', $default_image, $clean_name, $clean_name); } else { $variables['tax_header'] = ""; }
请记住将默认标题图形放入主题中的相应图像文件夹!
呈现纯内容
有时,精简版本的站点比充斥着各种功能的站点更合适。例如,“简单是最好的”当您旨在提供页面的打印友好版本或 Web 站点的移动友好版本时。
打印友好页面
有两种方法可以准备打印页面。第一种是准备一个独特的打印样式表。浏览器将自动检测被标记为“print”媒体类型的样式表,并根据指定的打印规则格式化页面。第二种方法使用 Print 贡献模块,该模块可以启用链接,将站点访问者引导到使用打印友好型模板的新页面。
CSS 打印友好页面
层叠样式表 (CSS) 指定其目标媒体类型。当页面在 Web 浏览器中显示时,您正在查看分配给页面的“all”和“screen”媒体类型的样式。还有八种其他媒体类型可用,包括“print”、“braille”、“handheld”和“tv”。完整媒体类型列表可在 http://www.w3.org/TR/CSS2/media.html#media-types 获取。
“print”媒体类型指定页面打印时应如何格式化。图 4.11 显示了一个由“screen”样式表格式化的 Web 页面;图 4.12 显示了同一页面的“print preview”。页面中与显示内容无关的部分已被删除。删除的元素包括页眉、导航元素和页脚中的引用。

HICK Tech Web 站点在 Web 浏览器中的显示方式。
HICK Tech Web 站点在“print preview”模式下使用打印样式表显示。
创建打印友好样式表的大部分工作集中在查找可以“隐藏”的区域。要从打印友好版本中删除这些变量,请使用 CSS 属性和属性 display: none;。通过使用属性和属性 display: block;,站点名称(HICK Tech)也被拉入显示。要将打印友好样式表添加到您的站点,您必须在您主题的 .info 文件中注册新文件,并通过导航到 Administer, Site configuration, Performance;滚动到 Web 页面的底部;然后单击“clear cached data”来清除主题注册表。打印特定的 CSS 文件通常命名为 print.css;但是,没有绝对要求使用此文件名。在您主题的 .info 文件中使用以下代码片段设置打印样式表:
stylesheets[print][] = printstylesheet.css The print style sheet for the HICK Tech Web site contains only the following styles: /* Hide all information that is not unique content for this page */ #header-wrapper, #primary-links, #banner-image, .sidebar-right .sidebar-right, .breadcrumb, ul.primary, div.links, #bottomboxes, #footer { display: none; } /* The site name is set to "display: none" in the main style sheet, display it now*/ #print-sitename { display: block; } /* Use print-friendly fonts */ body { font-family: Serif; color: #000; font-size: 1em; text-align: left; } /* Make sure the page is white, with no border, and properly aligned */ #wrapper { background: #fff; border: none; margin: 0; width: 100%; }
要将您的 logo 添加到站点名称,您可以使用以下 CSS 代码片段将背景图像放置在站点上:
#print-sitename { display: block; background-image: url(/path/to/the/image.gif); }
如果您担心精确的颜色匹配(节省您访客宝贵的彩色墨水盒),请考虑在此处使用黑白 logo 而不是彩色 logo。
几个 Drupal 主题提供了打印友好型 CSS,包括默认主题 Garland。查看以下主题以获取有关为您的主题创建打印友好型样式表的其他示例:
- AD Redoable (http://drupal.org/project/ad_redoable)
- NoProb (http://drupal.org/project/noprob)
- Pluralism (http://drupal.org/project/pluralism)
- Zen (http://drupal.org/project/zen)
A List Apart 文章“Going to Print”(作者 Eric Meyer)提供了关于仅使用 CSS 创建打印友好页面的出色信息和策略。这篇文章可以在 http://alistapart.com/articles/goingtoprint/ 找到。
打印友好模板
有时,您的 Web 站点访客根本不相信一个打印友好页面正在等待迎接他们。他们可能与不提供打印友好 CSS 的 Web 站点有过太多糟糕的经历,而且他们可能对 Web 站点构造的机制了解不够,不知道这样的事情是可能的。图 4.13 中显示的 CrochetMe Web 站点显示了一个指向打印友好页面的链接(图 4.14 中显示),所有冗余内容都已删除。要为您的内容创建自定义模板,您必须生成指向每个节点末尾的新链接,创建带有精简标记的新模板,并通知主题有关这些新的(非标准)模板文件。听起来工作量很大,是吧?

CrochetMe Web 站点为其内容使用 Print 模块。链接出现在内容右侧,作者信息下方。
Print 模块前来救援!有了这个漂亮的小模块,您可以轻松地为所有页面启用打印友好、邮件分享和 PDF 链接。有关此模块的更多信息,以及下载和安装它,请访问模块的项目页面:http://drupal.org/project/print。
尽管该模块能够创建页面的 PDF,但它需要一个辅助模块。推荐的辅助模块名为 dompdf,它提供完整的 CSS 支持,并能很好地再现 Web 页面。然而,它不支持 Unicode 字符编码或 PDF 页眉。要安装 dompdf 模块,您必须在您的 Web 服务器上安装字体支持。如果您不熟悉系统管理,或者您使用的是共享主机服务,则此功能实现起来将有些棘手。更多信息请访问 dompdf 网站:http://www.digitaljunkies.ca/dompdf。

Print 模块的输出——一个“打印友好”页面。
移动设备
手持设备正变得越来越普遍,以至于拥有一个可以在“旅途中”导航的站点对于像餐馆、商店和社交网站这样的服务型企业来说是必不可少的。如果您没有资源开发移动应用程序,这并不意味着您无法提供移动友好版的 Web 站点。要提供此精简版的站点模板,您可以使用 Mobile 主题。此主题旨在仅返回干净的 HTML,没有任何样式(尽管内容中嵌入的图像会被保留)。链接和侧边栏的放置方式使得移动或手持设备可以优先显示内容。
有关此模块的更多信息,以及下载和安装它,请访问模块的项目页面:http://drupal.org/project/mobile。
安装 Mobile 主题后,您仍然需要为 Web 站点的移动版本提供一个 URL。要做到这一点,请完成以下步骤:
- 为 Web 站点的移动版本创建一个子域。通常的做法是将您站点域名中的“www”替换为字母“m”。
- 使用您在步骤 1 中创建的域名,在 Drupal 的 sites 文件夹中创建当前站点的副本文件夹。例如,如果您要为 example.com 站点添加移动版本,sites 文件夹将包含以下文件夹:
- example.com
- m.example.com
- 在新移动站点文件夹中,将 Mobile 主题添加到 themes 文件夹。您也可以删除移动版本不需要的任何图形主题。
- 在移动站点文件夹中,编辑 settings.php 文件,找到标记为“Variable overrides”的部分。将默认主题更新为“mobile”并取消注释相关行。编辑前,代码如下所示:
# $conf = array( # 'site_name' => 'My Drupal site', # 'theme_default' => 'minnelli', # 'anonymous' => 'Visitor', ... approximately 50 lines # );
编辑后,它将如下所示(注意粗体行已更改):$conf = array( # 'site_name' => 'My Drupal site', 'theme_default' => 'mobile', # 'anonymous' => 'Visitor', ... approximately 50 lines );
您的新移动站点现在已准备就绪!它使用与主站点相同的数据库,因此始终与主站点完全同步。您无需额外工作!
摘要
本章介绍了如何修改预处理函数,以便您可以准备和修改页面模板变量,并向 Drupal 告知新的页面模板。更具体地说,您学习了如何执行以下任务:
- 将主题分解为组件模板文件
- 在页面模板中使用全站变量
- 使用预处理函数创建新的全站变量
- 通过自定义区域为页面模板建立网格
- 配置全站搜索区块
- 根据分类、页面别名和内容类型更改页面模板
- 使用 CSS 和 Print 模块创建和实现打印友好页面
- 为移动设备创建低带宽站点
在下一章中,您将学习如何用您想要的主题节点填充页面中的“content”区域。