Добавление класса в «тело»

#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» :

Опция 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