我有2个模板,我想从主模板覆盖变量body_class
。这是我到目前为止的代码。
主要模板:
{# main.html.twig #}
<!DOCTYPE html>
<html>
<head>
{% block head %}
{% block head_meta %}
// ...
{% endblock %}
<title>{% block title %}Welcome!{% endblock %}</title>
{% block stylesheets %}
// ...
{% endblock %}
{% block icon %}
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
{% endblock %}
{% endblock %}
</head>
{% set body_class = '' %}
<body class="main {{ body_class }}">
{% block navi %}{% endblock %}
{% block error %}{% endblock %}
{% block body %}{% endblock %}
{% block footer %}{% endblock %}
{% block javascripts %}
// ...
{% endblock %}
</body>
</html>
第二个模板:
{# dashboard.html.twig #}
{% set body_class = 'dashboard' %}
{% extends 'main.html.twig' %}
{% block head %}
{{ parent() }}
{% endblock %}
{% block head_meta %}
{{ parent() }}
{% endblock %}
{% block title %}Dashboard!{% endblock %}
{% block body %}
I'm dashboard!
{% endblock %}
我尝试在扩展语句之前和之后放置{% set body_class = 'dashboard' %}
,但这不起作用。我做错了什么?
谢谢。
答案 0 :(得分:2)
您不应在body_class
文件中设置main.html.twig
。 dashboard.html.twig
一切都很好,只需更改main.html.twig
:
删除{% set body_class = '' %}
行并将<body class="main {{ body_class }}">
更改为<body class="main {{ body_class|default('') }}">
。
这样,如果未定义body_class
变量值''
作为default值,则从'dashboard'
设置dashboard.html.twig
1}}文件。
如果您在基本文件中设置了一个变量,在本例中为main.html.twig
,那么您就无法从继承模板中覆盖它。
答案 1 :(得分:0)
子主题的变量可以被其父母访问,但是一旦您在父主题中重新声明,它们就会被覆盖。
因此,只有在未定义的情况下,您才可以在父对象中声明变量:
{# main.html.twig #}
...
{% set body_class = body_class is defined ? body_class : '' %}
<body class="main {{ body_class }}">
...
{# dashboard.html.twig #}
{% extends 'main.html.twig' %}
{% set body_class = 'dashboard' %}