由于Drupal 8,使用模板命名约定无法根据其放置的区域加载特定的块模板(“删除了每个区域的块标记和每个区域的块模板功能”)。但是如果放置在某个区域中,我需要使用不同的html块。我该如何完成?
我曾考虑过使用MYMODULE_theme_suggestions_block_alter,但我不知道如何获取当前区域。
由于Drupal 8,使用模板命名约定无法根据其放置的区域加载特定的块模板(“删除了每个区域的块标记和每个区域的块模板功能”)。但是如果放置在某个区域中,我需要使用不同的html块。我该如何完成?
我曾考虑过使用MYMODULE_theme_suggestions_block_alter,但我不知道如何获取当前区域。
Answers:
如果您获得块实体,则可以获取区域。
.module或.theme文件
use Drupal\block\Entity\Block;
function MODULE_theme_suggestions_block_alter(array &$suggestions, array $variables) {
if (!empty($variables['elements']['#id'])) {
$block = Block::load($variables['elements']['#id']);
$suggestions[] = 'block__' . $block->getRegion() . '__' . $variables['elements']['#id'];
}
/* Use this 'else if' only if you are using page_manager module and want to know which region is the block */
else if (isset($variables['elements']['#configuration']['region'])) {
$suggestions[] = 'block__page_' . $variables['elements']['#configuration']['region'] . '__' . end(explode(':', $variables['elements']['#plugin_id']));
}
return $suggestions;
}
编辑1:封面page_manager模块的情况。
isset()
不是必需的,因为如果没有an #id
,那么它将传递NULL
给::load
函数,然后返回即可NULL
。最后,$block
是NULL
,什么也不会发生。在我的开发环境Drupal 8.0.4-page_manager-1.0-alpha23中进行了测试(以前从未使用过此模块)。