如何为我自己的模板使用主题预处理函数?
我有几个.tpl.php文件的节点,CCK字段和视图主题。 这些模板文件有很多的逻辑来移动东西,剥离链接,创build新的链接等。我明白,这是不好的发展,而不是“Drupal的方式”。
如果我理解正确,“Drupal方式”是在你的template.php
文件中使用预处理函数来操作variables并添加新的variables。 有几个问题:
- 是否有为特定主题创build预处理函数的命名约定? 例如,如果我有一个名为
content-field-field_transmission_make_model.tpl
的CCK字段模板,我将如何命名预处理函数? - 我可以使用节点模板,CCK字段模板和视图模板的模板预处理函数吗? 他们有不同的方法修改模板variables或添加新的?
对于一般的概述,您应该了解在预处理函数中操作variables 。
关于命名约定,这通常很简单,但是对于你当前的例子有一个问题(见下面):
预处理函数签名需要
[yourModuleName|yourThemeName]_preprocess_[themeFunctionName](&$variables)
所以在theme template.php文件中实现一个页面模板会导致
themeName_preprocess_page(&$variables)
大多数情况下,主题函数的名称将是* .tpl.php文件的名称,没有.tpl.php结尾,而是使用下划线而不是连字符。 但是如果在模板build议的基础上select了模板文件,则会出现一个问题 ,因为预处理函数只能用于基本名称,而不能用于其他build议! (在预处理函数本身中添加了替代模板文件的build议。)
你现在的例子就是这种情况之一,因为content-field-field_transmission_make_model.tpl.php
就是这样一个build议,基本名是content-field.tpl.php
,相应的主题函数是content_field
。 所以你必须实现一个名为yourThemeName_preprocess_content_field(&$variables)
的预处理函数,在这个函数中检查$ variables数组中的可用条目,以检查是否实际调用了“field_transmission_make_model”,而不是完全不同的CCK字段,例如:
function yourThemeName_preprocess_content_field(&$variables) { // Are we called for the right field? if ('field_transmission_make_model' == $variables['field_name']) { // Yes, add/manipulate entries within the variables array $variables['new_entry'] = 'A useless new variable'; $variables['label'] = 'A useless change of the existing label variable'; } }
(注意:未经testing的代码,小心input错误)
在这之后,你的模板文件中应该有一个新的variables$new_entry
, $label
variables的内容应该已经改变了($ variables数组中的所有顶层条目都会变成模板文件的单独variables,以数组索引命名)。
至于你的第二个问题,所有模板文件的预处理函数的基本用法是一样的,但请注意:
- 预处理函数仅适用于使用* .tpl.php文件的主题调用, 而不适用于主题函数
- $ variables数组的内容差别很大,具体取决于主题
- 其他模块也可能实现预处理函数,并且它们将被一个接一个地调用,所以如果你想改变另一个模块添加的东西,那么只有当你的实现被调用后才能这样做(这将是不问题在你的情况下,因为主题中的实现在模块中的所有实现之后被调用 – 只是想提到一次可以有许多实现)
为了弄清楚我们的预处理函数应该被命名,我们需要知道一些输出来自哪个模板文件或者主题函数, 一个好的方法是使用主题开发模块 。
这是一个video,详细解释它 – http://buildamodule.com/video/drupal-theming-essentials-template-files-theme-function-overrides-and-preprocessing-functions-how-to-use-simple-预处理函数;