【问题标题】:How do I get the path of the current drupal theme?如何获取当前drupal主题的路径?
【发布时间】:2010-09-23 03:46:29
【问题描述】:

Drupal API 有drupal_get_path($type, $name),它将给出任何特定主题或模块的路径。如果我想要当前主题的路径怎么办?

【问题讨论】:

  • 小心使用当前主题路径。如果有人从您的主题创建子主题,则当前主题路径将是子主题的路径,而不是您的!您可能会破坏自己的主题或子主题。 - 至少 D8

标签: drupal drupal-6 drupal-theming


【解决方案1】:

这应该可以工作 (doc):

global $theme;
$path = drupal_get_path('theme', $theme);

// there's also a $theme_path global

global $theme_path;

【讨论】:

  • 最好使用path_to_theme(),而不是使用$theme_path
  • 为什么使用 path_to_theme() 而不是 $theme_path 更好?
  • @timoxley,唯一的区别是如果 $theme_path 未设置,主题将被初始化,然后返回新的 $theme_path。见path_to_theme
  • 我注意到在字段模板中使用的 path_to_theme() 和 $theme_path 为我提供了模块字段/模块的路径。唯一正确显示的是 $theme。
【解决方案2】:

使用path_to_theme 函数。

【讨论】:

  • 请注意,当从“theme_*”函数内部调用时 path_to_there 将返回当前模块的路径而不是当前活动主题的路径,这可能会导致错误,请参阅此错误报告中的更多详细信息:drupal.org/node/194098
【解决方案3】:

在 Drupal 5 中,您可以简单地使用:path_to_theme()

这将为您提供从 Drupal 根目录到特定主题目录的完整路径。请注意,它不包含尾部斜杠。

在 Drupal 6 中,它的行为略有不同。如果您从页面中调用它,它将调用当前正在执行主题的任何内容...无论是您的主题、模块等。以下是 API 文档的关键引用:

它可以指向活动主题或 处理主题的模块 执行。例如,当 在主题范围内调用 调用它取决于在哪里 处理主题功能。如果 从一个模块实现,它将 指向模块。如果实施 从活动主题中,它将指向 到活跃的主题。调用时 在主题调用范围之外, 它总是指向活跃的 主题。

来源:http://api.drupal.org/api/function/path_to_theme

【讨论】:

    【解决方案4】:

    在 D6 中,path_to_theme() 可能不会以您期望的方式运行,具体取决于您使用它的方式。如果你在任何主题预处理函数之外使用它,那么它可能会给你你想要的,但是如果它在模块的主题/预处理钩子函数的上下文中被调用......它将指向模块路径声明了主题。

    例如。如果我有一个主题“my_theme”和我的模块“my_module”,它使用预处理钩子覆盖论坛主题,在我的模块中调用 path_to_theme():例如my_module_preprocess_forums()... 将返回“论坛”,而不是人们可能期望的“my_theme”。

    如果你问我的话,非常果味。

    【讨论】:

      【解决方案5】:

      在 Drupal 7 中,为了获取当前主题的路径,我们可以使用: path_to_theme()函数。

      【讨论】:

        【解决方案6】:

        对于 D8,主题文件夹在预处理函数中可用:

        function hook_preprocess_page(&$variables) {
          $variables['some_logo_file'] = "/{$variables['theme']['path']}/images/logo.png";
        }
        

        page.html.twig:

        <img src="{{ logo_src }}">
        

        【讨论】:

          【解决方案7】:

          在 Drupal 8 中

          global $base_url;
          $theme = \Drupal::theme()->getActiveTheme();
          $image_url = $base_url.'/'. $theme->getPath() .'/images/image.jpg';
          

          【讨论】:

          • 这不是最好的方法 - 请参阅其他答案。
          【解决方案8】:

          在 Drupal 8 中,如果您需要在管理主题处于活动状态时获取活动主题路径,您可以获取默认主题路径:

          $themeHandler = \Drupal::service('theme_handler');
          $themePath = $themeHandler->getTheme($themeHandler->getDefault())->getPath();
          

          【讨论】:

          • 我认为 Drupal 8/9 的最佳答案
          猜你喜欢
          • 2016-08-20
          • 1970-01-01
          • 2020-11-21
          • 2019-02-18
          • 2017-02-20
          • 1970-01-01
          • 1970-01-01
          • 2016-06-04
          • 2018-03-11
          相关资源
          最近更新 更多