Заменить только один вложенный блок в ветке - PullRequest
0 голосов
/ 15 января 2020

У меня есть следующая структура веток:

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

Чего я хочу добиться - просто замените блок menu_country внутри child.twig. Если я использую описанный выше подход, весь блок меню заменяется только menu_country , что означает, что блок menu_main отсутствует.

I пробовал также

{% extends "base.twig" %}

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

, но это делает блок menu_country дважды. Есть ли способ достичь этого?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

После дальнейшего изучения в связи с ответом @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

0 голосов
/ 15 января 2020

Включение шаблонов не означает, что вы импортируете указанные блоки внутри шаблона. Это означает, что внутри child.twig будет существовать только блок menu.

В первом примере вы просто перезаписываете блок 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>

menu-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 %}

демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...