Как динамически добавлять классы в тег BODY в зависимости от пути / глубины страницы?

22

Как динамически добавить классы в тег body, как показано в этом примере ниже?

-Home
-Cities      
--Melbourne       <body class="melbourne">
--- Парки       <body class="melbourne theme_parks">
--- Рестораны       <body class="melbourne restaurants">
--Новой Йорк       <body class="new_york">
--- тематические парки       <body class="new_york theme_parks">
--- Рестораны       <body class="new_york restaurants">
-Контактных нас       <body class="contact_us">

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

kyooriouskoala
источник

Ответы:

37

Чтобы разъяснить ответ Нихила Мохана, вы можете реализовать template_preprocess_html()его в файле template.php своей темы. Прочитайте документацию по Overriding Themable Output, чтобы понять основы происходящего здесь.

В этой функции у вас есть доступ к переменной $vars['classes_array'], которая содержит список классов, которые будут применены к <body>тегу HTML на странице.

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

Предполагая, что вы используете модуль pathauto для автоматического создания семантических путей для ваших контентных страниц на основе пути меню (т. Е. Ваша страница Мельбурнских тематических парков будет иметь путь 'melbourne / theme_parks'), вы можете использовать путь страницы для создания классов, которые вы ищут:

function THEMENAME_preprocess_html(&$vars) {
  $path = drupal_get_path_alias();
  $aliases = explode('/', $path);

  foreach($aliases as $alias) {
    $vars['classes_array'][] = drupal_clean_css_identifier($alias);
  } 
}

Вот и все. Drupal теперь будет смотреть на псевдоним пути текущей страницы и добавлять класс в <body>тег для каждого фрагмента пути.

sheena_d
источник
1
Если пути не работают, то также можно использовать синтаксический анализ menu_get_active_breadcrumb . В этот момент он, скорее всего, находится в staticкеше, поэтому почти нет накладных расходов.
mpdonadio
3
Спасибо всем, особенно @sheena_d за объяснение и за код! Пришлось немного поискать, как заставить его работать на тему Омега, и удалось заставить его работать: D Это линия, чтобы заставить его работать на тему Омега: $vars['attributes_array']['class'][] = drupal_clean_css_identifier($alias);
kyooriouskoala
1

Вы можете использовать template_preprocess_html, какие переменные Preprocess для html.tpl.php

Смотрите также html.tpl.php

Реализация темы по умолчанию для отображения базовой структуры html одной страницы Drupal

niksmac
источник
1

Вот модуль для добавления классов в тег body, основанный на роли или страницах.

Общий класс тела

Тхакур Санджай Сингх Чаухан
источник
0

Создал модуль Body Classes Drupal, чтобы помочь с этим. Не стесняйтесь создавать проблемы, чтобы добавить больше точек интеграции класса тела.

RobLoach
источник