如何在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“Docu !
如果你运行的是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) }}