Twig设置了可重用的html片段

时间:2017-02-16 13:42:29

标签: html twig

我正在使用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,但结果相同。

我做错了什么...... ??

1 个答案:

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

See it live