Обработка массива нескольких блоков шаблона ветки

У меня есть странная ситуация, когда мой шаблон ветки создает контент, который помещается в несколько «ящиков», так что количество содержащихся ящиков может варьироваться. Я ищу общий способ определения n блоков в дочернем шаблоне, и родитель отобразит правильный номер. Вот пример того, как сейчас выглядит мой дочерний шаблон:

{% extends "layout.participant.html.twig" %}

{% block box_left_title %}Personal Information{% endblock %}

{% block box_left_content %}
content here
{% endblock %}

Учтите, что может быть один, два или потенциально 5 таких парных разделов заголовок/содержание. Я представляю себе какой-то способ определить box_left_title в качестве первого слота массива, а затем родительский шаблон (layout.participant.html.twig) будет перебирать каждый блок и строить столько «ящиков», сколько необходимо.

Обходной путь, который я сейчас рассматриваю, состоит в том, чтобы определить блоки box_left_content_1, box_left_content_2 и т. д. в родительском шаблоне, а затем определить только те, которые используются в дочернем шаблоне. Хотя это будет работать, это ощущается неправильно.

Я неправильно использую здесь наследование шаблонов? Должен ли я вместо этого изучить условные включения? Указания на это приветствуются.

Обновление: мой вопрос предполагал, что у меня могут быть динамические блоки в родительском шаблоне, но это оказалось невозможно. Я полагаю, что мне нужно будет определить block1, block2 и т. д. в родительском элементе (с учетом разумного верхнего предела), а затем предоставить блоки с содержимым в дочерних элементах. Все это предполагает, что включение не является предпочтительным подходом.


person Duane Gran    schedule 13.04.2012    source источник


Ответы (1)


У вас есть несколько подходов. Самым простым, хотя, вероятно, будет включение.

http://twig.sensiolabs.org/doc/templates.html#включая-другие-шаблоны

Say box — это массив, который выглядит следующим образом: Title', 'content' => 'содержание двух', ), );

Вы бы использовали это в ветке:

{% for box in boxes %}
    {% include "render_box.html" %}
{% endfor %}

Теперь render_box.html будет выполняться внутри этого контекста цикла for, поэтому в этом шаблоне присутствует поле vairable. Ваш render_box.html будет выглядеть так:

<h1>{{ box.title }}</h1>

<p>{{ box.content }}</p>
person Christian Riesen    schedule 13.04.2012
comment
Это сработает, но меня беспокоит то, что часть массива content будет загрузкой html, большая часть которой будет использовать переменные и функции twig. - person Duane Gran; 13.04.2012
comment
Если я правильно вас понял, ваш подход состоит в том, чтобы заполнить код ветки box.content? Это указывает мне на ошибку в вашей архитектуре. Если вы хотите использовать шаблоны, вы не хотите помещать код шаблона в некоторые данные... Мой пример слишком упрощен, вы, конечно, можете улучшить его с помощью миллиона полей. - person Christian Riesen; 15.04.2012