在Drupal中调用自定义主题函数的正确方法是什么?

在Drupal中调用自定义主题函数的正确方法是什么?,drupal,Drupal,我有一个自定义主题,我们称之为“MyTheme”。在template.php文件中,我有一个名为“MyTheme\u MyFunction”的函数 在my page.tpl.php中,我应该能够做到以下几点: <?php print theme('MyFunction'); ?> <?php print MyTheme_Function(); ?> 或者,我必须这样做: <?php print theme('MyFunction'); ?> <

我有一个自定义主题,我们称之为“MyTheme”。在template.php文件中,我有一个名为“MyTheme\u MyFunction”的函数

在my page.tpl.php中,我应该能够做到以下几点:

<?php print theme('MyFunction'); ?>
<?php print MyTheme_Function(); ?>

或者,我必须这样做:

<?php print theme('MyFunction'); ?>
<?php print MyTheme_Function(); ?>


我知道后一种方法有效,但前一种方法不也有效吗?

第一种方法肯定有效,但要做到这一点,您需要在hook_theme()中告诉Drupal您的主题函数(即主题的template.php中的MyTheme()),然后清除您的主题缓存

有关详细信息,请参阅。

使用主题() 您应该始终通过
theme()
函数调用主题函数,如第一个示例所示:
theme('MyFunction')
。如果不这样做,就破坏了Drupal主题系统,不允许其他模块开发人员有效地覆盖您的输出

编写自己的主题函数时,不要忘记使用
hook\u theme
(已解释)在主题注册表中注册主题函数。如果不这样做,调用
theme('MyFunction')
将不起作用。在最初注册函数后清除缓存也不会有什么坏处

它为什么重要的例子
例如,在theme的template.php中,您可以定义自己的
theme\u image
函数来覆盖Drupal core处理图像的方式。您可以将函数命名为
name\u of\u theme\u image
,并覆盖它返回的内容。如果
theme\u image
不总是被称为
theme('image')
,您将无法利用此重写行为,因为
theme()
充当主题函数的单一入口点和委托器。主题函数也是如此。

您可以使用preprocess页面挂钩


函数themename_preprocess_页面(&$variables){
$variables['custom_name']=函数_name();
}

然后在page.tpl.php中,您可以使用 这就是变量传递到tpl文件的方式

类似地,对于node.tpl.php,您可以使用


函数themename_preprocess_节点(&$variables){

}

只有在为上述函数实现hook_theme()函数时,前者才起作用。