我正在将Drupal与Commerce Module一起使用来构建网店。我正在使用Commerce Cart Block在导航栏中显示带有购物车中物品数量的购物车图标。
现在,我也想在“购物车”页面上显示“购物车块”,但是模板与导航栏中使用的模板不同。
我正在使用调试模式,该模式使我看到可以使用的文件名,就像我想要的那样。但是在两个购物车块上方,它说的是相同的文件名,因此我无法输出两个不同的模板。我尝试将primary_menu(导航购物车块和内容)(购物车块将位于的区域)放在前面,但是它们不起作用。
<!-- THEME DEBUG -->
<!-- THEME HOOK: 'commerce_cart_block' -->
<!-- BEGIN OUTPUT from 'themes/custom/verdamigo/templates/commerce-cart-block.html.twig' -->
这显示在两个购物车块上方(在同一页面上)。因此,如何为两个块使用两个不同的模板。
primary_menu--commerce-cart-block.html.twig
不起作用。
我希望能够同时编辑primary_menu中的块和内容区域中的块。但是两个购物车都使用相同的模板获得输出。
答案 0 :(得分:1)
为了使图块与显示器脱钩,Drupal 8渲染了一个图块,而与它所在的显示器以及该显示器在哪个区域/重量中无关(请参见Doc):
特定于区域的块模板在Drupal 8中不可用。
这消除了按区域覆盖 block.tpl.php 的功能,并且使hook_preprocess_block()
不能基于该位置调整变量。相反,核心开发人员建议使用CSS或使用其他块来管理块模板替代。
但是您仍然可以通过实现Twig Template naming conventions解决此问题:
function SOME_theme_suggestions_block_alter(array &$suggestions, array $variables) {
if (!empty($variables['elements']['#id'])) {
$block_id = $variables['elements']['#id'];
$block = Drupal\block\Entity\Block::load(block_id);
$region = $block->getRegion();
// Allow per-region block templating.
$suggestions[] = 'block__' . $region . '__' . $block_id;
}
return $suggestions;
}
注意:模板名称应以“ block ”开头,因为您覆盖了一个阻止模板,因此在您的情况下,覆盖文件应命名为 block--primary_menu--commerce-cart -block.html.twig 。