如何覆盖drupal中的主题功能?

时间:2011-07-02 07:43:34

标签: drupal-7

我搜索了这个但只找到了与.tpl文件相关的结果。我想从我的模块覆盖一个主题函数(例如theme_user_list)。我该怎么办?

4 个答案:

答案 0 :(得分:10)

您需要使用hook_theme_registry_alter()更改注册表并覆盖使用的函数。一旦覆盖了相关函数的 function 索引,重要的是,清除缓存,模块的替换函数 - mymodule_foo() - 应该生效。

有关详细信息,请参阅http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_theme_registry_alter/7

答案 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)中,这使得它对大型项目不那么整洁。