我正在使用Twig创建一些模板并遇到问题。 我试图加载一个在网上商店中多次使用的html。所以我的想法是创建一个可重用的代码片段,我可以在需要时每次加载。
我面临的问题是,当我执行for循环然后包含那段代码时,我得到一个空的回报。换句话说,我的代码无法识别for循环中每个产品需要加载的数据。它返回空信息框。
澄清:
我有一个主模板index.html,它调用一个代码片段来包含一些产品(不要看雨延!):
{% if featured %}
{% include 'snippets/products.rain' with {'products': featured, 'type': 'grid'} %}
{% endif %}
我的products.rain代码段如下:
{% if type %}
{% if type == 'grid' %}
{% for product in products %} {# Products in this case = feautured products #}
<li class="item clearfix">.... etc etc .... </li>
{% endfor %}
{% elseif type == 'other-layout' %}
<div class="item">.... etc etc .... </div>
{% endif %}
{% endif %}
在for循环中,html的95%与每个for循环的95%相同。我想将该代码放在可以包含在for循环中的block
中。
所以我做的是:
{% set product_html %}
.... a lot of html ....
<a href="{{ product.url | url }}" title="{{ product.fulltitle }}">
<img src="{{ product.image }}" width="100" height="100" alt="{{ product.fulltitle }}"/>
</a>
{% endset %}
然后包含在for循环中,如下所示:
{% if type %}
{% if type == 'grid' %}
{% for product in products %} {# Products in this case = feautured products #}
<li class="item clearfix">{{ product_html | raw }}</li>
{% endfor %}
{% elseif type == 'other-layout' %}
<div class="item">{{ product_html | raw }}</div>
{% endif %}
{% endif %}
然而,这会返回设置的html,但是空product.image
和空product.fulltitle
。
我尝试使用set block
,但结果相同。
我做错了什么...... ??
答案 0 :(得分:3)
当您使用{% set %}
时,变量中的内容不是动态的,它只会使用当前上下文中的数据see it live。
您可以通过两种方式实现目标:使用include或使用macros。
由于您的产品代码很小而在其他地方没有重复使用,我建议您使用宏:
{% macro product_html(product) %}
Current product is: {{ product }}
{% endmacro %}
{% import _self as macros %}
{% for product in products %}
{{ macros.product_html(product) }}
{% endfor %}