Twig块传递给嵌入模板

7

我在一个slim框架应用中使用twig模板。我有一个名为page.phtml的模板,它对数据数组进行分页,并有一些子块可供覆盖每个具体元素的细节,例如对用户、事件、订单等进行分页。

page.phtml

<div class="page">
    {% block block1 %}default content{% endblock %}
    <ul>
    ...
    </ul>
    {% block block2 %}{% endblock %}
</div>

我有一个 event.phtml 模板,它嵌入了 page.phtml 并向页面添加了一些其他内容;它还覆盖了默认页面的 block1 内容。

event.phtml

<html>
    <body>
        <h1>Event Page</h1>
        {% embed "page.phtml" %}
            {% block block1 %}event page content{% endblock %}
        {% endembed %}
    </body>
</html>

我有一个自定义事件页面,只需要修改事件页面的几个块,所以我像这样扩展了event.phtml

custom_event.phtml

{% extends "event.phtml" %}
{% block block2 %}overridden value{% endblock %}

我希望在父模板中嵌入的page.phtml模板中能够展示block2的覆盖内容。在父模板中,我可以输出block2的值,但在嵌入的模板中却没有显示。我尝试在嵌入代码event.phtml中显式传递该块,如下所示:

{%embed "page.phtml" %}
    {% block block2 %}{{parent()}}{% endblock %}
    ...
{% endembed %}

但这没有任何区别。我该如何从custom_event.phtml模板中获取被覆盖的block2,并将其传递到扩展的event.phtml模板以及嵌入的page.phtml模板中?


Twig扩展是否是一个可接受的解决方案? - lxg
这个会起作用吗?{% block block2 %}{{ block("block2") }}{% endblock %} - Nathan Arthur
不,它不会,除非你愿意在嵌入之前输出块。 - Nathan Arthur
2个回答

0

你不能这样做。

{% embed %} 技术上定义了一个新的(匿名)模板,该模板扩展了嵌入式模板(这是它可以覆盖块的方式),并包含到当前模板中。这实际上只是为了避免将此部分模板存储在自己的文件中并仅包含一次,而对{% include %}{% extends %}进行语法糖处理。
Twig 包含不可由子模板扩展。仅当前模板的块可用于扩展。而 event.phtml 没有任何块。


0

它们并不漂亮,但我知道一些方法可以实现这个目标。

将父模板中的块渲染为变量

{% set the_block_content %}
    {% block the_block '' %}
{% endset %}

{% embed 'component.html.twig' %}
    {% block the_block the_block_content %}
{% endembed %}

不要在父模板中渲染块,直接从嵌入模板内部调用它们。
{% if false %}
    {% block the_block '' %}
{% endif %}

{% embed 'component.html.twig' %}
    {% block the_block block('the_block', _self) %}
{% endembed %}

有趣的是,_self的值似乎在编译时从所写模板中决定,而不是运行时上下文中决定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接