#drupal #drupal-7 #drupal-theming
#drupal #drupal-7 #drupal-тематизация
Вопрос:
Как я могу изменить или предварительно обработать <body>
тег, чтобы добавить тело класса? Я не хочу создавать целое html.tpl.php просто для того, чтобы добавить класс.
Ответ №1:
В template.php
файле вашей темы используйте preprocess_html
хук:
function mytheme_preprocess_html(amp;$vars) {
$vars['classes_array'][] = 'new-class';
}
Не забудьте очистить кеши после того, как вы внедрили перехват, иначе Drupal его не обнаружит.
Комментарии:
1. Как он узнает, что нужно добавить в тело?
2. Есть только один элемент, в
html.tpl.php
который добавлены какие-либо классы, который является<body>
элементом; функция предварительной обработки выше предназначена для этого файла, поэтому любые добавленные вами классы будут добавлены только к<body>
элементу.3. Кстати, если вы еще не получили его, установите модуль Devel и используйте
dpm
функцию для любой переменной в вашем коде; это отобразит хорошее представление классов и массивов, которые помещаются в обычное сообщение area…it это абсолютно необходимо для отладки. Вы могли бы использовать его в приведенной выше функции, например, так:dpm($vars);
и он выведет массив на экран, чтобы вы могли его проверить4. Я пробовал это (очистил кеш, проверил орфографию и т. Д.), И это не сработало. Есть ли случай, когда на него влияет другой модуль? Кстати, я использую контекст и тему omega.
5. @nikan Возможно, уже немного поздно, но для Omega вы хотите реализовать
mytheme_alpha_preprocess_html
и добавить класс в$vars['attributes_array']['class']
массив
Ответ №2:
Документация для html.tpl.php шаблон документирует $classes
переменные как строку классов, которые можно использовать для контекстного оформления с помощью CSS. Если вы посмотрите на код шаблона, эта переменная используется в атрибутах класса созданного элемента body:
<body class="<?php print $classes; ?>" <?php print $attributes;?>>
$classes
Переменные фактически уже установлены template_process()
для любого файла шаблона и строятся на основе содержимого $classes_array
переменной.
Итак, чтобы добавить класс в тело вашей страницы, вы должны добавить этот класс к $classes_array
значению из реализации вашей темы (или модуля) hook_preprocess_html()
:
function THEME_preprocess_html(amp;$variables) {
$variables['classes_array'][] = 'new-class';
}
Поскольку это основной шаблон и функция процесса, любая хорошо работающая тема должна повторно использовать те же переменные.
Ответ №3:
Мне пришлось использовать разные ключи массива в одном и том же хуке, чтобы заставить его работать:
function THEME_preprocess_html(amp;$vars) {
$vars['attributes_array']['class'][] = 'foo2';
}
Ответ №4:
Модуль Context также позволяет добавлять класс в тег body.
Это может быть полезно, если вам нужно, чтобы класс добавлялся при определенных условиях.
Вы найдете эти параметры в реакции «Тема HTML» :
Ответ №5:
Ответ, по-видимому, зависит от контекста. Вот что я нашел методом проб и ошибок:
Если ваш hook_preprocess_html() находится в модуле, используйте $vars[‘classes_array’][] .
Если это в теме, используйте $vars[‘attributes_array’][‘class’][] .
Комментарии:
1. Не совсем —
attributes_array
определяется конкретно темой Omega. Для «обычных» тем это будетclasses_array
Ответ №6:
Модуль общего класса тела позволяет пользователям добавлять классы на любую страницу через интерфейс. В интерфейсе есть опции для выбора нескольких ролей пользователей, а также страниц, на которых может отображаться класс.
Ответ №7:
Я применил эту технику на сайте, который создал кто-то другой. Сначала это не сработало, но затем копнул глубже и обнаружил, что переменная $classes не выводится в файле tpl. Так что, если это не работает, проверьте это.
Ответ №8:
Для установки Drupal 7 http://drupal.org/project/body_class . Это поможет вам добавить отдельные классы для каждого узла в теге body
Ответ №9:
Вы можете проверить «https://www.drupal.org/project/page_specific_class » чтобы добавить класс в тег тела любой страницы
Комментарии:
1. иногда лучше написать свой ответ (из любого места) вместо внешних ссылок.
Ответ №10:
Это простой способ добавить класс на основе URL, Drupal 9. Нет необходимости включать модули.
/**
* Implements hook_preprocess_html().
*/
function THEME_NAME_preprocess_html(amp;$variables) {
// Get the current path
$current_path = Drupal::service('path.current')->getPath();
$internal_path = Drupal::service('path_alias.manager')->getAliasByPath($current_path);
// Assign it to body class
$variables['attributes']['class'][] = str_replace("/", "", $internal_path);
}
См.: http://www.thirstysix.com/how-can-i-add-body-class-based-path-page-specific-class-drupal-9