ProcessWire Repeater字段带有层级数据输出
按照官方的示例:
$depth = -1;
foreach($page->repeater_items as $item) {
if($item->depth > $depth) {
echo "<ul>";
} else if($item->depth < $depth) {
echo "</ul>";
}
echo "<li>$item->title";
$depth = $item->depth;
}
while($depth--) echo "</ul>";会得到一个这样的效果

但是这里我发现有些问题,如果要控制子菜单样式会有很多问题,于是我改良了一下(以bootstrap的菜单为例):
$depth = -1;
if(isset($home->builder->get("type=menu")->links)){
foreach($home->builder->get("type=menu, componentInfo.id=header")->links as $menu) {
$item = $menu->link;
if($menu->depth > $depth) {
$isSub = ($menu->depth > 0) ? ' class="submenu"' : '';
echo "<ul{$isSub}>";
} else if($menu->depth < $depth) {
echo "</ul></li>";
}
//var_dump($page->path . ' = ' . $item->url . ' = ' . $page->parent->path);
$active = ($page->path == $item->url || $page->parent->path == $item->url) ? " active" : "";
if($page !== $home && $item->url == "/"){
$active = "";
}
$class = ($menu->depth == 0) ? " class='{$active}'" : "";
$isParent = (isset($menu->depth) && $menu->depth == 0 && $menu->next->depth == ($menu->depth + 1)) ? true : false; //$item->prev->depth == 0
if($isParent){
echo "<li class='has-dropdown'><a href='{$urlPrefix}{$item->url}'{$class}><span>{$item->name}</span> <i class='bi bi-chevron-down'></i></a>";
}else{
echo "<li><a href='{$urlPrefix}{$item->url}'{$class}>{$item->name}</a></li>";
}
$depth = $menu->depth;
}
echo "</ul>";
}