[loops] Как сделать дерево в Twig


2 Answers

Если вы хотите использовать макрос в том же шаблоне, вы должны использовать что-то вроде этого, чтобы оставаться совместимым с 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>

Это расширяет ответ random-coder и включает dr.scre к macro чтобы теперь использовать _self но импортировать локально.

Question

Я хотел бы сделать дерево с неопределенной глубиной (дети детей детей и т. Д.). Мне нужно петлю через массив рекурсивно; как я могу это сделать в Twig?




Взял ответ на грипп и немного изменил его:

{# macro #}

{% macro tree(items) %}
    {% import _self as m %}
        {% if items %}
        <ul>
            {% for i in items %}
                <li>
                    <a href="{{ i.url }}">{{ i.title }}</a>
                    {{ m.tree(i.items) }}
                </li>
            {% endfor %}
        </ul>
    {% endif %}
{% endmacro %}

{# usage #}

{% import 'macros.twig' as m %}

{{ m.tree(items) }}



Если вы используете PHP 5.4 или новее, есть замечательное новое решение (по состоянию на май 2016 года) по этой проблеме Алена Тимбло: https://github.com/ninsuo/jordan-tree .

Это тег «tree», который служит этой цели. Разметка будет выглядеть так:

{% tree link in links %}
    {% if treeloop.first %}<ul>{% endif %}

    <li>
        <a href="{{ link.href }}">{{ link.name }}</a>
        {% subtree link.sublinks %}
    </li>

    {% if treeloop.last %}</ul>{% endif %}
{% endtree %}



Related