仅替换树枝中的一个嵌套块

Replace only one nested block in twig

我有以下树枝结构:

base.twig

<html>
  <head>
  </head>

  <body class="fade-in {{body_class}}">
    <main>
      {% block menu %}
          {% include 'menu.twig' %}
      {% endblock %}
    </main>
  </body>
</html>

menu.twig

<header>
  <div>
    {% block menu_main %}
       {% include 'menu-main.twig' %}
    {% endblock %}

    {% block menu_country %}
        {% include 'menu-country.twig' with { menu_country: dropdownland } %}
    {% endblock %}
  </div>
</header>

child.twig

{% extends "base.twig" %}

{% block menu %}
  {% block menu_country %}
    {% include 'menu-country.twig' with { menu_country: menu_ap_countries } %}
  {% endblock %}
{% endblock %}

我想要实现的是,只需替换child.twig中的块menu_country即可。如果我使用上面的方法,整个块 menu 只会被 menu_country 替换,这意味着块 menu_main 缺失。

我也试过了

{% extends "base.twig" %}

{% block menu %}
  {{ parent() }}
  {% block menu_country %}
    {% include 'menu-country.twig' with { menu_country: menu_ap_countries } %}
  {% endblock %}
{% endblock %}

但这会渲染块 menu_country 两次。有什么办法可以实现吗?

非常感谢。

包含模板并不意味着您在模板中导入所述块。 这意味着只有块 menu 将存在于 child.twig.

在您的第一个示例中,您实际上只是覆盖块 menu 并在其中创建一个新块 menu_country

在您的第二个示例中,您告诉 twig 输出块 menu 的默认内容并向其附加一个新块 menu_country


一个可能的解决方案是将设置更改为此,例如

menu.twig

<header>
  <div>
    {% block menu_main %}
       {% include 'menu-main.twig' %}
    {% endblock %}

    {% block menu_country %}
        {% include 'menu-country.twig' %}
    {% endblock %}
  </div>
</header>

菜单-country.twig

<ul class="country">
{% for country in menu_country|default(dropdownland) %}
    <li><a href="#">{{ country }}</a></li>
{% endfor %}
</ul>

child.twig

{% extends "base.twig" %}

{% block menu %}
    {% include 'menu.twig' with { menu_country: menu_ap_countries, } %}
{% endblock %}

demo

根据@DarkBees 的回答进一步调查后,我遇到了 embed 函数,它正是我在这种情况下需要的。所以扩展模板变成这样:

{% block menu %}
  {% embed 'menu.twig'%}
    {% block menu_country %}
      {% include 'menu-country.twig' with { menu_country: menu_ap_countries } %}
    {% endblock %}
  {% endembed %}
{% endblock %}

通过嵌入,我可以覆盖menu.twig

中的块