我搜索了这个但只找到了与.tpl文件相关的结果。我想从我的模块覆盖一个主题函数(例如theme_user_list)。我该怎么办?
答案 0 :(得分:10)
您需要使用hook_theme_registry_alter()更改注册表并覆盖使用的函数。一旦覆盖了相关函数的 function 索引,重要的是,清除缓存,模块的替换函数 - mymodule_foo() - 应该生效。
答案 1 :(得分:1)
根据http://api.drupal.org/api/drupal/modules--system--theme.api.php/group/themeable/7的文件:
利用引擎的主题将具有 他们有名的主题功能 自动注册。 虽然这可以根据 主题引擎,标准设置 phptemplate是主题函数 应该命名为THEMENAME_HOOK。对于 例如,对于Drupal的默认主题 (巴蒂克)实施'表' 钩子,phptemplate.engine会 找到bartik_table()。
因此,在您的情况下,您可以通过创建MYTHEMENAME_user_list
函数来覆盖。
答案 2 :(得分:0)
您可以使用建议覆盖单个输出的主题功能。这样做,当你调用主题函数时,附加两个下划线和一个名称,然后将原始主题函数复制到.module文件中,并将其重命名为MYTHEME_original_function_name__ANAME E.g。
<?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来替换它,使用您的模块名称而不是主题名称。
答案 3 :(得分:0)
user491844答案是正确的,虽然有一个更简单的:编辑你的主题template.php。
只需将整个原始主题功能复制到template.php中,替换&#39;主题&#39;通过函数声明中的主题名称。例如:
function theme_lt_unified_login_page($variables) {[...]}
成为这个:
function MYTHEMENAME_lt_unified_login_page($variables) {[...]}
然后空主题注册(或刷新所有缓存)。
唯一的缺点是所有自定义都会累积在一个文件(template.php)中,这使得它对大型项目不那么整洁。