我在Twig上使用Symfony 2,我的问题很简单:
在视图中,我想基于变量扩展其中一个布局。如果变量是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”中禁止使用多个扩展标记
还有其他方法可以达到这个目的吗?
答案 0 :(得分:48)
试试这个:
{% 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/
答案 1 :(得分:16)
为了保持整洁,您应该使用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 ));
答案 2 :(得分:6)
条件继承
由于父模板的名称可以是任何有效的Twig表达式,因此可以使继承机制成为条件:
{% extends standalone ? "minimum.html" : "base.html" %}
在此示例中,如果独立变量的计算结果为true,则模板将扩展“minimum.html”布局模板,否则将扩展“base.html”。
答案 3 :(得分:2)
你无法扩展多个模板,这就是你遇到错误的原因,如果你愿意的话,你需要将它们推送到如下所示的数组中。
{% extends ['MyAppCustomBundle::Layout/layout.html.twig', 'FOSUserBundle::layout.html.twig'] %}
但是你需要使用Twig 1.2版来完成它。 twig documentation
答案 4 :(得分:1)
这样做这个模板或模板都是有意义的。
但让我描述另一种情况。您有一个个人资料表单和一个表单,用户可以上传个人资料相关文档。由于配置文件表单已经很长,文档已移动到新表单。
一切都很好。现在我们要使用bootstrap选项卡来执行Profile |用户友好的文件。
现在我知道,因为如果您提交文件,我们使用两个单独的表格,个人资料上的更改将无法保存,反之亦然。
我已使用
在标签中添加了文档表单<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而产生问题。就像你在其他答案中建议的那样尝试使用
{% extends viewOnly == true ? ... %}
当viewOnly为false时,这解决了Twig问题直到执行代码。
当viewOnly为false时,它必须扩展所有其他模板使用的基本模板,但如果为true,我只想显示:
{{ 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,则失败并且模板“”无法找到。
有没有办法说扩展这个特定的模板,这与不扩展任何模板的结果相同?
或者有没有办法说当viewOnly为true但在失败时没有发生任何事情时延伸这个?