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
Есть ли другой способ достичь этого?
Ответы
Ответ 1
Попробуйте следующее:
{% 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/
Ответ 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, но ничего не происходит при сбое?