如何根据URL更改主题?


38

我有一个在example.org上运行的Drupal实例。已安装并激活了主题X。现在应该在一个有限的时间段内,在已经​​“雕刻”出一个特殊部分的站点上举行一个活动。与该事件有关的所有内容都将转到example.org/event2011。

我想有一个不同的主题,只要根据本条浏览该网页中显示(如http://example.org/event2011/abouthttp://example.org/event2011/node/123)。我怎么做?

我经历了很多模块,但是没有一个模块支持Drupal7。最好是,我希望使用模块来完成它,并且不想在代码级别更改自己。


1
您是否希望在/ event2011 / node / 123路径下看起来像一个完整的站点?
杰里米·法兰西

Answers:


33

考虑到更改是在有限的时间内进行的,并且实现这样的代码并不困难,因此我建议实现一个自定义模块,以更改用于特定页面的主题。

只需执行hook_custom_theme()以下操作即可:

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'the theme to use for that page';
  }
}

如果您需要更改主题仅供http://example.com/event2011,而不是http://example.com/event2011/node/123,那么代码应改为

function mymodule_custom_theme() {
  if (arg(0) == 'event2011' && !arg(1)) {
    return 'the theme to use for that page';
  }
}

至于在菜单回调的定义中使用主题回调,文档说:

通常,主题回调函数的使用应限于其功能与特定主题紧密相关的页面,因为它们只能由专门针对的页面的模块覆盖hook_menu_alter()。应该改用实现更通用的主题切换功能的模块(例如,允许根据当前用户的角色动态设置主题的模块)hook_custom_theme()


我建议的current_path()函数api.drupal.org/api/drupal/includes%21path.inc/function/...。您将有“为”条件更简单
奥古斯托

22

像其他注释所建议的那样,定制解决方案可能是最好的,但是如果您真的想使用模块,则最好的选择是ThemeKey。自11年5月23日起,它已发布稳定版本。


8

另外,您可以使用theme callback菜单系统的新选项,hook_menu_alter()如下所示。ps Checkout hook_menu()了解有关theme callback

<?php
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
  // Set the theme callback function for all node pages. As per the
  // standard behavior for hook_menu() properties, this will be
  // inherited by all paths underneath node/%node as well, unless
  // they define their own theme callback.
  $items['node/%node']['theme callback'] = 'mymodule_default_node_theme';

  // Set a different theme callback for node edit pages, and pass
  // along the node object to this function so we can make decisions
  // based on it.
  $items['node/%node/edit']['theme callback'] = 'mymodule_edit_node_theme';
  $items['node/%node/edit']['theme arguments'] = array(1);
}
/**
* Defaults to using the 'some_theme' theme for node pages.
*/
function mymodule_default_node_theme() {
  return 'some_theme';
}

/**
* For editing page nodes, uses the 'some_other_theme' theme.
*/
function mymodule_edit_node_theme($node) {
  return $node->type == 'page' ? 'some_other_theme' : mymodule_default_node_theme();
}
?>

此外,还有使用更传统的示例 hook_custom_theme()

<?php 
/**
* Implements hook_custom_theme().
*/
function mymodule_custom_theme() {
  // check path using arg(0)
  // check $user
  // do whatever special checking you want and simply return theme key (name of theme folder most of the time)
    return 'special_theme';
  }
}
?>

摘自:http : //drupal.org/node/224333#custom_theme


6

当路径为/ event2011 /时,您可以简单地使用Context并使用主题来应用。您可以在cotext条件下简单地设置路径,并在内容操作中更改主题。这是您可以非常轻松地基于URL在网站上的主题之间进行切换。甚至适用于手机;)


主题操作将自定义变量传递给主题,但实际上并没有改变
Alex Weber

6

使用ThemeKey很简单,它是迄今为止主题切换规则的最流行,功能最强大的模块(支持8.x),可以根据当前路径,分类术语,语言,节点类型以及许多其他内容来自动选择主题,许多其他属性。还可以轻松扩展它以支持其他模块公开的其他属性。除了标准功能外,ThemeKey还可以自动扩展许多contrib模块的功能,并具有扩展它的模块。

用法(7.x)

启用模块后,转到admin/config/user-interface/themekey。有许多选项可以切换主题,但是您可能会对感兴趣path:node_alias,因此可以像说/ my_url一样设置所需的值,然后选择要在此URL启用的主题。您也可以使用通配符,例如web/*/^web/.*

检查:如何为路径加载主题

高级用法

ThemeKey 7.x包含一个名为ThemeKey示例的可选模块,以演示开发人员如何扩展ThemeKey。

帮助(7.x)

请查看Mustardseed(7.x)的视频教程

有关该主题的更多帮助,请参见/admin/help/themekey

还要检查其他与相关的SE问题。


另外,还有Switchtheme(7.x),它添加了一个块,以允许用户在启用的主题之间切换。


5

使用URL别名Pathauto模块时,请注意使用当前Drupal路径的组件时的细微差别。

在某些情况下,您可能不想使用arg()。实际上,Drupal API文档实际上建议避免在可能的情况下使用此功能,因为结果代码难以阅读。

考虑一下kiamlaluno提出的以下示例:

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

在Drupal 7中,如果一个节点具有的别名event2011,使用arg(0)将返回node作为第一URL分量,而不是别名。

print_r(arg(0));

Array
(
    [0] => node
    [1] => 150
)

相反,如果你需要工作,别名有几种方法可以得到当前URL在Drupal,包括menu_get_object()current_path()request_path()和其他人。

这是一个经过重做的示例,该示例使用别名作为切换主题的触发器:

function mymodule_custom_theme() {
  $current_page_path = explode('/', request_path());      

  if ($current_page_path[0] == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

3

如何根据用户角色切换主题:

创建一个自定义模块,然后复制并粘贴以下内容:

<?php
/**
 * Implementation of hook_init().
 */
function mymodule_init() {
  global $custom_theme, $user;
  if (in_array('my special role', $user->roles)) {
    $custom_theme = 'mytheme';
  }
}
?>

您必须更换:

mymodule =>使用您的模块名称

我的特殊角色=>,其中包含您的用户需要的角色名称,以便他们看到不同的主题。

mytheme =>带有您要切换到的主题的名称


1

您可以使用Page Theme模块来实现

“页面主题”模块是一个简单易用的模块,它允许使用与特定页面上网站默认设置不同的主题。

特征

  • 将主题分配给单个页面或页面列表。(将页面设置为Drupal路径)
  • 允许在Drupal路径中使用“ *”字符作为通配符。
  • 允许安排主题。(如果定义了多个页面,则将使用列表中的第一个主题)
  • 允许启用/禁用主题。
  • Drupal新手友好。

0

您可以使用Page Theme模块来实现以下目的:Page Theme模块是一个简单易用的模块,允许在特定页面上使用与网站默认主题不同的主题。

特征 :

将主题分配给单个页面或页面列表。(将页面设置为Drupal路径)允许在Drupal路径中使用“ *”字符作为通配符。允许安排主题。(如果定义了多个页面,则将使用列表中的第一个主题)允许启用/禁用主题。Drupal新手友好。

您可以使用:部分具有与Page Theme大部分功能相同的部分,但是添加了基于角色的选择和用于选择主题的“ php片段”区域。

但是,如果您要在创建,编辑和查看页面时使用与网站默认主题不同的主题,则可以使用“ 内容主题”,该主题允许在创建,编辑和查看页面时使用 与网站默认主题不同的主题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.