包含并扩展相同的文件?

时间:2013-08-07 06:28:58

标签: html twig

我正在使用树枝并遇到includeextends的问题。

我有一个文件header.html.twig,我将其包含在index.html.twig上。这很好。

但是,我还试图在index.html.twig上用extends覆盖header.html.twig文件的一部分。我想出的代码是:

<!-- index.html.twig -->
{% include '::header.html.twig' %}
    {% extends '::header.html.twig' %}
    {% block head %}
        <li class="active"><a href="#login">Login</a></li>
    {% endblock %}

但是,此代码抛出异常“扩展另一个的模板不能有正文......”

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您只能在模板中添加{% block... %} {% endblock %}个标记,以扩展另一个标记。

在你的情况下,如果我正确地想要实现你想要实现的目标,你可以在header.html.twig中定义一个空块(在开头),并用

{% block foo %}
    {% include "header.html.twig" %}
{% endblock %}

答案 1 :(得分:1)

如果你在任何区块之外做事,那些东西被认为是你的twig文件的主体。正如异常明确指出的那样,如果要扩展树枝模板,则需要覆盖扩展文件中包含的一些块,而不需要任何正文。

您应该使用之前没有任何包含的{% extends %}标记,因为扩展已包含内容。打包的“base.html.twig”文件就是一个很好的例子:你将应用程序中随处可用的代码放在base.html.twig文件中:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
        <link rel="shortcut icon" href="{{ asset('favicon.ico') }}" />
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>

对于您的情况,您可以在body块上方添加{% block head %}{% endblock %},然后在index.html.twig文件中覆盖此块以实现它。

{% extends '::base.html.twig' %}
{% block head %}
    <li class="active"><a href="#login">Login</a></li>
{% endblock %}

这将最终输出:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Welcome!</title>
        <link rel="shortcut icon" href="/favicon.ico" />
    </head>
    <body>
       <li class="active"><a href="#login">Login</a></li>
    </body>
</html>

结论

extendsinclude之间的区别在于您可以覆盖扩展文件中的块,而使用include包含它时则无法覆盖。