如何在Twig中展示无限层级的分类子项?
别担心,Twig其实完全支持递归渲染这种树形结构的数组,只是得用它专门的{% recursive %}标签来实现。我来帮你调整代码解决这个问题:
基础递归渲染方案
直接修改你的循环,加上递归标记并处理子节点:
{% for category in categories recursive %} <div class="category"> <div class="id">{{ category.id }}</div> {# 先判断子节点是否是可遍历的数组,避免处理'none'这类非数组值 #} {% if category.children is iterable and category.children is not empty %} <div class="sub-categories"> {# 调用loop()触发递归,把当前分类的子节点传给循环本身 #} {{ loop(category.children) }} </div> {% endif %} </div> {% endfor %}
补充说明
{% recursive %}是核心:它告诉Twig这个for循环允许递归调用自己,专门用来处理嵌套结构。loop(category.children):这行代码就是触发递归的关键,把当前分类的子节点数组重新传入循环,实现逐层渲染。- 加
is iterable判断:因为你的数组里存在children => 'none'的情况,这个判断能避免Twig尝试遍历非数组类型而报错;is not empty则是防止空数组时没必要渲染子节点容器。
进阶:给不同层级加样式区分
如果需要给不同深度的分类加样式(比如缩进),可以用Twig提供的loop.depth变量,它会记录当前递归的层级:
{% for category in categories recursive %} <div class="category level-{{ loop.depth }}"> <div class="id">{{ category.id }}</div> {% if category.children is iterable and category.children is not empty %} <div class="sub-categories"> {{ loop(category.children) }} </div> {% endif %} </div> {% endfor %}
之后你就可以通过CSS的.level-1、.level-2类来给不同层级的分类设置差异化样式了。
内容的提问来源于stack exchange,提问作者J Maze
相关产品推荐
相关产品推荐

