如何在Twig中渲染树

T-R*_*onX 89 tree recursion loops twig

我想渲染一棵深度不确定的树(儿童的孩子等).我需要递归地遍历数组; 我怎么能在Twig中这样做?

小智 110

感谢domi27,我玩弄了你的想法并想出了这个.我做了一个嵌套数组作为我的树,['link'] ['sublinks']为null或另一个更多相同的数组.

模板

用于递归的子模板文件:

<!--includes/menu-links.html-->
{% for link in links %}
    <li>
        <a href="{{ link.href }}">{{ link.name }}</a>
        {% if link.sublinks %}
            <ul>
                {% include "includes/menu-links.html" with {'links': link.sublinks} %}
            </ul>
        {% endif %}
    </li>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

然后在主模板中调用它(有点多余的'带'那里的东西):

<ul class="main-menu">
    {% include "includes/menu-links.html" with {'links':links} only %}
</ul>
Run Code Online (Sandbox Code Playgroud)

使用宏可以实现类似的效果:

<!--macros/menu-macros.html-->
{% macro menu_links(links) %}
    {% for link in links %}
        <li>
            <a href="{{ link.href }}">{{ link.name }}</a>
            {% if link.sublinks %}
                <ul>
                    {{ _self.menu_links(link.sublinks) }}
                </ul>
            {% endif %}
        </li>
    {% endfor %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

在主模板中执行以下操作:

{% import "macros/menu-macros.html" as macros %}
<ul class="main-menu">
    {{ macros.menu_links(links) }}
</ul>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)

  • 非常感谢!如果要在同一模板中使用宏,可以使用`{{_self.menu_links(links)}}`. (9认同)
  • 使用`{{_self.menu_links}}`是一种不好的做法**!请阅读此处的注释:[宏](http://twig.sensiolabs.org/doc/tags/macro.html)当您在模板中定义要使用它的宏时,您可能会想要调用宏直接通过_self.input()而不是导入它; 即使似乎工作,这只是当前实现的副作用,它将不再适用于Twig 2.x. 您应该再次在本地导入宏,然后选择`menu_links` (4认同)

flu*_*flu 35

如果你想在同一个模板中使用一个宏,你应该使用这样的东西来保持与Twig 2.x兼容:

{% macro menu_links(links) %}
    {% import _self as macros %}
    {% for link in links %}
        <li>
            <a href="{{ link.href }}">{{ link.name }}</a>
            {% if link.sublinks %}
                <ul>
                    {{ macros.menu_links(link.sublinks) }}
                </ul>
            {% endif %}
        </li>
    {% endfor %}
{% endmacro %}

{% import _self as macros %}

<ul class="main-menu">
    {{ macros.menu_links(links) }}
</ul>
Run Code Online (Sandbox Code Playgroud)

这扩展了random-coder答案,并将有关宏的文档dr.scre提示结合到现在使用但在本地导入._self


dom*_*i27 1

一开始我以为这个问题可以通过简单的方式解决,但事实并非如此简单。

您需要创建逻辑(可能使用 PHP 类方法),何时包含 Twig 子模板,何时不包含。

<!-- tpl.html.twig -->
<ul>
    {% for key, item in menu %}
        {# Pseudo Twig code #}
        {% if item|hassubitem %}
            {% include "subitem.html.tpl" %}
        {% else %}
            <li>{{ item }}</li>
        {% endif %}
    {% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用特殊的Twig 循环变量,该变量在 Twig for 循环中可用。但我不确定这个循环变量的范围。

此信息和其他信息可在Twigs“for”Docu上找到!