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之后开始写,不能多写层级。 - 执行缓存清理命令:
Shopware会缓存模板路径,修改文件结构后必须执行清理。bin/console cache:clear bin/console theme:compile
二、解决含Twig块的模板引入报错问题
{% sw_include %}本质是Twig的include,而block是模板继承语法,直接用sw_include引入带block的模板会导致语法冲突,推荐用以下两种方案:
方案1:用Twig宏(Macro)实现参数化复用
- 创建宏文件(示例路径:
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 %}
- 在目标模板中导入并调用宏:
{# 导入宏文件 #} {% 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
相关产品推荐
相关产品推荐

