2017-02-16 47 views
0

我用Twig創建了一些模板並且遇到了問題。 我正在嘗試加載一段在整個網上商店中使用過幾次的html。所以我的想法是創建一個可重用的代碼片段,我可以在需要時隨時加載。樹枝設置可重複使用的一段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循環。我想將該代碼放入可包含在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 %} 

然而,這返回一個空product.image和空product.fulltitle但是設置HTML 。我試過set block,但是結果相同。

有什麼我做錯了....?

回答

3

當您使用{% set %}時,變量內的內容不是動態的,它只會使用當前上下文中的數據,即see it live

您可以使用2種方法實現您的目標:使用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

+0

用'macros'有趣的方法。從未想過...... thx! 「宏」對包含有任何性能優勢嗎?或者,每次只呈現該html可能更好?或者它實際上並不重要你使用什麼?我還在學Twig,沒有太多的參考。我問這個問題,因爲我想幹淨的代碼和最好/最快的性能:) – Meules