Як я можу програмно додати клас до тегу HTML "body"?


13

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

Як я можу це зробити програмно зі свого спеціального модуля?

Відповіді:


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 не опускаються при оновленні вашої теми.


Так, я зазвичай торкаюсь назви модуля через prepcess_html у кожному модулі, щоб тема JS за бажанням мала можливість виявити.
mpdonadio

9

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

function MODULENAME_preprocess_html(&$vars) {
  $vars['classes_array'][] = 'custom-class';
}

4

У той час як ви можете зробити це за допомогою ho_preprocess_html, досить часто ви опинитесь у зовсім іншій частині вашої кодової бази, коли вам це знадобиться. Якщо це так, то я б запропонував використовувати ctools_class_addзамість цього:

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

Ви можете зателефонувати на цю тему з будь-якого місця, поки гак_препро_цес_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().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.