2011-11-30 13 views
83

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

उत्तर

2

सबसे पहले मैंने सोचा, इसे सीधे हल किया जा सकता है - लेकिन यह इतना आसान नहीं है।

आपको एक तर्क बनाने की आवश्यकता है, शायद एक PHP वर्ग विधि के साथ, जब एक twig subtemplate को शामिल किया जाए और कब नहीं।

<!-- 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> 

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

केवल एक दृष्टिकोण प्रदान करने के लिए खेद है, लेकिन शायद मुझे उम्मीद है कि मेरे विचार आपकी मदद कर सकते हैं (थोड़ा सा)।

यह और अन्य जानकारी Twigs "for" Docu पर उपलब्ध हैं!

101

धन्यवाद domi27, मैंने आपके विचार के साथ खेला और इसके साथ आया। मैंने अपने पेड़ के रूप में एक घोंसला वाला सरणी बना दी, ['लिंक'] ['सब्लिंक्स'] शून्य या उससे अधिक की एक और सरणी है।

टेम्पलेट्स

उप टेम्पलेट फ़ाइल के साथ recurse करने:

<ul class="main-menu"> 
    {% include "includes/menu-links.html" with {'links':links} only %} 
</ul> 
:

<!--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 %} 

तो मुख्य टेम्पलेट कॉल इस (थोड़े सामान '' के साथ वहाँ निरर्थक) में

मैक्रोज़

एक समान प्रभाव मैक्रो के साथ प्राप्त किया जा सकता है:

<!--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> 

आशा है कि यह मदद करता है :)

+8

बहुत अच्छा, धन्यवाद! यदि आप उसी टेम्पलेट में मैक्रो का उपयोग करना चाहते हैं तो आप '{{_self.menu_links (लिंक)}}' का उपयोग कर सकते हैं। – flu

+0

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

+0

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

28

आप का उपयोग करने के एक मैक्रो चाहते हैं एक ही टेम्पलेट आपको रहने के लिए इस तरह कुछ उपयोग करना चाहिए Twig 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 को शामिल किया गया 'फैली हुई है twig documentation about macros को रों संकेत अब स्थानीय स्तर पर _self लेकिन आयात का उपयोग करने के लिए।

+0

आज के रूप में, यह जवाब होना चाहिए। –

0

यहां दिए गए उत्तरों मेरे समाधान के लिए नेतृत्व करते हैं।

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

<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> 
+0

क्या होगा यदि आपके पास श्रेणी के पदानुक्रम के एक से अधिक स्तर हैं? – PMoubed

2

आप PHP 5.4 या उच्चतर चला रहे हैं, वहाँ एक अद्भुत नए समाधान है (मई 2016 के रूप में):

/** 
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children") 
*/ 
private $parent; 

/** 
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent") 
*/ 
private $children; 

मेरी टहनी टेम्पलेट में मैं इस तरह ट्री दृश्य प्रतिपादन कर रहा हूँ Alain Tiemblo द्वारा यह समस्या: 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 %} 
0

फ्लू का जवाब लिया और यह एक छोटे संशोधित:

{# 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) }} 
संबंधित मुद्दे