条件扩展模板

我使用Symfony 2和Twig,我的问题非常简单:

在一个视图中,我想扩展一个基于variables的布局。 如果该variables为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 %} 

我得到这个错误:

第7行的“UdoWebsiteBundle:home:home.html.twig”中禁止使用多个扩展标签

有没有其他办法可以做到这一点?

试试这个:

 {% 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/

为了保持整洁,你应该使用Twigdynamicinheritance支持,通过使用在控制器中定义的variables作为基本模板:

 {% extends parent_template_var %} 

如果variables的计算结果是一个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

从官方文档回答:

有条件的inheritance

由于父级的模板名称可以是任何有效的Twigexpression式,所以可以使inheritance机制有条件:

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

在此示例中,如果独立variables的计算结果为true,则模板将扩展“minimum.html”布局模板,否则将扩展“base.html”。

你不能扩展多个模板,这就是为什么你有错误,如果你想这样做,你需要像下面的数组推动他们。

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

但是你将需要使用Twig版本1.2来做到这一点。 树枝文件

这一切都是有意义的做这个模板或模板。

但让我描述另一种情况。 您有个人资料表格和用户可以上传个人资料相关文件的表格。 由于个人资料表格已经很长,所以文件移动到一个新的表格。

一切都很好。 现在我们要使用引导选项卡来执行Profile | 文件为用户友好。

现在我知道,因为我们使用两个单独的表单,如果您提交文档,configuration文件中的更改将不会保存,反之亦然。

我已经在选项卡中添加了文档表单

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

'viewOnly':true是一个查询参数,不需要动作。

我的问题现在成为,如果configuration文件选项卡呈现文档模板,它只能显示上传小部件和提交的地方,当你直接进入文档页面,它必须显示标题和边栏以及所有内容。 所以我尝试了

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

这给了问题,因为你不能在一个if中使用扩展。 像你在其他答案build议尝试使用

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

当viewOnly为false时,这就解决了Twig问题,直到执行代码。

当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成为false它失败与模板“”无法find。

有没有办法说扩展这个特定的模板,将不扩展任何模板相同的结果?

或者,还有什么方法可以说当viewOnly true时扩展它,但在失败中没有发生?