如何为我自己的模板使用主题预处理函数?

我有几个.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$labelvariables的内容应该已经改变了($ 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-预处理函数;