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>
所以,我有 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>