You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopware 6添加可复用Twig模板遇加载及块语法问题求助

解决Shopware 6 Twig复用模板的问题

一、修复模板找不到的问题

  • 严格遵循Shopware模板路径规范:
    扩展内的模板必须放在src/Resources/views/storefront/目录下,比如你的复用模板路径应为src/Resources/views/storefront/page/product-detail/page_product_detail_my_block.html.twig;使用@MyPlugin引用时,路径从storefront之后开始写,不能多写层级。
  • 执行缓存清理命令:
    bin/console cache:clear
    bin/console theme:compile
    
    Shopware会缓存模板路径,修改文件结构后必须执行清理。

二、解决含Twig块的模板引入报错问题

{% sw_include %}本质是Twig的include,而block是模板继承语法,直接用sw_include引入带block的模板会导致语法冲突,推荐用以下两种方案:

方案1:用Twig宏(Macro)实现参数化复用

  1. 创建宏文件(示例路径:src/Resources/views/storefront/page/product-detail/my_reusable_macro.html.twig):
{% macro myReusableBlock(param1, param2) %}
    <!-- 这里写复用内容,直接使用传入的参数 -->
    <div class="my-custom-block">
        <p>{{ param1 }}</p>
        <span>{{ param2 }}</span>
    </div>
{% endmacro %}
  1. 在目标模板中导入并调用宏:
{# 导入宏文件 #}
{% import '@MyPlugin/storefront/page/product-detail/my_reusable_macro.html.twig' as myMacros %}

{# 多次调用,传入不同参数 #}
{{ myMacros.myReusableBlock('参数1内容', '参数2内容') }}
{{ myMacros.myReusableBlock('新参数1', '新参数2') }}

方案2:用模板嵌入(embed)实现带块的复用

如果必须保留block逻辑(比如需要继承基础模板内容),可以用embed替代include:

{# 在目标模板中嵌入带块的模板 #}
{% embed '@MyPlugin/storefront/page/product-detail/page_product_detail_my_block.html.twig' %}
    {% block myCustomBlock %}
        {{ parent() }} {# 保留原块内容 #}
        <p>额外内容:{{ customParam }}</p> {# 传入自定义参数 #}
    {% endblock %}
{% endembed %}

注意:被嵌入的模板需要是完整的可继承模板(比如继承@Storefront/storefront/base.html.twig),或至少包含你要使用的块定义。

三、额外检查项

  • 确保模板文件名和引用时的大小写一致(Linux环境下Shopware区分大小写)
  • 检查扩展的composer.json,确认autoload和extra字段配置正确,保证Shopware能识别到扩展模板

内容的提问来源于stack exchange,提问作者Maxim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:22:39