聚焦:主题系统

就像在第一章中简要介绍的那样。模块生产的页面的内容,主题系统给了我们一个在页面显示之前
自定义它的机会。一个主题是一个图片,CSS和HTML/PHP文件的集合,它可以改变Drupal默认输出的
外观。通过切换一个单选按钮,你就可以通过选择不同的主题完全改变站点的设计,你还可以
自定义一些设置来调整这个主题,比如说站点的logo或颜色,这个我们在第二章已经看到。

图11-1 提供了主题系统的一个简单工作原理。Drupal中的每个部分都是和某个模块相关联的,模块是用来处理
页面的请求的。例如“node/1”由节点模块处理,“admin/build/
themes”由系统模块处理,像“albums”的路径则是由视图模块处理的。在模块组建好页面的内容之后
它用 theme()函数通知主题系统,这个函数我们在本章的后面部分做详细讨论。

主题系统主要由一个主题引擎构成,它用来定义页面的动态部分,和Drupal输出的规则,而且可以被当前启用的主题覆盖
,比如Garland。主题引擎能够建立一个基本的框架,修饰内容,用本页面的内容渲染
整个页面模板。但是在可视的魔幻发生的地方---就是你能够控制每个元素如何显示的地方---这里就是主题

页面中的每一个单独的元素,从浏览窗口的标题到站点的logo,在到放置块区的区域。一个Drupal外观的站点
和一个通过主题层工具造型后的网站的不同。让我们看看主题的组成部分,还有Drupal希望我们怎么去使用它。

         图11-1. Drupal 是怎么样从URL到HTML

本章讨论的phpTemplate块主题引擎,(也只一种模板系统)是由Drupal内核提供得 。然而需要指出的是
其他主题引擎也是可以使用的,包括Smarty 和PHPTAL。你可以到http://drupal.org/project/Theme
+Engines.看到完整的列表。

                                         修改Drupal

我们为什么要需要主题系统?它是开源的,不对吗?为什么不直接找到drupal中的核心文件中我们不
需要的地方,然后直接修改它。我们一开始就说修改Drupal的内核文件时一个坏主意。一个drupal的精神
就在于它的普遍性。每个人都有一个完全相同的,经过严格测试的,代码安全的基础。
这个代码一直被大量的社区贡献者测试和升级。

当你改变的Drupal的安装文件后,你就创建了你自己版本的Drupal,这就失去的它的这些优势。当一个
安全更新被发布后,升级你的drupal安装文件会变得非常困难,甚至不可能。大多数
修改了Drupal文件的站点的结局就是进退两难,不能达到安全,速度提高,新特性和其他后续版本改善的
方面。

Drupal在你需要自定义你的需要的时候,不需要你去修改它的代码。它提供了很多机会,在页面加载
钩子被调用,钩子容许模块和主题修改Drupal的基本操作。Drupal一直做默认的事情,但它提供了
很多机会去覆盖这些默认的操作。覆盖Durpal默认行为和表现的绝大多数方法通过简单的命名约定。
如果你给一个文件或函数起一个合适的名字他们就会优先执行。

通过分开的做一些自定义,我们可以很容易的改变Drupal的安装,不用修改Drupal的默认代码。另外
当需要升级网站的时候,Drupal内核和贡献模块可以被很顺利的升级,丝毫不会影响到我们自定义到部分

 

.info 文件
从Drupal 6开始,主题通过主题名.info 文件,放置在主题目录中。这个文件定义了一个主题的各种配置
信息。包括主题名称,所使用的CSS文件和Javascript文件。我们也可以定义用来管理的特性(见第二张章)
这里是一个简单的理解,包括了一下简单的Bluemarine主题配置信息.对.info 文件所有属性的完整描述参见
 http://drupal.org/node/171205.

name = Bluemarine
description = Table-based multi-column theme with a marine and ash color scheme.
core = 6.x
engine = phptemplate

   图11-2. Skyliner 主题, 只包含CSS, JavaScript, 图片, 和a .info 文件.

主题只需要一个.info文件,这样我们就能不使用PHP或HTML来创建主题了。主题可以关联Drupal的默认
HTML,我们只需要添加CSS,图片和javascript,如果需要的话。Skyliner就是这样的主题。(http://drupal.org/project/skyliner)
如图11-2

区域
区域是站点上我们可以放置区块的地方,就像我们在第二章和本书其他地方一样。 Drupal 默认提供5个区域

* Header (header)
* Footer (footer)
* Left sidebar (left)
* Right sidebar (right)
* Content (content)

你可以在你的主题的.info文件中改变这些区域。下面是一个例子,创建了一个新区域,广告,通过不定义他们
去掉了一些默认区域,比如说头部

regions[ads] = Ads
regions[right] = Right sidebar
regions[content] = Content
regions[footer] = Footer

 

通过在主题中定义这些区域,可以限制站点管理员在区块管理页面放置块区的位置。这里头和左边区域是
不可用的。当你不想让管理员在某个位置放置东西的时候这就很有用。

要取消区域的显示还有一步要做,就是在主题的page.tpl.php文件中输入一个变量,比如 <?php
print $ads; ?>. 这个命令将输入所有的放置在这个区域的区块。我们将在“创建一个新区域”一节中
详细讨论。
如果你在.info文件中定义区块,drupal就不会使用默认的区域。如果你只自定义了一个区域,
你还必须自定义其他你想用的区域。例如:如果你添加了一个新的“ADs"区域,你需要要也定义
左,右,内容,头,和脚区域。

 

特色

特色指的是主题的一些可以在主题管理界面Administer→Site building→Themes (admin/build/themes)开启和关闭的元素。以下是Drupal内核默认提供得特征列表。

• Logo (logo)
• Site name (name)
• Site slogan (slogan)
• Mission statement (mission)
• User pictures in posts (node_user_picture)
• User pictures in comments (comment_user_picture)
• Search box (search)
• Shortcut icon (favicon)
• Primary links (primary_links)
• Secondary links (secondary_links)

如果你想要从配置列表中去掉一个特色,你需要和在.info文件中创建你自己的特色列表,确定这些项目是你所不需要的。Skyliner 主题的特色列表如下。

features[] = name
features[] = slogan
features[] = mission
features[] = search
features[] = favicon

features[] = primary_links
features[] = secondary_links

这个列表没有包括logo,发布时的用户图片,和评论时的用户图片。这里站点管理员就不能自定义主题的logo了。

CSS

你在.info文件中可以定义所有的CSS和JavaScripts文件的名称和位置。如果没有添加CSS文件,Drupal会
自动找到和包含style.css文件到你的主题目录。你还可以使用其他的CSS文件。你也可以覆盖你的模块提供
的CSS。通过给主题定义一个和模块CSS文件名字相同的文件。这样我们告诉Drupal "用这个文件,
别用那个。”这样Drupal会置换原来的文件。例如,你可以定义 一个system-menus.css文件在你的主题
中,这个就可以覆盖系统模块中的这个文件。下面的一个例子是Skyliner主题定义CSS文件。(注意
他们都放着在了主题目录下的styles 文件夹中)

stylesheets[all][] = styles/reset.css
stylesheets[all][] = styles/typography.css
stylesheets[all][] = styles/forms.css
stylesheets[all][] = styles/style.css

Javascript

也有一个可以自动识别的Javascript文件名:script.js,可以直接在你的主题中使用。你也可以添加其他的文件名到.info文件中去。Skyliner 主题的例子如下scripts[] = skyliner.js

drupal默认添加了jQuery 库,我们可以直接使用jQuery 功能。

 

                              CSS 和JavaScript优化设置

由于Drupal的模块特性,虽然一个简单的站点是把CSS和javascript文件直接链接到页面中。在drupal 6
的默认安装中,CSS 和JavaScript标签包含在了HTML的内容编辑页(没有额外的模块开启),有7个CSS文件
和六个javascript文件。如果安装和开启新的模块后这个数量会快速增长。到性能设置页 Administer→Site configuration→Perform-
ance (admin/settings/performance)你可以开启CSS 和JavaScript优化。这个选项将添加搜易所有的
CSS和javascript文件到页面中,形成一个优化文件包括评论和删掉额外空格。javascript也一样。
这样13个文件就不包含在原始文件里,优化后我们只剩下4行:

<link type="text/css" rel="stylesheet" media="all"
href="/drupal/sites/default/files/css/7f66dbf90ba0323c5d322cde426f75ed.css" />
<link type="text/css" rel="stylesheet" media="print"
href="/drupal/sites/default/files/css/bf2acfbc35fa1d13cbc410a9bdc36563.css" />
<script type="text/javascript"
src="/drupal/sites/default/files/js/45caa15f0935ad439814b66bcdf4b022.js"></script>
<script type="text/javascript">jQuery.extend(Drupal.settings,
{ "basePath": "/drupal/", "teaserCheckbox": { "edit-teaser-js": "edit-teaser-include" },
"teaser": { "edit-teaser-js": "edit-body" } });</script>

 

显而易见,这些很少的文件,需要更少的服务器资源,无论是否有正确的文件在缓存中。这个功能
很好,我们强烈推荐使用它。但要小心,在你编辑你的 CSS 和JavaScript文件的时候不要开启它。

模板文件


创建一个只包含图片和CSS的Drupal主题很好用,如果Drupal本身输出的HTML符合你的需求。但是
如果你要在节点的标题旁添加一个<div>,或者你要把用户的图片从顶部移动到底部。这时候就就可以
用模板文件了,可以对Drupal的输入进行改装

评论,节点,区块,和页面本书都是从模板文件中输出的。模板文件以.tpl.php结尾。
模板文件根据它所控制的项命名。例如评论被 comment.tpl.php控制,整个的页面被page.tpl.php控制
模板文件和典型的Drupal页面的映射如图11-3,页面后的模板文件有点像图11-4

图11-3.  Drupal.org 上一个典型 Drupal 网页相关的模板文件

图11-4. SpreadFirefox.com (http://www.spreadfirefox.com) 使用了一个比较复杂的布局, 但是应用的模板文件是相同的。

 

模板文件主要由HTML和PHP片段构成,它用来显示页面的动态部分。某个主题的page.tpl.php,特别的,应该看上去相似,如果你用html做了前期工作。一个zen主题(http://drupal.org/project/zen)的page.tpl.php文件如下:

 <!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>
...
<div id="content-area">
<?php print $content; ?>
</div>
...
<?php if ($closure_region): ?>
<div id="closure-blocks" class="region region-closure">
<?php print $closure_region; ?>
</div>
<?php endif; ?>
<?php print $closure; ?>
</body>
</html>

HTML和php代码段嵌套在一起,就像,“在这里输入内容”或者“如果有closure区域的区块把这些放在
<div>标签中。这些代码段在<?php ?>标签中,你要注意以$(美元符号)开头的单词。这些特殊的php
单词叫做变量。变量时动态的内容。所然这些起初只是对没有php基础的设计者的警告,一旦你对php
有了足够的理解,能够读和写例子中的东西,你就突然具备的自定义Drupal的惊人能力。

 template.php 文件

现在我们看了构成主题一些板块和定义主题的一些文件。最后,主体化最酷的地方

就是给了我们彻底覆盖Drupal输出的能力,完全由我们自己来打扮我们的站点。

这里才是真正有意思的地方。我们发现模板文件确实给我们一些对页面的控制权

,但是你不能真正对里面的变量进行操作。你可以对变量周围的HTML进行自由的

编辑,但是我们怎样进入到变量内部,去得到他的行为哪? 真正要从实质上去

自定义这些,你需要用到 template.php文件。这个文件才是真正控制主题,在这里通过添加一些变量来显示页面元素和主题的逻辑。我们也可以覆盖主题函数,这是一个有特殊 名称的函数,模块是通过他们来显示HTML的,而不是通过.tpl.php文件.template.php 文件输出了大多数的HTML,但和普通的PHP文件不同,它是通过函数来生产HTML的。如果你对php不太了解,这个文件对你来说就有点难懂,但是如果 你花一些时间学习php来使用这个文件,它会给你神奇的力量,实现对主题的绝对控制。  这里有一个来自Foundation主题(http://
drupal.org/project/foundation)的template.php 文件,它生成了一个新变量$authored, 用在node.tpl.php 中,可以改变默认的搜索表单(删除标题) 

 <?php
// $Id: template.php,v 1.3 2008/06/23 12:08:02 add1sun Exp $
/**
* Override or insert PHPTemplate variables into the node templates.
*/
function foundation_preprocess_node(&$vars) {
// Set author information line separately from the full $submitted variable.
$vars['authored'] = t('Submitted by') .' '. $vars['name'];
}
/**
* Override the search form (theme, not block) to remove the label.
*/
function foundation_search_theme_form($form) {
unset($form['search_theme_form']['#title']);
return drupal_render($form);
}

注意 template.php 有一个php的开始标签(<?php),但是没有使用结束标签(?>)
这是Drupal社区的编码规范。如果加上了结束标签可能导致创建头文件错误,
所以不添加结束标签被认为是php的一个通用的最佳实践。
你可以到 http://drupal.org/node/545得到这个标准的细节。

在本章的后面我们将举一些小例子,这里你会接触到如何用template.php文件覆盖Drupal的输出。

 

无论在任何时候你对主题做了覆盖后,你都需要通知drupal。drupal为了提高它的性能
,它在采用了缓存机制,这样是它响应速度更快。当你做了修改后,需要更新这些缓存。
首先,你应该停用全站缓存功能。你可以到Administer→Site configuration→
Performance (admin/settings/performance),关闭优化选项。另外,当你做了覆盖修改
后,你需要点击页面最下面的“Clear cached data”按钮,来清除注册缓存。Devel 模块
 (http://drupal.org/project/devel)也提供的更好的功能。

 

                                                 主体化工具箱

在我们进入“操作:创建一个自定义主题”部分之前,我们要花一点时间简要讨论一些称手的工具
,大多数主题开发者认为这些工具在提供工作效率上时很必要的。

文本编辑器
在你处理Drupal的代码时,你需要有一个文本编辑器。文本编辑器必须是那种纯文本的,不会
添加任何加粗字体,斜体字功能的东西进去。不要使用微软的word,你可以使用
Firebug (https://addons.mozilla.org/en-US/firefox/addon/1843),Notepad++
(http://notepad-plus.sourceforge.net),TextWrangler (http://www
.barebones.com/products/textwrangler) 或者 Smultron (http://smultron.sourceforge
.net) for Mac, 或者 Kate (http://kate-editor.org) 或者 gedit (http://www.gnome.org/
projects/gedit) for Linux。最好选择那些有语法高亮和行数标记的软件。
你可以到http://drupal.org/node/147789.看到关于各种编辑器的详细信息。

Firebug (https://addons.mozilla.org/en-US/firefox/addon/1843)
这个工具是主题开发者的好朋友。他是Firefox 浏览器的插件。用它可以高亮选择页面上的元素
还能看到CSS修改后的实时效果。它也是一个很好的JavaScript测试工具.

Web Developer Toolbar (https://addons.mozilla.org/en-US/firefox/addon/60)
他也是Firefox 浏览器的插件。它提供了很多有用的工具,包括快速调整浏览器的大小,显示页面里
所有的元素,运行各种调试器(CSS, HTML, accessibility, 等等
),编辑和调试线上的表单。

Devel 模块(http://drupal.org/project/devel)
这个模块其实是一个模块包,包括了开发者需要的很多称手的工具。
里面最用于的工具是Devel-provided block,用一个更好用的清除缓存功能。Devel
Generate module它可以帮助你快速的添加内容和用户以方便测试。

Theme developer 模块( Devel的一部分)
虽然他是Devel的一个部分,由于它太有用了,所有我们把它拿出来单独讲讲。这个模块
启用后,你就可以通过他了解到页面中的每个元素是和那个模板文件相关联的,是由哪
个变量生成的。

 

Tags:

Comments

Post new comment

The content of this field is kept private and will not be shown publicly.
By submitting this form, you accept the Mollom privacy policy.