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

TWIG - How to override block inside Embed, but in child template?

所以,我有 3 个模板:1. 带有一些参数的嵌入小部件,2. 每个页面的全局布局,3. 单页。

我想在 Layout 中制作块,它会被 Page 覆盖,但是当我想把这个块放在 Embed 小部件中时,它不起作用。

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

<div id="{{id|default('awesomeWidget')}}">
    {% block widget_body %}
    {% endblock %}
</div>

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 %}

file: Portal/page.html.twig

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

{% block I_WANT_TO_OVERRIDE_THIS %}
    Hello World
{% endblock %}

有没有可能以某种方式实现这个想法?

你不能这样做。嵌入的工作方式类似于包含和扩展,因此块 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 %}

接受的答案帮助我弄清楚了一个类似的情况,我在嵌入中使用嵌入,我希望能够在子嵌入块中注入 html。

如果您查看 users.html,您会看到我使用 {% set footer %}{% endset %},这允许我将 html 传递到子嵌入 {% block footer %} 块中。

users.html

{% embed 'user_widget.twig'
    with { user: user } only %}        
    {% set footer %}
        <div class='footer'>content here</div>
    {% endset %}
{% endembed %}

user_widget.twig

{% embed 'user_widget.tpl' with {
    open: true,
    id: user.uid
}%}
    <div class='user_header'>{{ user.name }}</div>    
    {% block content %}
        {% embed "user_info.twig" with {
            id: user.id,
            photo: user.picture,
            footer_html: footer} only %}
                {% block footer %}{{ footer_html }}{% endblock %}
        {% endembed %}
    {% endblock %}
{% endembed %}

user_info.twig

<div class='user_info' id='{{ id }}'>
    <img class='user_photo' src='{{ photo }}'>    
    {% block footer %}{% endblock %}
</div>