36

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

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

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

2 回答 2

56

对于一般概述,您应该阅读有关在预处理函数中操作变量的内容


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

预处理函数签名需要是

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

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

themeName_preprocess_page(&$variables)

大多数情况下,主题函数的名称将是 *.tpl.php 文件的名称,没有 .tpl.php 结尾并且带有下划线而不是连字符。但是如果根据模板建议选择模板文件,则有一个问题,因为预处理功能只能针对基本名称实现,而不是针对附加建议!(替代模板文件的建议已添加到预处理函数本身中。)

您当前的示例就是其中一种情况,就像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 数组的内容变化很大,具体取决于主题
  • 其他模块也可能实现预处理函数,它们将被一个接一个地调用,所以如果你想改变另一个模块添加的东西,你只能在之后调用你的实现时这样做(这将不会在您的情况下存在问题,因为在模块中的所有实现之后调用主题中的实现 - 只是想提一下,一次可以有很多实现)
于 2010-03-05T15:23:15.573 回答
2

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

这是一个详细解释它的视频 - http://buildamodule.com/video/drupal-theming-essentials-template-files-theme-function-overrides-and-preprocessing-functions-how-to-use-simple-预处理函数

于 2013-01-21T09:42:57.140 回答