3.函数VS模板:
正如前面所说,实现特定的钩子有两种方式。通常的“函数”或者“模板”。根据要主题化的元素的特点,选用最合适的方式。drupal内核和模块可选用任何一种方式来构建输出。而上面的主题层,可以使用同样的方式来覆写,或者改变选用的方式。
Links to PDF. Flow map for 5 also available for comparison.
使用函数来实现主题钩子,具有速度上的优势。通常比使用模板的快5倍,但是对们对于涉及者来说,就比较困难,通常涉及者都比较熟悉直接的xHTML,而不是php函数。通常,我们不需要考虑这样一点,而是根据钩子的特点和在一个页面中被调用的次数,来决定要选择的方式。
注意:在Drupal5及以前版本,内核和模块只能使用函数来实现主题钩子。想要使用模板的话,必须使用PHPTemplate来覆写钩子,并在引擎层中进行转换。
下面是覆写的两个例子,这里使用了devel themer.
函数方式:
主题函数theme_menu_local_tasks,是一个用来输出一级和二级标签的简单函数。这里的主题钩子就是"menu_local_tasks"。为了覆写它,可将函数名中的前缀"theme"替换为你主题的名字或者所用主题引擎的名字。最好使用主题的名字,这样可以避免潜在的与子主题(http://drupal.org/node/225125)的命名冲突。
本例中,Garland是使用引擎名来覆写的。如果你的主题是基于Garland的子主题,那么你必须使用你的主题名了。
将下面的代码放到主题的template.php,清空主题注册表缓存,这样就覆写了默认输出。注意,将"drop"改为你主题的名字。
<?php
function drop_menu_local_tasks() {
$output = '';
if ($primary = menu_primary_local_tasks()) {
$output .= "<ol class=\"tabs primary\">\n". $primary ."</ol>\n";
}
if ($secondary = menu_secondary_local_tasks()) {
$output .= "<ol class=\"tabs secondary\">\n". $secondary ."</ol>\n";
}
return $output;
}
?>
这里所做的唯一修改就是将<ul>标签改为了<ol>。
在api.drupal.org你可以找到所有的主题函数。
模板方式:
如果默认是使用模板实现的,那么你只需要简单得将模板源文件拷贝到主题下面,然后清空主题注册表,就完成了覆写。下面为search-theme-form.tpl.php的一个例子。注意在这里,主题钩子就是"search_theme_form",需要将连字符“-”替换为下划线“_”.
这就是你要做的。使用编辑器,打开拷贝的模板,对其进行修改。内核中的所有.tpl.php文件都带有注释。根据注释,你就可以做出具体的修改了。
注意:模板可以放在主题下面的任何目录中。这样便于管理,也避免了主题根目录下面的混乱。
相关页面:
-
为了定制模板中的变量,参看自页面“预处理函数”(http://drupal.org/node/223430)。
- 可以在子页面“核心模板和建议”(Core templates and suggestions)找到所有的主题模板。
将函数转化为模板
将一个主题函数转化为一个模板,开始是需要一点工作的,但一旦完成,便很好使用。如果你和设计者一同工作,那么转化为模板,将会使设计者更专注于设计,而不是编码。在内核中,已有了很多模板,而在将来的版本中,将有更多的主题函数转化为模板。第3方模块,为了与内核接轨,最好也使用模板。本部分是为那些还没有使用模板的主题钩子准备的。
Drupal以模板的方式识别主题钩子是自动完成的。下面是完成修改所需的所有必要条件:
-
模板名必须与主题钩子匹配。
-
主题钩子中的下划线必须改为连字符。
- 模板文件必须使用扩展名".tpl.php"。(根据主题引擎的不同,扩展名会有所不同)
假如主题函数为theme_user_signature。这里的主题钩子就是"user_signature"。创建一个名为"user-signature.tpl.php"的文件,清空注册表,就会告诉Drupal现在钩子已改为模板方式了。现在该文件中的内容将替代相应的函数。这里的难点是,设置模板文件中用到的变量,这可以通过预处理函数来完成。
需要注意的一些点:
-
可以在模板中直接放置代码,但这种方式不好。所有的复杂逻辑都应该从.tpl.php文件中分离出来。这样使得模板文件更干净,更便于管理。
-
这也有安全方面的考虑。将逻辑与显示分离,可以避免潜在的恶意用户来创建内容,从而减小CSS(cross-site scripting)攻击的机会.当让你的设计者处理模板文价时,所有的输出都应该非常干净,这样设计者就不用考虑安全问题了。
-
比较关于论坛的theming functions in 5和template conversions in 6。你可以使用这个作为例子,来进行两种方式之间的转换。
- 更多关于预处理函数的信息(http://drupal.org/node/223430)。