कैसे टहनी में एक पेड़ रेंडर करने के लिए


89

मैं एक पेड़ को एक अनिर्धारित गहराई (बच्चों के बच्चों के बच्चे, आदि) के साथ प्रस्तुत करना चाहता हूं। मुझे आवर्ती के माध्यम से लूप की आवश्यकता है; मैं ट्विग में यह कैसे कर सकता हूं?

जवाबों:


117

मैं 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>

9
बहुत अच्छा धन्यवाद! यदि आप उसी टेम्पलेट में मैक्रो का उपयोग करना चाहते हैं जो आप उपयोग कर सकते हैं {{ _self.menu_links(links) }}
फ्लू

धन्यवाद, इस विचार ने मेरे दिमाग को चोट पहुंचाई लेकिन आपका जवाब सही समझ में आता है।
अज़ीज़81

मेरी टिप्पणी के साथ मेरी परियोजना के साथ एक मुद्दा था। उपकमिशन (सबलिंक) भी मुख्य संग्रह (लिंक) में शामिल थे। इसलिए इससे पहले कि मुझे यह जांचना पड़े कि क्या टिप्पणी में 'अभिभावक' की प्रविष्टि है।
जेवगेनी स्मिरनोव

4
उपयोग करना {{_self.menu_links}}एक बुरा अभ्यास है ! यहां एक नोट पढ़ें: मैक्रो जब आप उस टेम्पलेट में एक मैक्रो को परिभाषित करते हैं जहां आप इसका उपयोग करने जा रहे हैं, तो आपको आयात करने के बजाय मैक्रो को _self.input () के माध्यम से सीधे कॉल करने के लिए लुभाया जा सकता है; यहां तक ​​कि अगर काम करने लगता है, तो यह वर्तमान कार्यान्वयन का केवल एक साइड-इफेक्ट है और यह ट्विग 2.x में अब काम नहीं करेगा। आपको स्थानीय स्तर पर मैक्रोज़ को एक बार फिर से इंसर्ट करना चाहिएmenu_links
dr.scre

35

टहनी 2.0 - 2.11

यदि आप एक ही टेम्प्लेट में एक मैक्रो का उपयोग करना चाहते हैं , तो आपको ट्विग 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

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>

2

यदि आप 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 %}

1
आप अतिरिक्त चर पास नहीं कर सकते subtree। मेरे मामले में, कोड को यह जानना होगा कि क्या अधिक बच्चे होंगे और यह मैक्रो के स्तर की संख्या से गुजरता है इसलिए यह ए कर सकता है <div class="{{ classes[current_level].wrapper }} {% if levels > current_level %}accordion-wrapper{% endif %}">। इसकी गणना करने के लिए वर्तमान स्तर को दूसरी बार पुन: व्यवस्थित करने की आवश्यकता होगी ताकि कोई बच्चे पैदा कर सकें।
chx

1

पहले मुझे लगा कि इसे सीधे तरीके से हल किया जा सकता है, लेकिन यह इतना आसान नहीं है।

आपको तर्क बनाने की आवश्यकता है, शायद एक 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>

तो आप विशेष ट्विग लूप वैरिएबल का उपयोग कर सकते हैं , जो लूप के लिए ट्विग के अंदर उपलब्ध है । लेकिन मैं इस लूप चर के दायरे के बारे में निश्चित नहीं हूं ।

यह और अन्य जानकारी ट्वीग्स पर "दस्तावेज़" के लिए उपलब्ध हैं !



-1

यहाँ उत्तर मेरे समाधान की ओर ले जाते हैं।

मेरे पास स्व-संदर्भित कई-से-एक एसोसिएशन (बच्चों के माता-पिता) के साथ एक श्रेणी इकाई है।

/**
 * @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>

यदि आपके पास श्रेणी पदानुक्रम का एक से अधिक स्तर है तो क्या होगा?
pm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.