为了一般概述,您应该阅读有关在预处理函数中操作变量的内容。
关于命名约定,这通常很简单,但对于您目前的示例有一个陷阱(见下文):
预处理函数的签名需要是
[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) {
if ('field_transmission_make_model' == $variables['field_name']) {
$variables['new_entry'] = 'A useless new variable';
$variables['label'] = 'A useless change of the existing label variable';
}
}
(注意:未经测试的代码,请小心拼写错误)
完成后,您的模板文件中应该有一个新变量$new_entry
可用,并且$label
变量的内容应该已更改($variables数组内的所有顶级条目将变成单独的变量以供模板文件使用,命名方式为数组索引)。
至于您的第二个问题,预处理函数的基本用法对所有模板文件都是相同的,但请注意:
- 预处理函数仅适用于使用*.tpl.php文件的主题调用,而不适用于主题函数
- $variables数组的内容因所主题的内容而异
- 其他模块也可能实现预处理函数,并且它们将依次被调用,因此,如果您想更改另一个模块添加的内容,则只能在您的实现在其之后被调用时才能这样做(在主题内的实现在所有模块内的实现之后被调用,我只是想提一下,可能同时存在许多实现)