如何修改或预处理<body>
标记以添加类主体?我不想创建一个完整的html.tpl.php来添加一个类。
答案 0 :(得分:51)
在主题的template.php
文件中,使用preprocess_html
挂钩:
function mytheme_preprocess_html(&$vars) {
$vars['classes_array'][] = 'new-class';
}
一旦你实现了钩子,请记得清除缓存,否则Drupal就不会把它拿起来。
答案 1 :(得分:8)
The documentation for the html.tpl.php template将$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(&$variables) {
$variables['classes_array'][] = 'new-class';
}
由于这是核心定义的模板和流程函数,任何行为良好的主题都应该重用相同的变量。
答案 2 :(得分:3)
我必须在同一个钩子中使用不同的数组键才能使它工作:
function THEME_preprocess_html(&$vars) {
$vars['attributes_array']['class'][] = 'foo2';
}
答案 3 :(得分:2)
答案 4 :(得分:1)
答案似乎取决于背景。这是我通过反复试验找到的:
如果您的hook_preprocess_html()位于模块中,请使用$ vars ['classes_array'] []。
如果是主题,请使用$ vars ['attributes_array'] ['class'] []。
答案 5 :(得分:1)
Common Body Class模块为用户提供了通过接口向任何页面添加类的功能。 界面具有选择多个用户角色的选项以及可以渲染类的页面。
答案 6 :(得分:0)
我在其他人建立的网站上应用了此技术。它最初没有工作,但后来挖得更深,发现$ classes变量没有在tpl文件中输出。所以,如果它不起作用,请检查。
答案 7 :(得分:0)
对于Drupal 7,安装http://drupal.org/project/body_class。它将帮助您为body标签中的每个节点添加单独的类
答案 8 :(得分:0)
您可以选中“ https://www.drupal.org/project/page_specific_class”以将类添加到任何页面的正文标签中
答案 9 :(得分:0)
这是一种基于 URL 添加类的简单方法,Drupal 9。 无需启用模块。
/**
* Implements hook_preprocess_html().
*/
function THEME_NAME_preprocess_html(&$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