如何实现递归和可扩展的Twig模板?

时间:2016-08-22 10:02:20

标签: templates twig

我正在实现一个简单的网站菜单,但这次我使用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模板,并且仍允许扩展模板覆盖渲染标记中的某些元素?

1 个答案:

答案 0 :(得分:0)

如果你想做一些递归的事情你需要使用宏,因为宏可以自己导入它们。以下是递归宏的示例:

FIValidateForm.arguments.length === 3