Twig块传递给嵌入式模板

时间:2013-12-27 18:57:45

标签: templates embed twig block extend

我在一个纤薄的框架应用程序中使用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 %}

并且预期block2的重写内容将显示在父模板嵌入的page.phtml模板中。我可以在父模板中输出block2的值,它就在那里,但在嵌入式模板中却没有。我尝试在嵌入式event.phtml中明确传递块,如此

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

但这并没有产生任何影响。如何从custom_event.phtml模板一直通过扩展的event.phtml模板和嵌入式page.phtml模板获取被覆盖的block2?

1 个答案:

答案 0 :(得分:0)

你不能这样做。

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