原文:http://drupal.org/node/171188 译者:葛红儒, http://zhupou.cn/
在软件开发中,将逻辑层和表示层分开,是很常见的.其中原因很多,最明显的原因是,后台的业务逻辑层所需要的技能,与前台表示层所需要的技能相比,有很大的不同.作为一个主题开发者,你可以在许多方面控制用到的数据,但是它局限于输出和显示.而只有Drupal内核模块和其他模块才用来负责输入.例如,一个模块可以实现一个带有默认外观的表单,来处理用户输入,并将其保存到数据库中.而Drupal主题(theme)的作用是仅仅用来重写默认外观.
在Drual中,这一抽象层是通过theme(主题)函数实现的.主题函数就是一个管道,将逻辑层与表示层连在一起.在主题引擎(theme engines)之上,有一个一个可选的中间层,用来选择标记语言比如PHPTAL或者Smarty.它还允许主题控制所有表示层的标识字体.而主题引擎像标记语言一样,都是可选的. PHPTemplate是默认的主题引擎.从名字我们就可以看出,它在xHTML中输出变量时,使用PHP作为标记语言.
从Drupal6开始,创建主题引擎的需求已被充分的淡化。
从上图可以看出,逻辑层和主题层(表示层)都可以为输出实现一个主题化的外观,(存在极个别例外情况)只有主题层才能对底层进行覆写。主题引擎(Theme engine)可以覆写内核模块和可选模块中的主题输出,而主题(图中最上方的theme一层)对下面的每一层都可以进行覆写。
注意,PHPTemplate引擎并没有覆写任何输出,但是其他主题引擎可以这样。也存在特殊情况,一个模块可以影响输出,或者对任何东西都可以覆写,但是他只用在非常特殊的情况下,而在大多数情况下,都遇不到这种情形。例如,devel的主题者模块(themer module)就属于这种特例,它是用来帮助主题开发的。更多细节将在接下来的章节中展开。
如果你的主题是由CSS完全控制的,也就是纯CSS主题,那么这里所讲的大部分内容你都不需要关心,但是当需要修改标记文本时,理解如何找到输出的源头,对于你的工作来讲,是非常有帮助的。
• 注意,Drupal的内核和第3方模块,总是使用可主题化的函数和模板文件来输出表示层的文本的。千万不要在这些模块里面直接对主题进行修改,如果这样做的话,当你需要升级时,情况就会变得复杂起来。这样做就是所谓的“分支”("forking")。开源的强大之处在于,让开源社区来负责修正臭虫(bug)和添加新的特性。一旦你建立了一个分支,也就意味着你创建了一个封闭的系统,这样你就脱离了社区。Drupal提供了各种功能,用来覆写表示层。如果你必须要在模块中直接对主题进行修改的话,要么是你做错了,要么是你发现了一个臭虫。如果是后者的话,请填一个臭虫报告。如果提供一个补丁来修正该问题的话,那是最好不过的了。
• 对于那些熟悉drupal以前版本的PHPTemplate引擎朋友来说,在Drupal6中,PHPTemplate引擎中的大部分函数都被移到了更底层的内核中。现在PHPTemplate仅仅用来 发现主题函数和该主题函数用到的模板文件。与其说它是一个主题引擎,不如说是一个主题帮助函数。PHPTemplate是最初由Adrian Rossouw为Drupal4.7编写的。Drupal6中的修改是由Earl Miles完成的。论坛中的一个帖子(http://drupal.org/node/7133)提供了最初创建引擎的原因,而在http://drupal.org/node/130987 则提供了Drupal6中的问题列表。