0

我正在使用 twig 并且遇到问题includeand extends

我有一个包含在 index.html.twig 中的文件 header.html.twig。这很好用。

但是,我也试图用extendsindex.html.twig 覆盖 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 %}

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

我怎样才能解决这个问题?

4

2 回答 2

2

您只能{% block... %} {% endblock %}在模板中包含扩展另一个标签的标签。

在您的情况下,如果我正确地得到了您想要实现的目标,您可以在 header.html.twig 中定义一个空块(在开头),并在 index.html.twig 中覆盖该块

{% block foo %}
    {% include "header.html.twig" %}
{% endblock %}
于 2013-08-07T11:10:11.087 回答
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>

对于您的情况,您可以{% block head %}{% endblock %}在 body 块上方添加一个,然后在您的 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>

结论

extends和之间的区别在于include您可以覆盖扩展文件中的块,而使用include.

于 2013-08-07T11:12:43.920 回答