Ответы:
Функции предварительной обработки могут быть реализованы из модулей и тем.
Необходимая функция предварительной обработки - 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 не теряются при обновлении вашей темы.
Хотя вы можете сделать это с помощью hook_preprocess_html, довольно часто вы окажетесь в совершенно другой части вашей кодовой базы, когда вам это понадобится. Если это так, то я бы предложил использовать ctools_class_add
вместо этого:
ctools_class_add(array('class1', 'class2', 'class3'));
Вы можете вызывать это из любого места, пока hook_preprocess_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()
.