Я занимаюсь разработкой системы управления контентом, и у меня возникла проблема с отношениями детей и родителей в CMS.
В основном у меня есть система, которая может создавать меню и подменю.А вот как выглядят массивы в базе данных:
array:6 [
0 => array:4 [
"id" => 4
"name" => "Contacts"
"order" => 0
"parent_menu_id" => null
]
1 => array:4 [
"id" => 1
"name" => "Leads"
"order" => 1
"parent_menu_id" => null
]
2 => array:4 [
"id" => 2
"name" => "List Leads"
"slug" => "list-leads"
"order" => 1
"parent_menu_id" => 1
]
3 => array:4 [
"id" => 5
"name" => "Edit Leads"
"slug" => "edit-leads"
"order" => 1
"parent_menu_id" => 1
]
4 => array:4 [
"id" => 3
"name" => "Create New"
"slug" => "new"
"order" => 2
"parent_menu_id" => 2
]
5 => array:4 [
"id" => 14
"name" => "Tasks"
"slug" => "tasks"
"order" => 3
"parent_menu_id" => null
]
]
Я вставляю меню и подменю, используя родительский идентификатор в таблицу меню.Я выбираю меню из базы данных, как указано выше.Итак, как я буду генерировать / отображать меню в иерархической форме, такой как древовидная структура?
Мне нужно перебрать массив, который может иметь любое количество переходов, и разумно отсортировать его по родительским дочерним отношениям.Я смог сделать это, но только на один уровень глубиной.Он должен управлять детьми с детьми с детьми и т. Д. С бесконечным числом слоев и выводить его в раскрывающееся меню HTML и вложенные списки выпадающих элементов.
Я создаю функцию, и она просто показывает родителей и ееребенок, но не показывает детей для любого ребенка.Как мне это исправить?
public static function render_module_menu() {
$menus = MenusModel::leftJoin('modules', 'menus.module_id', '=', 'modules.id')->where('modules.enable', 1)->select('menus.*')->orderBy('order')->get()->toArray();
foreach ($menus as $menu) {
$childMenus = MenusModel::where('parent_menu_id', $menu['id'])->orderBy('order')->get()->toArray();
if ($childMenus) {
echo '<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="pagesDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="'.$menu['icon'].'"></i>
<span>'.$menu['name'].'</span>
</a>
<div class="dropdown-menu" aria-labelledby="pagesDropdown">';
foreach ($childMenus as $child) {
echo '<a class="dropdown-item" href="'.url($menu['slug'].'/'.$child['slug']).'">
<i class="'.$child['icon'].'" style="margin-right: 10px;"></i>
'.$child['name'].'</a>';
}
echo '</div>
</li>';
} else {
echo '<li class="nav-item">
<a class="nav-link" href="'.url($menu['slug']).'">
<i class="'.$menu['icon'].'"></i>
<span>'.$menu['name'].'</span></a>
</li>';
}
}
}