Ich möchte einen Baum mit einer unbestimmten Tiefe rendern (Kinder von Kindern von Kindern usw.). Ich muss das Array rekursiv durchlaufen. Wie kann ich das in Twig machen?
89
Ich habe mit der Idee von domi27 herumgespielt und mir diese ausgedacht . Ich habe ein verschachteltes Array erstellt, da mein Baum, ['link'] ['sublinks'] null oder ein anderes Array von mehreren derselben ist.
Vorlagen
Die Subvorlagendatei, mit der rekursiv gearbeitet werden soll:
<!--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 %}
Rufen Sie dann in der Hauptvorlage Folgendes auf (Art redundantes 'mit' Zeug dort):
<ul class="main-menu">
{% include "includes/menu-links.html" with {'links':links} only %}
</ul>
Makros
Ein ähnlicher Effekt kann mit Makros erzielt werden:
<!--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 %}
Gehen Sie in der Hauptvorlage folgendermaßen vor:
{% import "macros/menu-macros.html" as macros %}
<ul class="main-menu">
{{ macros.menu_links(links) }}
</ul>
{{ _self.menu_links(links) }}
.{{_self.menu_links}}
ist eine schlechte Praxis ! Lesen Sie hier einen Hinweis: Makro Wenn Sie ein Makro in der Vorlage definieren, in der Sie es verwenden möchten, könnten Sie versucht sein, das Makro direkt über _self.input () aufzurufen, anstatt es zu importieren. Selbst wenn es zu funktionieren scheint, ist dies nur ein Nebeneffekt der aktuellen Implementierung und wird in Twig 2.x nicht mehr funktionieren. Sie sollten Makros noch einmal lokalmenu_links
Zweig 2.0 - 2.11
Wenn Sie ein Makro in derselben Vorlage verwenden möchten , sollten Sie Folgendes verwenden, um mit Twig 2.x kompatibel zu bleiben :
Dies erweitert
random-coder
die Antwort und enthältdr.scre
den Hinweis auf die Twig-Dokumentation zu Makros , die jetzt verwendet_self
, aber lokal importiert werden sollen.Zweig> = 2,11
Ab Twig 2.11 können Sie das weglassen
{% import _self as macros %}
, da Inline-Makros automatisch unter dem_self
Namespace importiert werden (siehe Twig-Ankündigung: Automatischer Makroimport ):quelle
Wenn Sie PHP 5.4 oder höher verwenden, gibt es eine wunderbare neue Lösung (Stand Mai 2016) für dieses Problem von Alain Tiemblo: https://github.com/ninsuo/jordan-tree .
Es ist ein "Baum" -Tag, das genau diesem Zweck dient. Markup würde so aussehen:
quelle
subtree
. In meinem Fall muss der Code wissen, ob es mehr untergeordnete Elemente geben wird, und er übergibt die Anzahl der Ebenen an das Makro, damit es a ausführen kann<div class="{{ classes[current_level].wrapper }} {% if levels > current_level %}accordion-wrapper{% endif %}">
. Um dies zu berechnen, müsste die aktuelle Ebene ein zweites Mal wiederholt werden, um zu erfassen, ob Kinder vorhanden sind.Zuerst dachte ich, dass dies auf einfache Weise gelöst werden kann, aber es ist nicht so einfach.
Sie müssen Logik erstellen, möglicherweise mit einer PHP-Klassenmethode, wann eine Twig-Untervorlage eingefügt werden soll und wann nicht.
Sie können also die spezielle Twig-Schleifenvariable verwenden , die in einer Twig for-Schleife verfügbar ist . Über den Umfang dieser Schleifenvariablen bin ich mir jedoch nicht sicher .
Diese und andere Informationen sind auf Twigs "für" Docu !
quelle
Nahm die Antwort der Grippe und änderte sie ein wenig:
quelle
Die Antworten hier führen mich zu meiner Lösung.
Ich habe eine Kategorieentität mit einer selbstreferenzierenden Viele-zu-Eins-Zuordnung (Eltern zu Kindern).
In meiner Twig-Vorlage rendere ich die Baumansicht folgendermaßen:
quelle