首页 > 解决方案 > 如何按它们所在的区域命名树枝文件?

问题描述

我正在使用 Drupal 和 Commerce 模块来建立一个网上商店。我正在使用 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 中的块和内容区域中的块。但是两个推车都使用相同的模板获得输出。

标签: htmldrupaltwigdrupal-commerce

解决方案


为了将块与显示器分离,Drupal 8 独立于它所在的显示器以及它在该显示器中的区域/权重来渲染一个块(请参阅Twig 模板命名约定):

Drupal 8 中不提供特定于区域的块模板。

这消除了按区域覆盖block.tpl.phphook_preprocess_block()以及基于它调整变量的能力。相反,核心开发人员建议使用 CSS 或使用额外的块来管理块模板覆盖。

但是您仍然可以通过实施来解决这个问题hook_theme_suggestions_HOOK_alter()

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


推荐阅读