【问题标题】:How to override theme function in drupal?如何覆盖drupal中的主题功能?
【发布时间】:2011-07-02 07:43:33
【问题描述】:

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

【问题讨论】:

    标签: drupal-7


    【解决方案1】:

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

    更多信息请参见http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_theme_registry_alter/7

    【讨论】:

    • 谢谢。 theme_user_list 被许多模块使用。有什么方法可以更改特定上下文的主题?例如,仅针对谁是在线块而不是谁是新块
    • 我不能说——但是如果您不需要进行任何自定义,您的实现可能会检查一些变量,然后将执行重定向到 theme_user_list()
    • 我建议仅在您特别想更改模块文件的输出时才使用 hook_theme_registry_alter()。永远不要为此创建一个模块。一个更好的方法是在你的主题中添加一个函数 '(MY THEME NAME HERE)_func_i_am_overridding()' > 进行更改 > 清除主题注册表缓存。
    【解决方案2】:

    根据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 函数来覆盖。

    【讨论】:

    • 谢谢,但我想在模块而不是主题中执行此操作。
    【解决方案3】:

    您可以使用建议覆盖单个输出的主题功能。这样做,当您调用主题函数时,附加两个下划线和一个名称,然后将原始主题函数复制到您的 .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 使用您的模块名称而不是主题名称来替换它。

    【讨论】:

      【解决方案4】:

      user491844 的答案是正确的,虽然有一个更简单的方法:编辑你的主题 template.php。

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

      function theme_lt_unified_login_page($variables) {[...]}
      

      变成这样:

      function MYTHEMENAME_lt_unified_login_page($variables) {[...]}
      

      然后清空主题注册表(或刷新所有缓存)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 2021-10-19
        • 2015-07-27
        • 1970-01-01
        相关资源
        最近更新 更多