我正在实现一个简单的网站菜单,但这次我使用Twig作为我的模板语言。菜单树的深度是一个或更大。到目前为止,这是我的Twig代码(已清理和简化):
{# file menu1.html.twig #}
<ul>
{% import _self as renderer %}
{% for item in menu.items %}
{{ renderer.renderItem(item) }}
{% endfor %}
</ul>
{% macro renderItem(item) %}
{% block itemtag %}
<li>
{% endblock %}
<a href="{{ item.url }}">{{ item.name }}</a>
{% if item.hasItems() %}
<ul>
{% import _self as renderer %}
{% for subitem in item.items %}
{{ renderer.renderItem(subitem) }}
{% endfor %}
</ul>
{% endif %}
</li>
{% endmacro %}
现在我需要覆盖另一个模板中的“itemtag”元素:
{# file menu2.html.twig #}
{% extends "menu1.html.twig" %}
{% block itemtag %}
<li data-foo="bar">
{% endblock %}
这不起作用,正如这里所解释的那样:https://stackoverflow.com/a/26650103/220817
那么如何编写可以遍历和渲染树结构的Twig模板,并且仍允许扩展模板覆盖渲染标记中的某些元素?
答案 0 :(得分:0)
如果你想做一些递归的事情你需要使用宏,因为宏可以自己导入它们。以下是递归宏的示例:
FIValidateForm.arguments.length === 3