【发布时间】:2011-07-02 07:43:33
【问题描述】:
我搜索了这个,但只找到了与 .tpl 文件相关的结果。我想从我的模块中覆盖一个主题函数(例如 theme_user_list)。我该怎么做?
【问题讨论】:
标签: drupal-7
我搜索了这个,但只找到了与 .tpl 文件相关的结果。我想从我的模块中覆盖一个主题函数(例如 theme_user_list)。我该怎么做?
【问题讨论】:
标签: drupal-7
您需要使用 hook_theme_registry_alter() 更改注册表并覆盖使用的函数。一旦你覆盖了相关函数的 function 索引,重要的是,清除你的缓存,你的模块的替换函数 - mymodule_foo() - 应该会生效。
【讨论】:
根据http://api.drupal.org/api/drupal/modules--system--theme.api.php/group/themeable/7的文档:
使用引擎的主题将具有 他们著名的主题功能 自动为他们注册。 虽然这可能会根据 主题引擎,由 phptemplate就是那个主题函数 应该命名为 THEMENAME_HOOK。为了 例如,对于 Drupal 的默认主题 (Bartik) 实现“表” 钩子,phptemplate.engine 会 找到 bartik_table()。
因此,在您的情况下,您可以通过创建 MYTHEMENAME_user_list 函数来覆盖。
【讨论】:
您可以使用建议覆盖单个输出的主题功能。这样做,当您调用主题函数时,附加两个下划线和一个名称,然后将原始主题函数复制到您的 .module 文件中,并将其重命名为 MYTHEME_original_function_name__ANAME 例如
<?php
...
$vars['test'] = array(
'#theme' => 'image_formatter__SOMENAME',
'#item' => $item,
'#image_style' => 'large',
);
...
?>
<?php
function MYTHEME_image_formatter__SOMENAME($variables) {
/* my custom code */
}
?>
缓存被清除后,您应该能够在主题注册表中看到它,因此您可以使用 theme_registry_alter 使用您的模块名称而不是主题名称来替换它。
【讨论】:
user491844 的答案是正确的,虽然有一个更简单的方法:编辑你的主题 template.php。
只需将整个原始主题函数复制到 template.php 中,在函数声明中将“主题”替换为您的主题名称。所以例如这个:
function theme_lt_unified_login_page($variables) {[...]}
变成这样:
function MYTHEMENAME_lt_unified_login_page($variables) {[...]}
然后清空主题注册表(或刷新所有缓存)。
唯一的缺点是您的所有自定义设置都会累积在一个文件 (template.php) 中,这使得它在大型项目中不那么整洁。
【讨论】: