Відповіді:
Функції попередньої обробки можуть бути реалізовані з модулів та тем.
Функція попередньої обробки, яка вам потрібна, - 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 не опускаються при оновленні вашої теми.
У той час як ви можете зробити це за допомогою ho_preprocess_html, досить часто ви опинитесь у зовсім іншій частині вашої кодової бази, коли вам це знадобиться. Якщо це так, то я б запропонував використовувати ctools_class_add
замість цього:
ctools_class_add(array('class1', 'class2', 'class3'));
Ви можете зателефонувати на цю тему з будь-якого місця, поки гак_препро_цес_html ще не запущений і класи будуть додані.
Припустимо, що ви використовуєте модуль 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);
}
}
Це можна зробити через 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()
.