Как программно добавить класс в HTML-тег «body»?

13

Я хотел бы добавить собственный класс CSS к <body>тегу. Я использую Drupal 7 / Corolla.

Как я могу сделать это программно из моего пользовательского модуля?

giorgio79
источник

Ответы:

13

Функции предварительной обработки могут быть реализованы из модулей и тем.

Необходимая функция предварительной обработки - hook_preprocess_html()это переменная, которую нужно установить $variables['classes_array'], - это массив, содержащий все классы, установленные для <body>элемента. Содержимое файла html.tpl.php, который по умолчанию используется Drupal (если тема не использует другой файл шаблона), является следующим:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
  "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language; ?>" version="XHTML+RDFa 1.0" dir="<?php print $language->dir; ?>"<?php print $rdf_namespaces; ?>>

<head profile="<?php print $grddl_profile; ?>">
  <?php print $head; ?>
  <title><?php print $head_title; ?></title>
  <?php print $styles; ?>
  <?php print $scripts; ?>
</head>
<body class="<?php print $classes; ?>" <?php print $attributes;?>>
  <div id="skip-link">
    <a href="#main-content" class="element-invisible element-focusable"><?php print t('Skip to main content'); ?></a>
  </div>
  <?php print $page_top; ?>
  <?php print $page; ?>
  <?php print $page_bottom; ?>
</body>
</html>

В вашем модуле вы просто реализуете функцию предварительной обработки следующим образом:

function mymodule_preprocess_html(&$variables) {
  $variables['classes_array'][] = "new-class";
}

Затем template_process () использует $variables['classes_array']для заполнения $variables['classes']следующий код:

$variables['classes'] = implode(' ', $variables['classes_array']);

 

Использование функции препроцессора в модуле предпочтительнее, если на вашем сайте используется более одной темы, или если набор тем для вашего сайта не тот, который вы создали. В этом случае вы можете установить свои собственные классы CSS и не потерять их при обновлении темы или просто при смене темы по умолчанию, используемой на вашем сайте. Если ваш сайт использует только тему, и эта тема является созданной вами пользовательской темой, вы можете реализовать функцию предварительной обработки в своей пользовательской теме. Когда вы поддерживаете тему, классы CSS не теряются при обновлении вашей темы.

киамлалуно
источник
Да, я обычно добавляю имя модуля через preprocess_html в каждом модуле, чтобы тема JS могла обнаруживать ее при желании.
mpdonadio
9

добавить в MODULENAME.module и очистить кеш

function MODULENAME_preprocess_html(&$vars) {
  $vars['classes_array'][] = 'custom-class';
}
xandeadx
источник
4

Хотя вы можете сделать это с помощью hook_preprocess_html, довольно часто вы окажетесь в совершенно другой части вашей кодовой базы, когда вам это понадобится. Если это так, то я бы предложил использовать ctools_class_addвместо этого:

ctools_class_add(array('class1', 'class2', 'class3'));

Вы можете вызывать это из любого места, пока hook_preprocess_html еще не запущен и классы будут добавлены.

Злой Дан
источник
1

Предполагая, что вы используете модуль pathauto для автоматического создания семантических путей для ваших контентных страниц на основе пути меню, вы можете использовать путь страницы для создания классов, которые вы ищете:

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);
  } 
}
Икбал
источник
1

Вы можете сделать это через template_preprocess_html(). Вы можете поместить это в вашу папку template.php, где ваша тема / базовая тема будет наиболее подходящей (например, папка препроцесса Omega ), или в пользовательский модуль, в зависимости от того, что наиболее подходит.

function mytheme_preprocess_html(&$variables) {
  $variables['classes_array'][] = "class1";
  $variables['classes_array'][] = "class2";
  $variables['classes_array'][] = "class3";
}

Несмотря на имена в справочнике API, то theme_preprocessи theme_processфункции могут быть вызваны из модулей, а не только тем. Все, что вам нужно сделать, это назвать хук в соответствии с вашим модулем, например mymodule_preprocess_html().

mpdonadio
источник