问题又来了:如果你可以创建你自己的模板文件并控制传递给它们的参数,那么你如何操纵或者添加传递给页面和节点模板文件的变量呢?
注意 只有实现为模板文件的可主题化项目,才有变量的聚合和传递一说。如果可主题化项目采用主题函数的实现方式,那么就不需要向其传递变量了。
每次加载一个模板文件都需要调用一系列的预处理函数。这些函数负责聚集变量,以将其传递给合适的模板文件。 让我们继续使用面包屑作为我们的例子。首先,让我们修改sites/all/themes/custom/greyscale/breadcrumb.tpl.php文件,为面包屑分隔符使用一个名为$breadcrumb_delimiter的变量:
<?php if (!empty($breadcrumb)): ?>
<span class="breadcrumb">
<?php print implode(' '. $breadcrumb_delimiter .' ', $breadcrumb) ?>
</span>
<?php endif; ?>
那么我们如何设置变量$breadcrumb_delimiter的值呢?一种可选的方式是,在模块中设置。我们可以创建文件sites/all/modules/custom/crumbpicker.info:
; $Id$
name = Breadcrumb Picker
description = Provide a character for the breadcrumb trail delimiter.
package = Pro Drupal Development
core = 6.x
这个模块非常小,下面是文件sites/all/modules/custom/crumbpicker.module中的内容:
<?php
// $Id$
/**
* @file
* Provide a character for the breadcrumb trail delimiter.
*/
/**
* Implementation of $modulename_preprocess_$hook().
*/
function crumbpicker_preprocess_breadcrumb(&$variables) {
$variables['breadcrumb_delimiter'] = '/';
}
导航到“管理➤站点构建 ➤模块”,启用这个模块,这样你的面包屑就变成了这个样子:首页/管理/站点构建。
前面的例子说明了,如何使用模块来设置模板文件中的变量。如果每设置一个变量,都需要编写一个模块的话,那不是太麻烦了吗?有没有更简单的方式呢?当然有了,那就是使用template.php文件。让我们编写一个函数来设置面包屑分隔符。向你的主题的template.php文件中添加以下代码:
/**
* Implementation of $themeenginename_preprocess_$hook().
* Variables we set here will be available to the breadcrumb template file.
*/
function phptemplate_preprocess_breadcrumb(&$variables) {
$variables['breadcrumb_delimiter'] = '#';
}
这种方式与创建模块相比,更加简单明了,而模块的方式通常适用于在已有的模块中向模板提供变量;如果仅仅为了提供变量,就编写一个模块的话,那么就大材小用了。现在,我们使用模块提供了一个变量,还使用template.php文件中的函数提供了一个变量,那么实际中会使用哪个变量呢?
实际上,预处理函数是有层级结构的,它们按照一定的顺序先后执行,后面的预处理函数可以覆写前面的预处理函数中定义的变量。在前面的例子中,面包屑的分隔符将会是#,这是因为phptemplate_preprocess_breadcrumb()放在crumbpicker_preprocess_breadcrumb()后面执行,前者就对后者中的$breadcrumb_delimiter变量进行了覆写。预处理函数的执行顺序,如图8-6所示。
对于使用Greyscale主题的面包屑的主题化,实际的执行顺序(从前向后)如下:
template_preprocess()
template_preprocess_breadcrumb()
crumbpicker_preprocess()
crumbpicker_preprocess_breadcrumb()
phptemplate_preprocess()
phptemplate_preprocess_breadcrumb()
greyscale_preprocess()
greyscale_preprocess_breadcrumb()
因此,greyscale_preprocess_breadcrumb()可以覆写已经设置的任意变量;它是在变量传递给模板文件以前,最后才调用的。如果这些函数中,只有几个实现了,那么调用所有的函数,会不会浪费时间呢?不错,在构建主题注册表的时候,Drupal将判定有哪些函数实现了,并且只调用这些实现了的函数。
图 8-6.预处理函数的执行顺序
注意 在预处理函数中,你还可以修改的一个变量是$vars['template_file'],它是Drupal将要调用的模板文件的名字。如果你需要基于一个更复杂的条件来加载另一个模板文件的话,那么你可以在这里修改这个变量。
老葛的Drupal培训班 Think in Drupal