条件扩展模板
我使用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 ));
从官方文档回答:
有条件的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时扩展它,但在失败中没有发生?