如何在自己的模板中使用主题预处理器函数?

36

我有几个.tpl.php文件用于节点,CCK字段和Views主题。这些模板文件中有很多逻辑来移动内容,删除链接,创建新链接等。我知道这是不好的开发方式,也不符合“Drupal Way”的理念。

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

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

56

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


关于命名约定,这通常很简单,但对于您目前的示例有一个陷阱(见下文):

预处理函数的签名需要是

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

因此,在themes 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数组的内容因所主题的内容而异
  • 其他模块也可能实现预处理函数,并且它们将依次被调用,因此,如果您想更改另一个模块添加的内容,则只能在您的实现在其之后被调用时才能这样做(在主题内的实现在所有模块内的实现之后被调用,我只是想提一下,可能同时存在许多实现)

谢谢,这帮助我理解了很多。我曾错误地认为预处理函数可以针对模板进行特定的设置。如果仅为更改一个节点类型或内容字段而实现预处理器函数,是否会导致性能受到很大影响?当您只想为一种特定类型的节点添加新变量时,为每个节点或字段或其他内容调用预处理函数似乎效率低下。 - Jamison Dance
3
@Jergason:虽然肯定会有一些额外的开销,但一个函数调用本身几乎不需要成本,只要它不执行重型处理(你需要数十万次调用才能让它在毫秒级别上可测量)。根据我的经验,保持模板文件清洁,避免使用“高级”处理逻辑的好处是非常值得的(特别是如果有一天你想要/需要将工作负载拆分并传递给设计师的时候)。 - Henrik Opel

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接