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

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

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

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

36 голосов | спросил Samyak Bhuta 15 MarpmTue, 15 Mar 2011 17:22:20 +03002011-03-15T17:22:20+03:0005 2011, 17:22:20

9 ответов


32

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

Достаточно реализовать hook_custom_theme () следующим образом:

function mymodule_custom_theme () {
  if (arg (0) == 'event2011') {
    вернуть «тему, используемую для этой страницы»;
  }
}

Если вам нужно будет изменить тему только для http://example.com/event2011 , но не для http://example.com/event2011/node/123 , тогда код должен изменить на

function mymodule_custom_theme () {
  if (arg (0) == 'event2011' &! arg (1)) {
    вернуть «тему, используемую для этой страницы»;
  }
}

Что касается использования обратных вызовов темы в определении обратного вызова меню, в документации говорится:

  

Как правило, использование функций обратного вызова темы должно быть ограничено страницами, функциональность которых очень тесно связана с определенной темой, поскольку их можно переопределить только модулями, которые специально предназначены для этих страниц в hook_menu_alter (). Модули, реализующие более универсальные функции переключения тем (например, модуль, который позволяет динамически настраивать тему на основе текущей роли пользователя), должны использовать hook_custom_theme ().

ответил kiamlaluno 15 MarpmTue, 15 Mar 2011 17:55:26 +03002011-03-15T17:55:26+03:0005 2011, 17:55:26
22

Таможенное решение, как и другие комментарии, вероятно, лучше всего, но если вы действительно хотите использовать модуль, ваш лучший выбор - ThemeKey . По состоянию на 5/23/11 он имеет стабильный выпуск.

ответил tim.plunkett 15 MarpmTue, 15 Mar 2011 18:29:54 +03002011-03-15T18:29:54+03:0006 2011, 18:29:54
8

В качестве альтернативы вы можете использовать новую функцию для системы меню hook_menu_alter (), как описано ниже. ps Checkout hook_menu () для получения более подробной информации в обратном вызове

& л;? PHP
/**
* Реализует hook_menu_alter ().
* /
function mymodule_menu_alter (& $ items) {
  //Устанавливаем функцию обратного вызова темы для всех страниц узла. В соответствии с
  //стандартное поведение для свойств hook_menu (), это будет
  //унаследовано всеми путями под узлом /% node, кроме
  //они определяют свой собственный обратный вызов.
  $ items ['node /% node'] ['call call'] = 'mymodule_default_node_theme';

  //Устанавливаем другой обратный вызов темы для страниц редактирования узла и передаем
  //вдоль объекта узла к этой функции, чтобы мы могли принимать решения
  //на основе этого.
  $ items ['node /% node /edit'] ['call call'] = 'mymodule_edit_node_theme';
  $ items ['node /% node /edit'] ['theme arguments'] = array (1);
}
/**
* По умолчанию используется тема some_theme для страниц узлов.
* /
function mymodule_default_node_theme () {
  return 'some_theme';
}

/**
* Для редактирования узлов страницы используется тема some_other_theme.
* /
function mymodule_edit_node_theme ($ node) {
  return $ node-> type == 'page'? 'some_other_theme': mymodule_default_node_theme ();
}
? >

Кроме того, есть пример использования более традиционного hook_custom_theme ()

& л;? PHP
/**
* Реализует hook_custom_theme ().
* /
function mymodule_custom_theme () {
  //проверяем путь с помощью arg (0)
  //check $ user
  //делаем любую специальную проверку, которую вы хотите, и просто возвращаете ключ темы (название папки с темой большую часть времени)
    return 'special_theme';
  }
}
? >

Снято с: http://drupal.org/node/224333#custom_theme

ответил electblake 15 MarpmTue, 15 Mar 2011 18:40:45 +03002011-03-15T18:40:45+03:0006 2011, 18:40:45
5

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

ответил Amitav Roy 5 Maypm11 2011, 15:11:37
5

Использование 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 29 +03002014-10-29T13:48:53+03:00312014bEurope/MoscowWed, 29 Oct 2014 13:48:53 +0300 2014, 13:48:53
5

При использовании псевдонимов URL или Pathauto module , помните о тонкостях и различиях при использовании компонентов текущего пути Drupal.

Бывают ситуации, когда вы не можете использовать Arg () . Фактически, документация API Drupal на самом деле предлагает избегать использования этой функции, где это возможно, поскольку результирующий код трудно читать.

Рассмотрим следующий пример, предложенный 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));

массив
(
    [0] => узел
    [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 24 FebruaryEurope/MoscowbTue, 24 Feb 2015 01:19:38 +0300000000amTue, 24 Feb 2015 01:19:38 +030015 2015, 01:19:38
3

Как переключить тему в зависимости от роли пользователя:

Создайте собственный модуль и скопируйте & вставьте следующее:

& л;? PHP
/**
 * Выполнение hook_init ().
 * /
function mymodule_init () {
  глобальный $ custom_theme, $ user;
  if (in_array ('моя специальная роль', $ user-> ролей)) {
    $ custom_theme = 'mytheme';
  }
}
? >

Вы должны заменить:

mymodule => с именем вашего модуля

моя особая роль => с именем роли, которую ваши пользователи должны будут иметь, чтобы они могли видеть другую тему.

mytheme => с названием темы, которую вы хотите переключить на

ответил drupalfever 22 J0000006Europe/Moscow 2011, 01:37:38
1

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

  

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

     

Функции

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

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

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

Назначьте тему одной странице или списку страниц. (Задайте страницу как путь Drupal) Разрешить использовать символ «*» в качестве шаблона в дорожках Drupal. Позвольте упорядочить темы. (Если страницы определены несколько, будет использована первая тема в списке) Разрешить включение /выключение темы. Друпал приветствуется новичком.

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

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

ответил onlink 16 Jpm1000000pmMon, 16 Jan 2017 19:49:20 +030017 2017, 19:49:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132