目前正在使用Symfony2和Twig,我试图在包含的模板中覆盖块。让我解释一下:
{# base.html.twig #}
{% block content %}{% endblock content %}
<!--Some html Code -->
{% block javascripts %}
<!--Some scripts included like jQuery-->
{% endblock javascripts %}
在另一个档案中:
{# page.html.twig #}
{% extends 'base.html.twig' %}
{% block content %}
{% include 'form.html.twig' %}
{% endblock content %}
最后:
{# form.html.twig #}
<form method="post" action="something">
</form>
{# I am trying somehow to override the "javascripts" block here,
unfortunately I didn't figured out how to to that
#}
{% block javascripts %}
{{ parent() }}
<!--Some JS here-->
{% endblock javascripts %}
有办法做我想做的事吗?
答案 0 :(得分:3)
这里需要的是多重继承。但就像php一样,twig没有多重继承。就像php有特征一样,twig对此有一个名为use的姑息。请记住,twig被编译为php。我认为在use
语句中使用的块最终会被编译成特征。
首先,创建一个&#34;特质&#34;使用您想在不同地方重复使用的块:
{% block my_form %}
<form method="post" action="something">
</form>
{% endblock %}
{% block form_specific_javascript %}
<!--Some JS here-->
{% endblock}
然后,在您的页面模板中,调用&#34; trait&#34;,然后重复使用这些块:
{# page.html.twig #}
{% extends 'base.html.twig' %}
{% block content %}
{% use 'form.html.twig' %}
{{ block('my_form') }}
{% endblock content %}
{# override the javascript block #}
{% block javascripts %}
{{parent()}}
{{block('form_specific_javascript')}}
{% endblock %}
如您所见,您无法从表单模板中完成所有操作,您必须执行一些操作 在您的页面模板中布线。仍然,调用块比复制/粘贴更好 它的内容,不是吗?
答案 1 :(得分:0)
您只需在form.html.twig
块
javascripts
即可
<强> base.html.twig 强>
{% block content %}
<!--Some html Code -->
{% endblock content %}
{% block javascripts %}
<!--Some scripts included like jQuery-->
{% endblock javascripts %}
<强> page.html.twig 强>
{% extends 'base.html.twig' %}
{% block javascripts %}
{{ parent() }}
{% include 'form.html.twig' %}
{% endblock javascripts %}
<强> form.html.twig 强>
<!--Some JS here-->
答案 2 :(得分:0)
因为我正在寻找相同的答案并且实际上找到了解决方案。
它位于TWIG内,带有嵌入标记。
在twig版本1.8中可用,embed标签允许我们包含&#34;包含&#34;一个模板,它有自己定义的块然后可以被覆盖。
答案 3 :(得分:0)
我有完全相同的问题。我一直在寻找解决方案,但没有找到任何解决方案。不幸的是include
,embed
和use
无法解决此问题。但是我发现了两种可能的解决方法。
将表单分为两个文件_form.html.twig
和_form_js.html.twig
,然后将它们导入相应的块中。
反转模板的层次结构。直接从form
扩展base
。
# form.html.twig
{% extends 'layouts/base.html.twig' %}
{% block body %}
{{ block('page_header') }}
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script>
# ...
</script>
{% endblock %}
然后在form
和new
之类的其他模板中扩展edit
。
# new.twig.html
{% extends 'form.html.twig' %}
{% block page_header %}
# custom content here
{% endblock %}