Twig:在先前模板中设置的变量覆盖

时间:2017-06-24 21:01:13

标签: templates twig

我有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' %},但这不起作用。我做错了什么?

谢谢。

2 个答案:

答案 0 :(得分:2)

您不应在body_class文件中设置main.html.twigdashboard.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' %}