该数据库有一个嵌套集数据结构和一个使用 yii2/ 的项目,您需要将此结构显示为嵌套Collapse。
结果应如下所示:
-*spoiler*
--*spoiler*
--*spoiler*
----*spoiler*
-*spoiler*
--*spoiler*
----*spoiler*
-*spoiler*
-*spoiler*
-*spoiler*
-*spoiler*
-*spoiler*
-*spoiler*
-*spoiler*
--*spoiler*
-*spoiler*
添加扰流板如下。这是一个 yii2 小部件,它返回扰流板的布局,已经应用了样式并放置id了将执行 js-fold-expand 的样式:
private static function createCollapse($label, $content)
{
return Collapse::widget(
[
'items' => [
[
//В таблице поле LABEL
'label' => $label,
//В качестве контента ID записи
'content' => $content
]
]
]
);
}
布局看起来像这样:
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title"><a class="collapse-toggle collapsed" href="#w7-collapse7" data-toggle="collapse" data-parent="#w7" aria-expanded="false">Main Spoiler</a></h4>
</div>
<div id="w7-collapse7" class="panel-collapse collapse" aria-expanded="false" style="height: 0px;">
<div class="panel-body">
<div id="w6" class="panel-group collapse in" aria-expanded="true" style="">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title"><a class="collapse-toggle collapsed" href="#w6-collapse1" data-toggle="collapse" data-parent="#w6" aria-expanded="false">Sub spoiler</a></h4>
</div>
<div id="w6-collapse1" class="panel-collapse collapse" aria-expanded="false" style="height: 0px;">
<div class="panel-body">
content
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title"><a class="collapse-toggle collapsed" href="#w6-collapse2" data-toggle="collapse" data-parent="#w6" aria-expanded="false">Sub Spoiler</a></h4>
</div>
<div id="w6-collapse2" class="panel-collapse collapse" aria-expanded="false" style="height: 0px;">
<div class="panel-body">
content
</div>
</div>
</div>
</div>
</div>
</div>
</div>
据我了解,简单地从根目录遍历所有子项是行不通的,因为每个顶级扰流器小部件都必须已经知道它的内容,而这些内容又可以包含无限数量的相同扰流器小部件,依此类推。 .
一种解决方案是在一次查询中获取按 RGT 排序的表,并检查当前 LVL 的 3 种情况 - 大于\小于\等于 -使用<ul><li>. 但是我不能以任何方式调整这个例子来使用一个小部件:(
第二个选项,正如@fedornabilkin 所建议的那样,但nested sets不要自行存储parent id,而且再次包装有困难Collapse::widget
我会很高兴有任何帮助!

我认为有必要通过一个请求接收所有数据。然后准备一个多维数组,在其中分解每个父级的子级。
然后将这个数组放入递归方法中。像这样以树的形式构建列表。
在视图中我们调用方法
echo className::createTree($cats, 1);UPD
为清楚起见,您可以运行示例代码:
因此,在稍微处理了递归
nested sets之后,编写了以下解决方案:我们使用数据库中的一个查询来绘制树:
SELECT * FROM table WHERE ROOT = $root ORDER BY lft
接下来,让我们创建辅助函数来搜索后代并通过以下方式过滤树
LVL:渲染折叠的方法,其实是为了减少代码:
递归函数本身将如下所示:
用法:
需要将两个数组传递给函数,这看起来有点奇怪。这样做是为了在第一次调用该函数时,只为根元素绘制扰流板。如果将整棵树传递给函数,则渲染函数通常会针对树的每个节点执行。在这种情况下,在输出中,我们将获得与树中元素一样多的扰流器,而且每个具有后代的元素也将包含嵌套的扰流器。也许这个问题可以用更简洁的方式避免,但不幸的是,我找不到它。如果有人告诉我,我会很高兴。
唯一让我对这个解决方案感到困惑的是堆栈溢出问题。在堆栈溢出之前嵌套必须有多大?