मैं एक पेड़ को एक अनिर्धारित गहराई (बच्चों के बच्चों के बच्चे, आदि) के साथ प्रस्तुत करना चाहता हूं। मुझे आवर्ती के माध्यम से लूप की आवश्यकता है; मैं ट्विग में यह कैसे कर सकता हूं?
जवाबों:
मैं domi27 के विचार के साथ खेलता रहा और इसके साथ आया। मैंने अपने पेड़ के रूप में एक नेस्टेड सरणी बनाई, ['लिंक'] [inks सबलिंक्स ’] शून्य या उसी के अधिक का एक और सरणी।
टेम्पलेट्स
के साथ पुनरावृत्ति करने के लिए उप-टेम्पलेट फ़ाइल:
<!--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 %}
फिर मुख्य टेम्प्लेट में, इसे ('सामान के साथ बेमानी' कहें):
<ul class="main-menu">
{% include "includes/menu-links.html" with {'links':links} only %}
</ul>
मैक्रो
मैक्रो के साथ एक समान प्रभाव प्राप्त किया जा सकता है:
<!--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 %}
मुख्य टेम्पलेट में, यह करें:
{% import "macros/menu-macros.html" as macros %}
<ul class="main-menu">
{{ macros.menu_links(links) }}
</ul>
{{_self.menu_links}}
एक बुरा अभ्यास है ! यहां एक नोट पढ़ें: मैक्रो जब आप उस टेम्पलेट में एक मैक्रो को परिभाषित करते हैं जहां आप इसका उपयोग करने जा रहे हैं, तो आपको आयात करने के बजाय मैक्रो को _self.input () के माध्यम से सीधे कॉल करने के लिए लुभाया जा सकता है; यहां तक कि अगर काम करने लगता है, तो यह वर्तमान कार्यान्वयन का केवल एक साइड-इफेक्ट है और यह ट्विग 2.x में अब काम नहीं करेगा। आपको स्थानीय स्तर पर मैक्रोज़ को एक बार फिर से इंसर्ट करना चाहिएmenu_links
यदि आप एक ही टेम्प्लेट में एक मैक्रो का उपयोग करना चाहते हैं , तो आपको ट्विग 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>
इसका विस्तार होता है random-coder
का और मैक्रो के बारेdr.scre
में ट्विग प्रलेखन के संकेत को शामिल करता है जो अब उपयोग करने के लिए है _self
, लेकिन स्थानीय रूप से आयात करता है।
2.11 टहनी के रूप में , आप इसे छोड़ सकते हैं {% import _self as macros %}
, क्योंकि अंतर्निहित मैक्रोज़ स्वचालित रूप से _self
नेमस्पेस के तहत आयात किए जाते हैं (देखें ट्विग घोषणा: स्वचालित मैक्रो आयात ):
{# {% import _self as macros %} - Can be removed #}
<ul class="main-menu">
{{ _self.menu_links(links) }} {# Use _self for inlined macros #}
</ul>
यदि आप PHP 5.4 या उच्चतर चला रहे हैं, तो Alain Tiemblo द्वारा इस समस्या का एक अद्भुत नया समाधान (मई 2016 तक) है: https://github.com/ninsuo/jordan-tree ।
यह एक "ट्री" टैग है जो इस सटीक उद्देश्य को पूरा करता है। मार्कअप इस तरह दिखेगा:
{% tree link in links %}
{% if treeloop.first %}<ul>{% endif %}
<li>
<a href="{{ link.href }}">{{ link.name }}</a>
{% subtree link.sublinks %}
</li>
{% if treeloop.last %}</ul>{% endif %}
{% endtree %}
subtree
। मेरे मामले में, कोड को यह जानना होगा कि क्या अधिक बच्चे होंगे और यह मैक्रो के स्तर की संख्या से गुजरता है इसलिए यह ए कर सकता है <div class="{{ classes[current_level].wrapper }} {% if levels > current_level %}accordion-wrapper{% endif %}">
। इसकी गणना करने के लिए वर्तमान स्तर को दूसरी बार पुन: व्यवस्थित करने की आवश्यकता होगी ताकि कोई बच्चे पैदा कर सकें।
पहले मुझे लगा कि इसे सीधे तरीके से हल किया जा सकता है, लेकिन यह इतना आसान नहीं है।
आपको तर्क बनाने की आवश्यकता है, शायद एक PHP वर्ग विधि के साथ, जब एक टिगोर सबटमप्लेट शामिल करना है और जब नहीं।
<!-- 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>
तो आप विशेष ट्विग लूप वैरिएबल का उपयोग कर सकते हैं , जो लूप के लिए ट्विग के अंदर उपलब्ध है । लेकिन मैं इस लूप चर के दायरे के बारे में निश्चित नहीं हूं ।
यह और अन्य जानकारी ट्वीग्स पर "दस्तावेज़" के लिए उपलब्ध हैं !
फ्लू का जवाब लिया और इसे थोड़ा संशोधित किया:
{# Macro #}
{% macro tree(items) %}
{% import _self as m %}
{% if items %}
<ul>
{% for i in items %}
<li>
<a href="{{ i.url }}">{{ i.title }}</a>
{{ m.tree(i.items) }}
</li>
{% endfor %}
</ul>
{% endif %}
{% endmacro %}
{# Usage #}
{% import 'macros.twig' as m %}
{{ m.tree(items) }}
यहाँ उत्तर मेरे समाधान की ओर ले जाते हैं।
मेरे पास स्व-संदर्भित कई-से-एक एसोसिएशन (बच्चों के माता-पिता) के साथ एक श्रेणी इकाई है।
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
*/
private $children;
अपने टहनी टेम्पलेट में मैं इस तरह से पेड़ के दृश्य का प्रतिपादन कर रहा हूं:
<ul>
{% for category in categories %}
{% if category.parent == null %}
<li>
<a href="{{ category.id }}">{{ category.name }}</a>
{% if category.children|length > 0 %}
<ul>
{% for category in category.children %}
<li>
<a href="{{ category.id }}">{{ category.name }}</a>
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endif %}
{% endfor %}
</ul>
{{ _self.menu_links(links) }}
।