覆盖Twig中包含的模板中的块

时间:2014-02-26 15:20:49

标签: symfony twig block override

目前正在使用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 %}

有办法做我想做的事吗?

4 个答案:

答案 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;一个模板,它有自己定义的块然后可以被覆盖。

此处提供更多信息:http://twig.sensiolabs.org/doc/tags/embed.html

答案 3 :(得分:0)

我有完全相同的问题。我一直在寻找解决方案,但没有找到任何解决方案。不幸的是includeembeduse无法解决此问题。但是我发现了两种可能的解决方法。

选项1(更简单,但需要更多代码)

将表单分为两个文件_form.html.twig_form_js.html.twig,然后将它们导入相应的块中。

选项2

反转模板的层次结构。直接从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 %}

然后在formnew之类的其他模板中扩展edit

# new.twig.html

{% extends 'form.html.twig' %}

{% block page_header %}

    # custom content here

{% endblock %}