如何在Twig中渲染一棵树

我想渲染一个深度不确定的树(儿童的孩子等)。 我需要循环遍历数组; 我怎么能在小枝做这个?

感谢domi27,我玩了你的想法,并提出了这个问题。 我做了一个嵌套数组作为我的树,['link'] ['sublinks']为null或更多相同的另一个数组。

模板

要recursion的子模板文件:

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

macros可以实现类似的效果:

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

希望能帮助到你 :)

如果你想在同一个模板中使用macros,你应该使用这样的东西来保持与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的提示合并到了关于macros的 dr.scre 文档中,以便现在使用_self但在本地导入。

首先我想,这可能是直接解决 – 但并不那么容易。

你需要创build一个逻辑,也许用一个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> 

所以你可以使用特殊的树枝循环variables ,这是在树枝里面可用的循环 。 但我不确定这个循环variables的范围。

对不起,只提供一种方法不是一个解决scheme,但也许我希望我的想法可以帮助你(一点点)。

这个和其他信息可以在树枝上find“Doc​​u !

如果你运行的是PHP 5.4或更高版本,Alain Tiemblo提供了一个非常棒的新解决scheme(截至2016年5月): 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 %} 

这里的答案引导我到我的解决scheme。

我有一个类别实体自引用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> 

接受了stream感的回答并稍加修改:

 {# 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) }}