91 votes

Brindille - Comment rendre un arbre

Je tiens à rendre un arbre avec une profondeur indéterminée (enfants de enfants de enfants, etc...). J'ai besoin d'une boucle sur le tableau de manière récursive, comment puis-je faire dans Twig?

En ce qui concerne, Ron

121voto

random-coder-1920 Points 499

Grâce domi27, j'ai joué un peu avec votre idée et est venu avec cette. J'ai fait un tableau imbriqué comme mon arbre, ['link']['sublinks'] est null ou un autre tableau de la même chose.

Modèles

Le sous-modèle de fichier de répéter avec:

<!--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 %}

Puis dans le template principal appeler cela (un peu redondant avec " trucs là):

<ul class="main-menu">
    {% include "includes/menu-links.html" with {'links':links} only %}
</ul>

Les Macros

Un effet similaire peut être obtenu avec des macros:

<!--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 %}

Dans le template principal ce faire:

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

Espérons que cela aide :)

37voto

flu Points 3120

Si vous souhaitez utiliser une Macro dans le même modèle , vous devriez utiliser quelque chose comme cela pour rester compatible avec 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>

Cela s'étend random-coder's réponse et intègre dr.scres'allusion à la brindille de la documentation à propos des macros maintenant utiliser _self mais importer localement.

1voto

domi27 Points 2557

J'ai d'abord pensé, cela peut être résolu en simple - mais il n'est pas facile.

Vous avez besoin pour créer une logique, peut-être avec une classe php méthode, l'inclusion d'un rameau de tête, et quand ne pas.

<!-- 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>

Donc, vous pourriez utiliser le rameau variable de boucle , qui est disponible à l'intérieur d'une brindille pour la boucle. Mais je ne suis pas sûr au sujet de la portée de cette boucle variable.

Désolé pour fournir une approche non pas une solution, mais peut-être j'espère que mes pensées peuvent vous aider (un peu).

Ceci et d'autres informations sont disponibles sur les Rameaux "pour" Docu !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X