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

Posted

技术标签:

【中文标题】如何为我自己的模板使用主题预处理器功能?【英文标题】:How do I use theme preprocessor functions for my own templates? 【发布时间】:2011-01-23 22:35:19 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

对于一般概述,您应该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 数组的内容差异很大,具体取决于主题化的内容 其他模块也可能实现预处理函数,它们会被一个接一个地调用,所以如果你想改变被另一个模块添加的东西,你只能在你的实现被调用之后才这样做(这在您的情况下不会有问题,因为在模块内的所有实现之后调用主题内的实现 - 只是想提一下,一次可以有许多实现)

【讨论】:

谢谢,这对我的理解很有帮助。我错误地认为预处理器功能可能特定于模板。仅仅为了更改一个节点类型或内容字段而实现预处理器功能是否会对性能造成很大影响?当您只想为一种特定类型的节点添加新变量时,为每个节点或字段调用预处理函数似乎效率低下。 @Jergason:虽然肯定有一点相关的开销,但函数调用本身几乎没有成本,只要它不进行繁重的处理(你需要数十万次调用才能进行它可以以毫秒为单位测量)。根据我的经验,保持模板文件没有“高级”处理逻辑的好处是值得的(特别是如果有一天您想要/需要拆分工作负载并将它们传递给设计人员)。【参考方案2】:

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

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

【讨论】:

以上是关于如何为我自己的模板使用主题预处理器功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 C# 生成自定义 StyleCop 规则 - 条件编译预处理器指令

带动画的窗口管理器

如何为文本输入创建逻辑布尔解析器?

如何为 DOM 元素生成唯一的 CSS 选择器?

TensorFlow 高级估计器的预处理数据集

如何为所有 SpecFlow 功能重新生成设计器代码