Twig扩展模板的条件

时间:2011-10-22 17:44:43

标签: php templates layout symfony twig

我在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”中禁止使用多个扩展标记

还有其他方法可以达到这个目的吗?

5 个答案:

答案 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 ));

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

答案 2 :(得分:6)

来自official documentation

的回答
  

条件继承

     

由于父模板的名称可以是任何有效的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但在失败时没有发生任何事情时延伸这个?