不能覆盖包含的树枝模板中的块

时间:2015-03-17 05:59:55

标签: symfony templates twig

请帮助我了解在树枝中使用模板继承的正确方法。

我有一个模板 base.html.twig ,我的所有其他模板都会扩展。这包含html,head,body等标签和几个块。

我想移动<头> base.html.twig 模板中的部分到其自己的文件 head.html.twig 。如果我使用include指令,则该部分中的标题块不再被扩展模板正确覆盖。

我决定通过在扩展模板中将标题设置为变量并将其传递给include语句来解决此问题。但是现在我的页面需要额外的javascript加载到<头>部分,所以我必须添加变量来指示加载哪些...

显然这是一个可怕的kludge。这样做的正确方法是什么?

编辑:在@goto的建议下,我尝试用embed替换include。现在我的代码看起来像:

{# base.html.twig #}
<!DOCTYPE html>
<html>
{% embed 'AppBundle::head.html.twig' %}
    {% block title %}My Company Name{% endblock %}
{% endembed %}
<body>
    {% block content %}{% endblock %}
</body>
</html>

{# head.html.twig #}
<head>
    <title>{% block title %}{% endblock %}</title>
    <!-- load other css, js, etc -->
</head>

{# page.html.twig #}
{% extends 'AppBundle::base.html.twig' %}
{% block title %}{{ page.title }} - My Company Name{% endblock %}
{% block content %}
    <h1>{{ page.title }}</h1>
    {{ page.content|raw }}
{% endblock %}

但这不起作用,标题总是“我的公司名称”。

3 个答案:

答案 0 :(得分:0)

好的,例如你有一个 base.html.twig

<html>
<head>
    <title>{% block title %}{% endblock %}</title>

    <link rel="shortcut icon" href="{{ Someurl }}">

    {% block css %}
     ..... ///some css here
    {% endblock %}

    {% block js %}
    ...//javascript goes here
    {% endblock %}
    .......

使用twig继承,你可以像这样在你的孩子中删除任何这些块:

child.html.twig

{% extends ::base.html.twig %}
{% block js %}
    {{ parent() }}
   .... your new js
{% endblock %}

使用关键字 {{parent()}} ,您可以将基本模板中的现有数据包含到当前模板中,如果没有它,您将获得明确的阻止。

答案 1 :(得分:0)

尝试使用embed而不是include,它允许您重新定义包含部分的内部块:

{% embed "YourBundle:Acme:_embedded.html.twig" %}
    {% block header%}
        A new header
    {% endblock header%}
    {% block body%}
        A new body
    {% endblock body%}
{% endembed %}

有关详细信息,请参阅the doc

答案 2 :(得分:0)

找到解决方案。我需要&#34;使用&#34;标记:

{# base.html.twig #}
<!DOCTYPE html>
<html>
{% use 'AppBundle::head.html.twig' %}
{% block head %}
    {{ parent() }}
{% endblock %}
<body>
    {% block content %}{% endblock %}
</body>
</html>

{# head.html.twig #}
{% block head %}
    <head>
        <title>{% block title %}My Company Name{% endblock %}</title>
        <!-- load other css, js, etc -->
    </head>
{% endblock %}

{# page.html.twig #}
{% extends 'AppBundle::base.html.twig' %}
{% block title %}{{ page.title }} - My Company Name{% endblock %}
{% block content %}
    <h1>{{ page.title }}</h1>
    {{ page.content|raw }}
{% endblock %}