【问题标题】:Include and Extends the same file?包含和扩展同一个文件?
【发布时间】:2013-08-07 06:28:58
【问题描述】:

我正在使用 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 %}

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

我该如何解决这个问题?

【问题讨论】:

  • 你能提供一些细节吗? header.html.twig 是什么样的?你到底想覆盖什么?

标签: html twig


【解决方案1】:

模板中只能有{% block... %} {% endblock %}标签来扩展另一个标签。

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

覆盖该块>
{% block foo %}
    {% include "header.html.twig" %}
{% endblock %}

【讨论】:

    【解决方案2】:

    如果您在任何块之外执行操作,这些操作将被视为您的 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 %},然后在您的 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 包含它时不能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-27
      • 2011-03-24
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      相关资源
      最近更新 更多