如何为自己的模板使用主题预处理器功能?

时间:2010-03-05 00:58:35

标签: drupal drupal-6 preprocessor drupal-theming

我有几个节点,CCK字段和视图主题的.tpl.php文件。这些模板文件中有很多逻辑可以移动,删除链接,创建新链接等等。我知道这是糟糕的开发而不是“Drupal方式”。

如果我理解正确,“Drupal Way”是在template.php文件中使用预处理器函数来操作变量并添加新变量。关于这一点的一些问题:

  • 是否有为特定主题创建预处理器函数的命名约定?例如,如果我有一个名为content-field-field_transmission_make_model.tpl的CCK字段模板,我如何命名预处理器函数?
  • 我可以将模板预处理器函数用于节点模板,CCK字段模板和视图模板吗?他们有不同的修改模板变量或添加新变量的方法吗?

2 个答案:

答案 0 :(得分:56)

总体而言,您应该read up on manipulating variables within preprocess functions


关于命名约定,这通常很简单,但是您的当前示例有一个问题(见下文):

预处理函数签名需要

[yourModuleName|yourThemeName]_preprocess_[themeFunctionName](&$variables)

因此,在主题template.php文件中为页面模板实现一个将导致

themeName_preprocess_page(&$variables)

大多数情况下,主题函数的名称将是* .tpl.php文件的名称,没有.tpl.php结尾和下划线而不是连字符。 但如果模板文件在template suggestions的基础上被选中,则有一个捕获,因为预处理功能只能用于基本名称,而不能用于其他建议! (替代模板文件的建议在预处理函数本身中添加。)

您当前的示例就是其中一种情况,因为content-field-field_transmission_make_model.tpl.php是一个建议,基本名称为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';
  }
}

(注意:未经测试的代码,谨防拼写错误)

在此之后,模板文件中应该有一个新变量$new_entry$label变量的内容应该已经更改($ variables数组中的所有顶级条目都将是转换为模板文件的单独变量,以数组索引命名。)


至于你的第二个问题,所有模板文件的预处理功能的基本用法是相同的,但要注意:

  • 预处理功能仅适用于使用* .tpl.php文件的主题调用,不是用于主题功能
  • $ variables数组的内容差别很大,具体取决于主题是什么
  • 其他模块也可以实现预处理功能,并且它们将被一个接一个地调用,所以如果你想要改变由另一个模块添加的东西,你只能在你的实现被调用之后这样做(在你的情况下没有问题,因为在模块中的所有实现之后调用主题中的实现 - 只是想提一下可以有很多实现)

答案 1 :(得分:2)

为了弄清楚我们的预处理函数应该命名的是什么,我们需要知道一些输出来自哪个模板文件或主题函数,一个很好的方法是使用theme developer模块

以下是一段详细解释的视频 - http://buildamodule.com/video/drupal-theming-essentials-template-files-theme-function-overrides-and-preprocessing-functions-how-to-use-simple-preprocessing-functions