2011-11-30 87 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) }}