html - 如何按它们所在的区域命名树枝文件?
问题描述
我正在使用 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 中的块和内容区域中的块。但是两个推车都使用相同的模板获得输出。
解决方案
为了将块与显示器分离,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。
推荐阅读
- firebase - 在颤动的火力基础上更改密码
- python - 在 Django views.py 中总结 2 个值
- python-3.x - DynamoDB table.get_item() 被执行两次
- d3.js - 如何在 d3 sankey 中为节点文本和总数添加背景颜色
- sql - 如何在 SQL 中以列值作为列标题进行转置?
- angular - Angular 8路由,在斜线之前无法导航到没有名称的组件
- javascript - TypeError:“尝试获取资源时出现网络错误。” 当试图在 javascript 中获取 API 时
- python - Python:将列表列表转换为分层字典
- excel - 一阶和二阶 Power Query 刷新
- postgresql - 将 hstore 集成到 timescaleDB 以存储时间序列