我正在使用树枝并遇到include
和extends
的问题。
我有一个文件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 %}
但是,此代码抛出异常“扩展另一个的模板不能有正文......”
我该如何解决这个问题?
答案 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>
结论
extends
和include
之间的区别在于您可以覆盖扩展文件中的块,而使用include
包含它时则无法覆盖。