Php 条件下的细枝扩展模板
我将Symfony 2与Twig一起使用,我的问题非常简单: 在视图中,我希望基于变量扩展其中一个布局。如果变量为Php 条件下的细枝扩展模板,php,templates,layout,symfony,twig,Php,Templates,Layout,Symfony,Twig,我将Symfony 2与Twig一起使用,我的问题非常简单: 在视图中,我希望基于变量扩展其中一个布局。如果变量为false我想扩展UdoWebsiteBundle::layout.html.twig,如果变量为true我想扩展UdoWebsiteBundle::layout\u true.html.twig 以下是我尝试的代码: {% block layout_extender %} {% if intro == 'false' %} {% extends 'UdoW
false
我想扩展UdoWebsiteBundle::layout.html.twig
,如果变量为true
我想扩展UdoWebsiteBundle::layout\u 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' %}
想法如下:您不能扩展多个模板,这就是为什么会出现错误的原因,如果您想这样做,您需要将它们放入如下数组中
{%extends['MyAppCustomBundle::Layout/Layout.html.twig','FOSUserBundle::Layout.html.twig']%}
但您需要使用Twig版本1.2来完成此操作。
为了保持整洁,您应该使用Twig动态继承支持,使用控制器中定义的变量作为基本模板:
{% extends parent_template_var %}
如果变量的计算结果为Twig_模板对象,Twig将使用它作为父模板
在控制器中定义父模板变量:
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 ));
回答以下问题:
条件继承
由于父级的模板名称可以是任何有效的细枝表达式,因此可以将继承机制设置为有条件的:
{% extends standalone ? "minimum.html" : "base.html" %}
在本例中,如果独立变量的计算结果为true,则模板将扩展“minimum.html”布局模板,否则将扩展“base.html”
无论是使用这个模板还是那个模板,这都是有意义的 但让我描述另一种情况。您有一个配置文件表单和一个用户可以上传个人配置文件相关文档的表单。由于配置文件表单已经很长,文档将移动到新表单 一切都很好。现在我们想使用引导选项卡来创建用户友好的概要文件 现在我知道了,因为我们使用两个单独的表单,如果您提交文档,配置文件上的更改将不会保存,反之亦然 我已使用在选项卡中添加了文档表单
<div role="tabpanel" class="tab-pane" id="documents">
{{ render(controller('ManyAppBundle:Document:createDocument', {'viewOnly': true})) }}
</div>
这就产生了问题,因为您不能在if中使用extends。就像你在其他答案中建议的那样,尝试使用
{% extends viewOnly == true ? ... %}
当viewOnly为false时,这解决了执行代码之前的细枝问题
当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,但失败时未发生任何情况,是否有一种方式表示扩展此模板?您是对的,它也可以工作,这样您还可以扩展不同的模板,具体取决于它是否是ajax请求,例如<代码>{%extends app.request.isXmlHttpRequest?'::/ajax.html.twig':'::/base-3col.html.twig%}。我只是更喜欢在控制器中保留这种测试,即使在每个控制器扩展的超级控制器类中也是如此。请看我关于这方面的完整问题。工作就像一个符咒
{%if isAjax%}{%set extendedTemplate=“blank.html.twig”%%}{%else%}{%set extendedTemplate=“base.html.twig”%%}{%endif%}{%extendedTemplate%}
{% extends viewOnly == true ? ... %}