繁体   English   中英

Twig扩展模板的条件

[英]Twig extend template on condition

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

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

试试这个:

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

为了保持整洁,您应该使用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

官方文件中回答:

条件继承

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

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

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

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

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

一切都很好。 现在我们要使用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但在失败时没有发生任何事情?

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

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

但是你需要使用Twig 1.2版来完成它。 树枝文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM