2017-02-16 7 views
0

Я создаю несколько шаблонов с Twig и имею проблему. Я пытаюсь загрузить часть html, которая используется несколько раз в Интернете. Поэтому моя идея - создать многократно используемый фрагмент кода, который я могу загружать каждый раз, когда это необходимо.Twig set многоразовая часть 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 %} 

в течение цикла есть HTML, что это на 95% такой же, как в каждом цикл. Я хочу разместить этот код внутри block, который может быть включен в циклы for.

Так что я сделал:

{% 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 %} 

И затем включен в цикл, например, так:

{% 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, но имеет тот же результат.

Есть ли что-нибудь, что я делаю неправильно .... ??

ответ

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