twig 模板系统重复内容的标记 'use'

Tag 'use' of twig templating system duplicate content

使用 sf2.6.4 和 Twig 模板系统,我对标签 'use'.

有一个奇怪的行为

使用定义默认导航栏和 header 内容的简单基本模板:

{# base.html.twig #}
<html lang="fr">
  <head></head>
  <body>

    {%  block navbar %}<hr> nav bar foo bar<hr>{% endblock %}

    <!-- a default header -->
    {% block header %}
        {%  include 'AppBundle:TestingTwigUse:header.html.twig' %}
    {% endblock %}

  </body>

使用给定的默认 header.html.twig 模板:

{#  header.html.twig  #}
{% block header_container %}
  {% block header_title %}&lt;h1>Default title</h1>{% endblock %}
  {% block header_content %}
    <div>
        This default text header, blablabla...
    </div>
  {% endblock %}
{% endblock %}

当我尝试构建索引模板时,继承基础模板并使用 'use' 标记覆盖 header 内容,如下所示:

{# index.html.twig #}
{% extends "AppBundle:TestingTwigUse:base.html.twig" %}

{% block header %}
    {% use 'AppBundle:TestingTwigUse:header.html.twig' %}
    {% block header_container %}
        {{ parent() }}
        {% block header_content %}
            ***** child template specific content ****
        {% endblock %}
    {% endblock %}
{% endblock %}

我用 header_content 块两次得到以下奇怪的结果:

    ***** child template specific content **** ***** child template specific content ****

有什么想法吗?

我认为问题是您有两个 header_content 块 - 一个在 index.twig.html 中,第二个在 parent() 调用中。第二个定义覆盖第一个导致编译后重复。

如果您想覆盖默认文本 - 您应该删除 parent() 调用。如果你想更新(附加)默认文本 - 你应该重构你的块结构以避免相同的名称。

UPD 试试下面的索引

{# index.html.twig #}
{% extends "AppBundle:TestingTwigUse:base.html.twig" %}

{% block header_content %}
     ***** child template specific content ****
{% endblock %}

更新 2 检查这个 solution

I found a solution. Use the block() function to get the child's block content and pass it to header.html.twig as a variable in the include statement

最后两个解决方案:

有了'use',我们可以得到我们想要保留但失去继承的部分:

{% block header %}
    {% use 'AppBundle:TestingTwigUse:header.html.twig' with header_title as parent_header_title %}
    {% block header_title %}
        {{ block('parent_header_title') }}
    {% endblock %}
    ***** child template specific content ****
{% endblock %}

一个是 'embeb',它结合了包含和扩展行为:

{% block header %}
    {% embed 'AppBundle:TestingTwigUse:header.html.twig'  %}
       {%  block header_content %}
       ***** child template specific content ****
       {% endblock %}
    {% endembed %}
{% endblock %}