Как мне изменить тему на основе URL?

38

У меня есть экземпляр Drupal, работающий на example.org. У которого тема X установлена ​​и активирована. Теперь в течение ограниченного периода времени на сайте предполагается проведение мероприятия, для которого был выделен специальный раздел. Все, что связано с этим событием, пойдет по адресу example.org/event2011.

Я хочу, чтобы при просмотре страницы в этом разделе отображалась другая тема (например, http://example.org/event2011/about , http://example.org/event2011/node/123 ). Как я могу это сделать?

Я прошел через множество модулей, но ни один из них не поддерживает Drupal 7. Предпочтительно, я бы хотел, чтобы это делалось с использованием модулей, и не хочу ничего менять сам на уровне кода.

Самьяк Бхута
источник
1
Вы хотите иметь отдельный сайт по пути / event2011 / node / 123?
Джереми Френч

Ответы:

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 . По состоянию на 23.05.11 он имеет стабильную версию.

tim.plunkett
источник
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

electblake
источник
6

Вы можете просто использовать Context и использовать тему для применения, когда путь / event2011 / вы можете просто установить путь в условии cotext и изменить тему в действии содержимого. Это было очень легко переключаться между темами на сайте по URL. Даже работает для мобильных телефонов;)

Амитав Рой
источник
действие темы передает пользовательские переменные теме, фактически не изменяя ее
Алекс Вебер
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 Example, чтобы продемонстрировать разработчикам, как расширить ThemeKey.

Помощь (7.x)

Посмотрите видеоурок от Mustardseed (7.x).

Дополнительную помощь по этой теме можно найти на /admin/help/themekey .

Также проверьте другие вопросы SE, связанные с .


В качестве альтернативы есть также Switchtheme (7.x), который добавляет блок, позволяющий пользователям переключаться между включенными темами.

kenorb
источник
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';
  }
}
rjb
источник
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 => с названием темы, на которую вы хотите переключиться

drupalfever
источник
1

Вы можете использовать модуль Page Theme для достижения именно этого

Модуль Page Theme - это простой и легкий в использовании модуль, который позволяет использовать темы, отличные от заданных по умолчанию на определенных страницах сайта.

особенности

  • Назначьте тему одной странице или списку страниц. (Установить страницу как путь Drupal)
  • Разрешить использовать символ '*' в качестве символа подстановки в путях Drupal.
  • Разрешить расставлять темы. (Если определено несколько страниц, будет использоваться первая тема в списке)
  • Разрешить включить / отключить тему.
  • Drupal начинающий дружелюбный.
IT Pro Manager
источник
0

Вы можете использовать модуль Page Theme, чтобы добиться именно этого: Модуль Page Theme - это простой и легкий в использовании модуль, который позволяет использовать темы, отличные от заданных по умолчанию на определенных страницах сайта.

Особенности :

Назначьте тему одной странице или списку страниц. (Установите страницу как путь Drupal) Разрешить использовать символ '*' в качестве подстановочного знака в путях Drupal. Разрешить оформить темы. (Если определено несколько страниц, будет использоваться первая тема в списке.) Разрешить включение / отключение темы. Drupal начинающий дружелюбный.

так, как вы можете использовать: Разделы, которые имеют почти те же функции, что и тема страницы, но добавляют выбор на основе ролей и область «php snippet» для выбора темы.

но если вы хотите использовать темы, отличные от тех, которые используются сайтом по умолчанию при создании, редактировании и просмотре контента страниц, вы можете использовать тему контента, которая позволяет использовать темы, отличные от тем, которые используются сайтом по умолчанию при создании, редактировании и просмотре контента страниц.

Onlink
источник