2011-11-30 123 views

回答

2

首先我想,這可能是直截了當的 - 但並不那麼容易。

你需要創建一個邏輯,也許用一個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> 

所以,你可以使用特殊的twig loop variable,這是可用的樹枝在for循環。但我不確定這個迴路變量的範圍。

對不起,只提供一種解決方案,但也許我希望我的想法可以幫助你(一點點)。

這個和其他信息是可用的Twigs "for" Docu

101

謝謝domi27,我玩了你的想法,並提出了這一點。我做了一個嵌套數組作爲我的樹,['link'] ['sublinks']爲null或更多相同的另一個數組。

模板

子模板文件使用遞歸的:

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

希望它能幫助:)

+8

非常好,謝謝!如果你想在同一個模板中使用宏,你可以使用'{{_self.menu_links(links)}}'。 – flu

+0

謝謝你,這個想法讓我的大腦受到傷害,但你的回答很有道理。 – azzy81

+0

我有一個與我的項目與評論問題。子集(子鏈)也包含在主要集合(鏈接)中。所以在包含之前,我必須檢查評論是否有'父'條目。 –

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

這裏的答案引導我到我的解決方案。

我有一個類別實體與自引用ManyToOne關聯(父對子女)。

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

如果您擁有多個級別的層次結構,該怎麼辦? – PMoubed

2

如果您正在運行PHP 5.4或更高版本,有一個美好的新的解決方案(2016日)至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) }}