Подтвердить что ты не робот

Twig расширяют шаблон при условии

Я использую Symfony 2 с Twig, и мой вопрос довольно прост:

В представлении я хочу расширить один из макетов на основе переменной. Если переменная false, я хочу расширить UdoWebsiteBundle::layout.html.twig, и если она true, я хочу расширить UdoWebsiteBundle::layout_true.html.twig.

Вот код, который я пробовал:

{% block layout_extender %}

    {% if intro == 'false' %}
        {% extends 'UdoWebsiteBundle::layout.html.twig' %}
    {% else %}
        {% extends 'UdoWebsiteBundle::layout_true.html.twig' %}
    {% endif %}

{% endblock %}

Я получаю эту ошибку:

Несколько расширений тегов запрещены в "UdoWebsiteBundle: home: home.html.twig" в строке 7

Есть ли другой способ достичь этого?

4b9b3361

Ответ 2

Чтобы поддерживать его аккуратно, вы должны использовать поддержку динамического наследования Twig, используя переменную, определенную в вашем контроллере, в качестве базового шаблона:

{% extends parent_template_var %}

Если переменная оценивается объектом Twig_Template, Twig будет использовать ее в качестве родительского шаблона.

Определите parent_template_var в вашем контроллере:

if($intro == 'false')
    $parent_template_var = 'UdoWebsiteBundle::layout.html.twig';
}else{
    $parent_template_var = 'UdoWebsiteBundle::layout_true.html.twig';
}
return $this->render('::/action.html.twig', array('parent_template_var' => $parent_template_var ));

http://twig.sensiolabs.org/doc/tags/extends.html

Ответ 3

Ответ официальная документация:

Условное наследование

Поскольку имя шаблона для родителя может быть любым допустимым выражением Twig, возможно сделать механизм наследования условным:

{% extends standalone ? "minimum.html" : "base.html" %}

В этом примере шаблон расширит шаблон макета "minimum.html", если независимая переменная будет равна true, а в противном случае - "base.html".

Ответ 4

Вы не можете расширять несколько шаблонов, поэтому у вас есть ошибка, если вы этого хотите, вам нужно нажать их в массиве, как показано ниже.

{% extends ['MyAppCustomBundle::Layout/layout.html.twig', 'FOSUserBundle::layout.html.twig'] %}

Но для этого вам понадобится версия Twig версии 1.2. документация twig

Ответ 5

Все это имеет смысл делать либо этот шаблон, либо этот шаблон.

Но позвольте мне описать другую ситуацию. У вас есть форма профиля и форма, в которой пользователи могут загружать личные документы, связанные с профилем. Поскольку форма профиля уже очень длинная, документы переместились в новую форму.

Все отлично работает. Теперь мы хотим использовать вкладки bootstrap для создания профиля | Документы для удобства использования.

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

Я добавил форму документа на вкладке, используя

<div role="tabpanel" class="tab-pane" id="documents">
    {{ render(controller('ManyAppBundle:Document:createDocument', {'viewOnly': true})) }}
</div>

"viewOnly": true - это параметр запроса и не требуется действием.

Теперь мой вопрос будет, если вкладка профиля отображает шаблон документа, он должен отображать только виджет загрузки и отправить, где, когда вы переходите непосредственно на страницу документа, он должен показывать заголовок, боковую панель и все такое. Поэтому я попытался

{% if not viewOnly %}
    {% extends ... %}
{% endif %}

Это дало проблемы, потому что вы не можете использовать расширения в пределах if. Как и в других ответах, попробуйте использовать

{% extends viewOnly == true ? ... %}

Это перевернуло проблему Twig до выполнения кода, когда viewOnly является ложным.

Когда viewOnly является ложным, он должен расширять базовый шаблон, используемый всеми другими шаблонами, но если это правда, я хочу только показать это:

{{ form_start(form, { 'style': 'horizontal', 'col_size': 'sm' }) }}
    {% if form.documents is defined %}
        {{ form_row(form.documents) }}
    {% endif %}

    {{ form_row(form.submit, { 'attr': { 'class': 'btn btn-success' } }) }}
{{ form_end(form) }}

Но теперь с верхним

{% extends viewOnly == true ? ... %}

если viewOnly становится ложным, это не удается с шаблоном "", который невозможно найти.

Есть ли способ сказать, расширяет этот конкретный шаблон, который будет тем же самым результатом нераспространения какого-либо шаблона?

Или, наоборот, есть способ сказать, что это расширение, когда viewOnly true, но ничего не происходит при сбое?