Как динамически добавлять классы в тег 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 здесь и без опыта программирования. Поэтому я был бы очень признателен, если бы вы могли быть как можно более подробными при совместном использовании решения.

Ответы:


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>тег для каждого фрагмента пути.


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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.