如何按树枝所在的区域命名树枝文件?

时间:2019-04-18 08:59:44

标签: html drupal twig drupal-commerce

我正在将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中的块和内容区域中的块。但是两个购物车都使用相同的模板获得输出。

1 个答案:

答案 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