我正在寻找一种方法来向一个块添加一个类,但不是一个自定义类,一个来自区域名称或块机器名的类。
例如,对于区域,这是可能的:
{%
set classes = [ 'region-' ~ region|clean_class]
%}
每个div都将该区域的名称(在info.yml文件中定义)作为一个类。我想用块做同样的事情。将区域名称或计算机名称添加为类。我想要一个类的原因是CSS。使用类而不是ID来定位元素是一种更好的做法。
有没有人知道如何以编程方式实现这一目标?谢谢:))
答案 0 :(得分:1)
1)Drupal 8.x上的Twig只能理解变量和变量的基本操作。因此,为了使用自定义变量(例如块区域),您需要通常在预处理函数上传递变量,然后在Twig中使用它们。这是一个例子:
function MYTHEME_preprocess_block(&$variables, $hook) {
$block_id = $variables['elements']['#id'];
$block = \Drupal\block\Entity\Block::load($block_id);
// Add region as variable
$variables['region'] = $block->getRegion();
}
然后在 block.html.twig 文件:
{%
set classes = ['region-'~region|clean_class]
%}
请参阅文档:https://www.drupal.org/docs/8/theming/twig/twig-best-practices-preprocess-functions-and-templates。
2)如果您想要自定义块模板建议(例如,对于某个区域),您可以使用hook_theme_suggestions_alter()更改默认主题建议。
function MYTHEME_theme_suggestions_block_alter(array &$suggestions, array $variables) {
if ($variables['elements']['#configuration']['region']) {
$suggestions[] = 'block__' . $variables['elements']['#configuration']['region'];
}
}
3)请注意,默认情况下您无法使用特定于区域的Drupal block twig templates,因为此功能已在8.x中删除。请参阅相关帖子:https://www.drupal.org/node/2011434。
答案 1 :(得分:0)
最简单的方法是使用诸如block_class
之类的贡献模块。答案 2 :(得分:0)
我也想要这个,在寻找答案的同时遇到了这个问题的SO帖子和OPs Drupal论坛帖子。我认为这可以回答我们的要求,因此我认为我可以将其链接到后代。
在Drupal forum comments中,使用杰夫·伯恩兹(Jeff Burnz)的以下代码段在您的整体树枝模板中:
{%
set classes = [
'block',
'block-' ~ attributes.id,
'block-' ~ plugin_id|clean_class,
label ? 'block-label-' ~ label|clean_class,
]
%}
<div{{ attributes.addClass(classes) }}>
这为您提供了一些用于类的选项,attributes.id
是我想要的选项,如果仅使用它就可以输出
<div id="blockID" class="block-blockId"...
我讨厌通过id进行样式设置,因此会将其添加到我从现在开始从事的所有子主题中。希望这可以帮助。