Drupal 7 如何覆盖drupal中的主题函数?

Drupal 7 如何覆盖drupal中的主题函数?,drupal-7,Drupal 7,我搜索了这个,但只找到了与.tpl文件相关的结果。我想从我的模块中重写一个主题函数(例如,theme\u user\u list)。我如何做到这一点?根据以下文档: 使用引擎的主题将具有 它们的命名主题化功能 自动为他们注册。 然而,这可能会根据具体情况而有所不同 主题引擎,由 phptemplate是主题函数 应该命名为THEMENAME_HOOK。对于 例如,对于Drupal的默认主题 (Bartik)实现“表格” 钩子,phptemplate.engine将 查找bartik_表() 因此

我搜索了这个,但只找到了与.tpl文件相关的结果。我想从我的模块中重写一个主题函数(例如,theme\u user\u list)。我如何做到这一点?

根据以下文档:

使用引擎的主题将具有 它们的命名主题化功能 自动为他们注册。 然而,这可能会根据具体情况而有所不同 主题引擎,由 phptemplate是主题函数 应该命名为THEMENAME_HOOK。对于 例如,对于Drupal的默认主题 (Bartik)实现“表格” 钩子,phptemplate.engine将 查找bartik_表()


因此,在您的情况下,您可以通过创建
mythmename\u user\u list
函数来覆盖注册表。

您需要使用hook\u theme\u registry\u alter()更改注册表并覆盖所使用的函数。一旦覆盖了相关函数的函数索引,并且重要的是清除了缓存,模块的替换函数mymodule_foo()就会生效


有关更多信息,请参阅。

您可以使用建议覆盖单个输出的主题函数。执行此操作时,在调用主题函数时,附加两个下划线和一个名称,然后将原始主题函数复制到.module文件中,并将其重命名为MYTHEME\u original\u function\u name\u 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\u registry\u alter来使用模块名而不是主题名替换它。

user491844答案是正确的,尽管有一个更简单的答案:编辑您的theme template.php

只需将整个原始主题函数复制到template.php中,并在函数声明中将“theme”替换为主题名称。例如:

function theme_lt_unified_login_page($variables) {[...]}
变成这样:

function MYTHEMENAME_lt_unified_login_page($variables) {[...]}
然后清空主题注册表(或刷新所有缓存)


唯一的缺点是,您的所有定制都将累积在一个文件(template.php)中,这使得大型项目中的文件不那么整洁

谢谢,但我想在模块而不是主题中完成这项工作。谢谢。许多模块都使用theme_user_list。是否有任何方法可以更改特定上下文的主题?例如,仅针对谁的在线块而不是谁的新块我不知道--但您的实现可能会检查一些变量,然后将执行重定向到theme_user_list()如果不需要任何自定义设置,我建议仅当您特别需要更改模块文件的输出时才使用hook\u theme\u registry\u alter()。永远不要仅仅为此创建模块。更好的方法是,只需在主题>执行更改>清除主题注册表缓存中添加一个函数“(此处为我的主题名)\u func\u i\u am\u overriding()”。