无法覆盖包含的树枝模板中的块

Cant override blocks in included twig template

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

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

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

我确定我可以通过将标题设置为扩展模板中的变量并将其传递到我的包含语句中来解决这个问题。但是现在我有一些页面需要在 部分加载额外的 javascript 位,所以我必须添加变量来指示加载哪些内容...

显然这是一个可怕的拼凑。正确的做法是什么?

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

{# 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 %}

但这不起作用,标题总是"My Company Name"。

好的,例如你有一个 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 中覆盖任何这些块:

child.html.twig

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

使用关键字 {{ parent() }} 您会将现有数据从基本模板包含到您当前的模板中,没有它您将获得清除块。

尝试嵌入而不是包含,它允许您重新定义包含部分的内部块:

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

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

找到解决方案。我需要 "use" 标签:

{# 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 %}