我想绘制深度不确定的树(儿童孩子的孩子等)。我需要循环遍历数组;我怎么能在Twig中做到这一点?如何在树枝中渲染树
回答
首先我想,这可能是直截了当的 - 但并不那么容易。
你需要创建一个逻辑,也许用一个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!
谢谢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>
希望它能帮助:)
如果你想使用在宏相同的模板你应该使用这样的事情来保持兼容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
但进口本地。
截至今天,这应该是答案。 –
这里的答案引导我到我的解决方案。
我有一个类别实体与自引用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>
如果您拥有多个级别的层次结构,该怎么办? – PMoubed
如果您正在运行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 %}
拿了流感的答案,修改了一些:
{# 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) }}
- 1. Symfony Form Collection树枝渲染
- 2. 多重渲染控制器树枝
- 3. 如何在Symfony2中将json渲染成树枝
- 4. 渲染Subversion树?
- 5. 如何在树枝
- 6. 如何使用Symfony2 +树枝渲染动态选择
- 7. 在树枝模板中渲染自定义formType选项
- 8. 在symfony2中创建事件以渲染树枝文件
- 9. 树枝与树枝原始
- 10. 如何在HTML + PHP渲染树(笨)
- 11. 如何用树枝
- 12. 如何用树枝
- 13. 如何用树枝
- 14. 从树枝文件中的数据库渲染图像
- 15. 使用渲染集合渲染树
- 16. 树枝内使用树枝翻译里面的树枝
- 17. 在树枝
- 18. 在树枝
- 19. 在树枝
- 20. 在Subversion中用树枝替换树干
- 21. 用木材渲染一个循环(用于Wordpress的树枝)
- 22. 树枝:选择某些块并渲染它们
- 23. Symfony 3防止完整的窗体渲染树枝
- 24. Symfony2的树枝渲染嵌套子目录
- 25. Symfony 3的树枝文件与渲染控制器
- 26. symfony 3表单不能用树枝渲染(控制器('...'))
- 27. Highcharter树形图不在shinydashboard中渲染
- 28. DOM树渲染结果
- 29. 如何在树枝中的JavaScript变量?
- 30. Symfony2中如何呈现在树枝
非常好,谢谢!如果你想在同一个模板中使用宏,你可以使用'{{_self.menu_links(links)}}'。 – flu
谢谢你,这个想法让我的大脑受到伤害,但你的回答很有道理。 – azzy81
我有一个与我的项目与评论问题。子集(子链)也包含在主要集合(链接)中。所以在包含之前,我必须检查评论是否有'父'条目。 –