Chciałbym wyrenderować drzewo o nieokreślonej głębokości (dzieci dzieci itp.). Muszę cyklicznie przechodzić przez tablicę; jak mogę to zrobić w Twig?
90
I bawił się pomysłem domi27 męska i wpadł na to. Zrobiłem zagnieżdżoną tablicę jako moje drzewo, ['link'] ['podrzędne'] ma wartość null lub inną tablicę, która zawiera więcej takich samych.
Szablony
Plik pod-szablonu do ponownego wykorzystania:
<!--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 %}
Następnie w głównym szablonie nazwij to (rodzaj zbędnych rzeczy tam „z”):
<ul class="main-menu">
{% include "includes/menu-links.html" with {'links':links} only %}
</ul>
Makra
Podobny efekt można osiągnąć za pomocą makr:
<!--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 %}
W głównym szablonie zrób to:
{% import "macros/menu-macros.html" as macros %}
<ul class="main-menu">
{{ macros.menu_links(links) }}
</ul>
{{ _self.menu_links(links) }}
.{{_self.menu_links}}
to zła praktyka ! Przeczytaj notatkę tutaj: makro Gdy definiujesz makro w szablonie, w którym zamierzasz go użyć, możesz ulec pokusie wywołania makra bezpośrednio przez _self.input () zamiast importowania go; nawet jeśli wydaje się działać, jest to tylko efekt uboczny obecnej implementacji i nie będzie już działać w Twig 2.x. Powinieneś ponownie zaimportować makra lokalnie insitemenu_links
Twig 2.0 - 2.11
Jeśli chcesz użyć makra w tym samym szablonie , powinieneś użyć czegoś takiego, aby pozostać kompatybilnym z Twig 2.x :
To rozszerza
random-coder
odpowiedź i włączadr.scre
wskazówkę do dokumentacji Twig na temat makr, które mają być teraz używane_self
, ale importowane lokalnie.Gałązka> = 2,11
Począwszy od Twig 2.11 , możesz pominąć
{% import _self as macros %}
, ponieważ wbudowane makra są importowane automatycznie w_self
przestrzeni nazw (zobacz ogłoszenie Twig: Automatyczny import makr ):źródło
Jeśli korzystasz z PHP 5.4 lub nowszego, istnieje wspaniałe nowe rozwiązanie (stan na maj 2016 r.) Autorstwa Alaina Tiemblo: https://github.com/ninsuo/jordan-tree .
Jest to tag „drzewo”, który służy właśnie do tego celu. Znaczniki wyglądałyby następująco:
źródło
subtree
. W moim przypadku kod musi wiedzieć, czy będzie więcej dzieci i przekazuje liczbę poziomów do makra, aby mogło wykonać plik<div class="{{ classes[current_level].wrapper }} {% if levels > current_level %}accordion-wrapper{% endif %}">
. Obliczenie tego wymagałoby powtórnego powtórzenia bieżącego poziomu, aby uchwycić, czy są jakieś dzieci.Najpierw pomyślałem, że można to rozwiązać w prosty sposób, ale nie jest to takie łatwe.
Musisz stworzyć logikę, być może za pomocą metody klasy PHP, kiedy dołączyć podszablon Twig, a kiedy nie.
Możesz więc użyć specjalnej zmiennej pętli Twig , która jest dostępna wewnątrz pętli Twig for . Ale nie jestem pewien co do zakresu tej zmiennej pętli .
Te i inne informacje są dostępne na Twigs „for” Docu !
źródło
Wziąłem odpowiedź grypy i trochę ją zmodyfikowałem:
źródło
Odpowiedzi tutaj prowadzą mnie do mojego rozwiązania.
Mam jednostkę kategorii z odwołującym się do siebie skojarzeniem wiele do jednego (rodzic do dzieci).
W moim szablonie Twig renderuję widok drzewa w następujący sposób:
źródło