Twig模板,继承和块使用

时间:2012-12-12 19:46:12

标签: php twig

我使用Twig创建了三个模板。第一个在其中定义了块A,第二个从第一个扩展,但包含第三个模板,用于设置块A的内容。

当通过浏览器加载呈现b.html.twig的url时,块A中的内容(由第3个模板定义)未定位块_A已定义。

示例:

<!-- base.html.twig -->
{% block _css '' %}

{% block _header '' %}
{% block _content '' %}
{% block _footer '' %}

{% block _js '' %}


<!-- layout.html.twig -->
<!-- header and footer are placed in the raight zone -->
{% extends ::base.html.twig %}

{% block _header %}
    {% render "MyBundleBundle:Header:header"  %}
{% endblock %}

{% block _footer %}
    {% render "MyBundleBundle:Footer:footer" %}
{% endblock %}


<!-- my_template.html.twig -->
<!-- content is also placed in the right zone but css and js blocks in the included     template are not placed where declared in base.html.twig -->
{% extends MyBundleBundle::layout.html.twig %}
{% block _content %}
     SOME_CONTENT
     {% include MyBundleBundle::my_included_template.html.twig %}
{% endblock %}


<!-- my_included_template.html.twig -->
{% block _css %}
 <link.......................>
{% endblock %}

{% block _js %}
 <script..................>
{% endblock %}

MORE CONTENT BELONGING TO THE INCLUDED TEMPLATE

我期待的是,_css阻止内容显示在页面顶部,_js阻止底部的内容,但这不会发生。我希望你能看到我出错的地方,谢谢!

1 个答案:

答案 0 :(得分:1)

include标记无法按照您的想法/希望的方式运行。它只是将文件包含在当前上下文中。这意味着您无法参考blocks。您只能在模板顶部引用extends标记的模板中引用块。

您将不得不重新设计模板的方式,以使其适合您。您可以直接在控制器中渲染该模板,而不是包含my_included_template.html.twig。这样它就可以完全访问任何继承的块。