2017-02-16 10 views
0

私はTwigでいくつかのテンプレートを作成していますが、問題があります。 私はwebshopを使って何度も使用されているHTMLを読み込もうとしています。だから私の考えは、必要なときにいつでもロードできる再利用可能なコードを作成することです。twigが再利用可能なHTML部分セット

私が直面している問題は、forループを実行してそのコードを組み込むと、空の戻り値が得られるということです。言い換えれば、私のコードは、forループ内の各製品にロードする必要があるデータを認識しません。空の情報ボックスを返します。

は明確にする:

は、私はいくつかの製品が含まれるようにスニペットを呼び出すメインテンプレートのindex.htmlを持っている(雨の拡張子を見ていない!):

{% if featured %} 

{% include 'snippets/products.rain' with {'products': featured, 'type': 'grid'} %} 

{% endif %} 

マイproducts.rainをスニペットは次のようになります。

forループには、forループごとに同じ95%のhtmlがあります。 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のデータのみを使用します。

includeを使用するか、macrosを使用するという2つの方法で目標を達成できます。

製品のコードのあなたの作品はどこか他の再利用、小型ではないので、私はあなたがマクロを使用することをお勧め: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

興味深いアプローチ。決してそのことを考えなかった。 'マクロ'はインクルードに対して何らかの性能上のメリットを持っていますか?それとも、毎回そのHTMLをレンダリングするほうがいいでしょうか?それとも、あなたが使っているものは実際に問題ではありませんか?私はまだ枝を学んでいて、あまり参考にしていません。クリーンなコードと最高/最速のパフォーマンスが必要なので、私はこの質問をしました:) – Meules

関連する問題