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

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

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

 {% 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 )); 

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

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

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

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