Twig расширяет шаблон при условии - PullRequest
39 голосов
/ 22 октября 2011

Я использую 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

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

Ответы [ 5 ]

49 голосов
/ 22 октября 2011

Попробуйте это:

{% extends intro == 'false' 
    ? 'UdoWebsiteBundle::layout.html.twig' 
    : 'UdoWebsiteBundle::layout_true.html.twig' %}

Идея взята отсюда: http://jorisdewit.ca/2011/08/27/extending-different-layouts-for-ajax-requests-in-twig-symfony2/

16 голосов
/ 13 апреля 2012

Чтобы сохранить аккуратность, вы должны использовать поддержку динамического наследования 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

6 голосов
/ 16 февраля 2013

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

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

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

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

В этом примере шаблон расширит шаблон компоновки «imum.html », если автономная переменная оценивается как true, и« base.html »в противном случае.

2 голосов
/ 08 мая 2015

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

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

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

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

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

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

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

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

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

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

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

Это решило проблему Twig вплоть до выполнения кода, когда viewOnly имеет значение false.

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

{{ 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, но ничего не происходит при ошибке?

2 голосов
/ 22 февраля 2012

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

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

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

...