TWIG - 如何覆盖嵌入内部的块,但在子模板中?

123*_*qwe 9 symfony twig

所以,我有3个模板:1.使用一些参数嵌入Widget,2.每页的全局布局,3.单页.

我想在Layout中使用Page来覆盖它,但是当我想将这个块放在Embed小部件中时,它就不起作用了.

file: Widget/awesome.html.twig (嵌入小部件)

<div id="{{id|default('awesomeWidget')}}">
    {% block widget_body %}
    {% endblock %}
</div>
Run Code Online (Sandbox Code Playgroud)

file: Layout/layout.html.twig

{% block layout_body %}
    {% embed 'AcmeFoobarBundle:Widget:awesome.html.twig' with 
            {'id':'myAwesomeWidget'} only %}
        {% block widget_body %}
            {% block I_WANT_TO_OVERRIDE_THIS %}
            {% endblock %}
        {% endblock %}
    {% endembed %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

file: Portal/page.html.twig

{% extends 'AcmeFoobarBundle:Layout:layout.html.twig' %}

{% block I_WANT_TO_OVERRIDE_THIS %}
    Hello World
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

这可能以某种方式做到这一点吗?

小智 16

你不能这样做.嵌入式工作包括include和extends,因此块I_WANT_TO_OVERRIDE_THIS实际上在你的'扩展'awesome.html.twig'中.页面扩展layout.html.twig不是很棒,所以page.html没有I_WANT_TO_OVERRIDE_THIS块

您应该考虑将其更改为您的窗口小部件的占位符,并将它们嵌入page.html.twig级别.

如果你真的需要这种方式,你最终可以这样做:在layout.html.twig中:

{% set overrideWidgetPart %}
   {% block I_WANT_TO_OVERRIDE_THIS %}{% endblock %}
{% endset %}

{% block layout_body %}
    {% embed 'AcmeFoobarBundle:Widget:awesome.html.twig' with 
            {'id':'myAwesomeWidget', overrideWidgetPart: overrideWidgetPart } only %}
        {% block widget_body %}
            {{ overrideWidgetPart  }}
        {% endblock %}
    {% endembed %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)