Je voudrais rendre un arbre avec une profondeur indéterminée (enfants d’enfants d’enfants, etc.). J’ai besoin de parcourir le tableau de manière récursive; comment puis-je faire cela dans Twig?
Merci domi27, j’ai joué avec ton idée et c’est ce que j’ai imaginé. J’ai fait un tableau nested comme mon arbre, [‘link’] [‘sublinks’] est nul ou un autre tableau de plus.
Modèles
Le fichier de sous-modèle à utiliser avec:
{% for link in links %} {{ link.name }} {% if link.sublinks %} {% include "includes/menu-links.html" with {'links': link.sublinks} %}
{% endif %} {% endfor %}
Ensuite, dans le modèle principal, appelez ceci (un peu “avec” des trucs):
Macros
Un effet similaire peut être obtenu avec des macros:
{% macro menu_links(links) %} {% for link in links %} {{ link.name }} {% if link.sublinks %} {{ _self.menu_links(link.sublinks) }}
{% endif %} {% endfor %} {% endmacro %}
Dans le modèle principal, faites ceci:
{% import "macros/menu-macros.html" as macros %}
J’espère que cela aide 🙂
Si vous voulez utiliser une macro dans le même modèle, vous devriez utiliser quelque chose comme ça pour restr compatible avec Twig 2.x :
{% macro menu_links(links) %} {% import _self as macros %} {% for link in links %} {{ link.name }} {% if link.sublinks %} {{ macros.menu_links(link.sublinks) }}
{% endif %} {% endfor %} {% endmacro %} {% import _self as macros %}
Ceci étend la réponse de random-coder
dr.scre
et incorpore dr.scre
‘indice de dr.scre
à la documentation sur les macros afin d’ utiliser _self
mais d ‘importer localement.
D’abord, j’ai pensé que cela pourrait être résolu directement, mais ce n’est pas si simple.
Vous devez créer une logique, peut-être avec une méthode de classe php, quand inclure un sous-modèle de brindille et quand ne pas.
{% for key, item in menu %} {# pseudo twig code #} {% if item|hassubitem %} {% include "subitem.html.tpl" %} {% else %} - {{ item }}
{% endif %} {% endfor %}
Vous pouvez donc utiliser la variable de boucle de brindille spéciale, disponible dans une brindille pour la boucle . Mais je ne suis pas sûr de la scope de cette variable de boucle .
Désolé de ne fournir qu’une approche et non une solution, mais j’espère peut-être que mes pensées vous aideront (un peu).
Ceci et d’autres informations sont disponibles sur Twigs “pour” Docu !
Si vous utilisez PHP 5.4 ou supérieur, il existe une nouvelle solution merveilleuse (à partir de mai 2016) par Alain Tiemblo: https://github.com/ninsuo/jordan-tree .
C’est un tag “arbre” qui sert exactement ce but. Le balisage ressemblerait à ceci:
{% tree link in links %} {% if treeloop.first %}{% endif %} - {{ link.name }} {% subtree link.sublinks %}
{% if treeloop.last %}
{% endif %} {% endtree %}
A pris la réponse de la grippe et l’a légèrement modifiée:
{# macro #} {% macro tree(items) %} {% import _self as m %} {% if items %} {% for i in items %} - {{ i.title }} {{ m.tree(i.items) }}
{% endfor %}
{% endif %} {% endmacro %} {# usage #} {% import 'macros.twig' as m %} {{ m.tree(items) }}
Les réponses ici me mènent à ma solution.
J’ai une entité de catégorie avec auto-référence ManyToOne association (parent à enfants).
/** * @ORM\ManyToOne(targetEntity="Category", inversedBy="children") */ private $parent; /** * @ORM\OneToMany(targetEntity="Category", mappedBy="parent") */ private $children;
Dans mon modèle de brindille, je suis en train de rendre l’arborescence comme ceci:
{% for category in categories %} {% if category.parent == null %} - {{ category.name }} {% if category.children|length > 0 %}
{% for category in category.children %} - {{ category.name }}
{% endfor %}
{% endif %} {% endif %} {% endfor %}