Як змінити тему на основі URL-адреси?


38

У мене на сайті example.org працює екземпляр Drupal. У якому встановлена ​​та активована тема 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/… . У вас буде легша умова "для"
серпня 1717 року

22

Користувацьке рішення, як і інші коментарі, пропонує, мабуть, найкраще, але якщо ви дійсно хочете використовувати модуль, найкраща ставка - ThemeKey . Станом на 23.05.11 він має стабільний випуск.


8

Крім того, ви можете використовувати нову theme callbackопцію системи меню, hook_menu_alter()як описано нижче. ps Checkout kuka_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

Ви можете просто використовувати Context і використовувати тему, щоб застосувати її, коли шлях / event2011 /, ви можете просто встановити шлях в умовах котексту та змінити тему в дії вмісту. Це ви можете дуже легко переходити між темами на сайті за URL-адресою. Навіть працює на мобільні;)


Дія теми передає власні змінні темі, вона насправді не змінює її
Алекс Вебер

6

Використовувати ThemeKey - це простий, і це найпопулярніший і найпотужніший модуль на даний момент (з підтримкою 8.x) для правил перемикання тем, які дозволяють автоматичний вибір теми залежно від поточного шляху, термінів таксономії, мови, типу вузла та багатьох інших, багато інших властивостей. Він також може бути легко розширений для підтримки додаткових властивостей, що піддаються іншим модулям. Окрім стандартних функцій, ThemeKey автоматично розширює свої функції у багатьох модулях внесків і має модулі, що розширюють її.

Використання (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), який додає блок, що дозволяє користувачам перемикатися між включеними темами.


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)return повертається 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

Ви можете використовувати модуль « Тема сторінки», щоб досягти саме цього

Модуль «Тема сторінки» - це простий і простий модуль, який дозволяє використовувати різні теми, ніж сайт за замовчуванням на певних сторінках.

Особливості

  • Призначте тему до однієї сторінки чи списку сторінок. (Встановити сторінку як шлях для Drupal)
  • Дозволити використовувати символ "*" в якості підстановки для друпальських шляхів.
  • Дозволити впорядкувати теми. (Якщо сторінок визначено декілька, буде використана перша тема у списку)
  • Дозволити вмикати / вимикати тему.
  • Друпал-початківець.

0

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

Особливості:

Призначте тему до однієї сторінки чи списку сторінок. (Встановіть сторінку як шлях для Drupal) Дозвольте використовувати символ "*" в якості підстановки в Drupal-контурах. Дозволити впорядкувати теми. (Якщо сторінок визначено декілька, буде використана перша тема у списку) Дозволити, щоб увімкнути / вимкнути тему. Друпал-початківець.

як будете використовувати: Розділи, які мають більшість тих же функцій, що і Тема сторінки, але додають вибір на основі ролі та область "фрагмент PHP" для вибору теми.

але якщо ви хочете використовувати різні теми, ніж сайт за замовчуванням для створення вмісту, редагування та перегляду сторінок, ви можете використовувати Content Theme, яка дозволяє використовувати різні теми, ніж сайт за замовчуванням для створення вмісту, редагування та перегляду сторінок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.