Comment rendre un arbre dans Twig

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 %} {% endif %}
    • {% endif %} {% endfor %}