49

我将 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 %}

我收到此错误:

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

有没有其他方法可以实现这一目标?

4

5 回答 5

65

试试这个:

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

于 2011-10-22T17:53:19.310 回答
18

为了保持整洁,您应该通过使用控制器中定义的变量作为基本模板来使用 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

于 2012-04-13T14:31:57.320 回答
9

来自官方文档的回答:

条件继承

由于父模板名称可以是任何有效的 Twig 表达式,因此可以使继承机制有条件:

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

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

于 2013-02-15T20:40:42.550 回答
2

您不能扩展多个模板,这就是您遇到错误的原因,如果您愿意,您需要将它们推送到如下所示的数组中。

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

但是您需要使用 Twig 1.2 版来执行此操作。 树枝文档

于 2012-02-21T20:57:55.717 回答
2

这对做这个模板或那个模板都是有意义的。

但让我描述另一种情况。您有一个配置文件表单和一个用户可以上传个人配置文件相关文档的表单。由于配置文件表格已经很长,文档已移至新表格。

一切都很好。现在我们要使用引导选项卡来执行 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 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 为真但失败时没有任何反应时,有没有办法说扩展这个?

于 2015-05-08T09:27:42.753 回答