代码之家  ›  专栏  ›  技术社区  ›  Jamison Dance

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

  •  36
  • Jamison Dance  · 技术社区  · 14 年前

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

    如果我理解正确,“drupal方法”是在 template.php 操作变量并添加新变量的文件。有几个问题:

    • 是否有为特定主题创建预处理器函数的命名约定?例如,如果我有一个名为 content-field-field_transmission_make_model.tpl ,如何命名预处理器函数?
    • 我可以为节点模板、cck字段模板和视图模板使用模板预处理器函数吗?他们有不同的方法来修改模板变量还是添加新的模板变量?
    2 回复  |  直到 12 年前
        1
  •  55
  •   Henrik Opel    14 年前

    总的来说,你应该 read up on manipulating variables within preprocess functions .


    关于命名约定,这通常非常简单,但对于当前示例有一个陷阱(请参见下文):

    预处理函数签名需要

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

    因此,在themes 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数组的内容变化很大,这取决于主题是什么
    • 其他模块也可能实现预处理函数,并且它们将被一个接一个地调用,因此如果您想要更改由另一个模块添加的内容,则只能在之后调用您的实现(这在您的情况下是没有问题的,作为实现在一个主题中的s在模块中的所有实现之后被调用-只是想说一次可以有很多实现)
        2
  •  2
  •   amitgoyal    12 年前

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

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