Я использую 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
Есть ли другой способ достичь этого?
Попробуй это:
{% 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/
Чтобы сохранить его аккуратным, вы должны использовать поддержку динамического наследования 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 ));
Ответ из официальной документации :
Условное наследование
Поскольку имя шаблона для родителя может быть любым допустимым выражением Twig, можно сделать механизм наследования условным:
{% extends standalone ? "minimum.html" : "base.html" %}
В этом примере шаблон расширяет шаблон макета «minimum.html», если независимая переменная будет равна true, а в противном случае – «base.html».
Вы не можете расширять несколько шаблонов, поэтому у вас есть ошибка, если вы этого хотите, вам нужно нажать их в массиве, как показано ниже.
{% extends ['MyAppCustomBundle::Layout/layout.html.twig', 'FOSUserBundle::layout.html.twig'] %}
Но для этого вам понадобится версия Twig версии 1.2. сводная документация
Все это имеет смысл делать либо этот шаблон, либо этот шаблон.
Но позвольте мне описать другую ситуацию. У вас есть форма профиля и форма, в которой пользователи могут загружать личные документы, связанные с профилем. Поскольку форма профиля уже очень длинная, документы переместились в новую форму.
Все отлично работает. Теперь мы хотим использовать вкладки 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, но ничего не происходит при сбое?