仅替换树枝中的一个嵌套块
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 %}
根据@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
中的块
我有以下树枝结构:
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 %}
根据@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