[英]Create parent child admin menu tree using database in laravel
我正在開發一個內容管理系統,但我遇到了 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
]
]
我在菜單表中使用父 ID 插入菜單和子菜單。 我正在從 db 獲取菜單,如上所述。 那么,我將如何以樹狀結構等分層形式生成/呈現菜單?
我需要遍歷一個可以有任意數量導航的數組,並智能地將其分類到其父子關系中。 我能夠做到,但只有一層深度。 它需要用無限數量的層管理帶有孩子的孩子等等,並將其輸出到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>';
}
}
}
第一個功能:
public static function GenerateMenuArray($arr, $parent = 0)
{
$pages = Array();
foreach($arr as $page)
{
if($page['parent_menu_id'] == $parent)
{
$page['sub'] = isset($page['sub']) ? $page['sub'] : self::GenerateMenuArray($arr, $page['id']);
$pages[] = $page;
}
}
return $pages;
}
第二個功能:
// loop the multidimensional array recursively to generate the HTML
public static function GenerateMenuHTML($nav, $level=0)
{
$menus = MenusModel::leftJoin('modules', 'menus.module_id', '=', 'modules.id')->select('menus.*')->where('modules.enable', 1)->where('parent_menu_id', null)->orderBy('order')->get()->toArray();
$html = '';
foreach($nav as $page)
{
// dd($page);
if (empty($page['sub'])) {
if ($page['parent_menu_id'] == null) {
$html .= '<li class="nav-item">
<a class="nav-link" href="'.url($page['slug']).'">
<i class="'.$page['icon'].'"></i>
<span>'.$page['name'].'</span></a>
</li>';
} else {
foreach ($menus as $parent) {
$parent_slug = $parent['slug'];
if($parent['id'] == $page['parent_menu_id'] AND $page['external'] == 0) {
$html .= '<a class="dropdown-item" href="'.url($parent_slug.'/'.$page['slug']).'">
<i class="'.$page['icon'].'" style="margin-right: 10px;"></i>
'.$page['name'].'</a>';
}
}
if ($page['external'] == 1) {
$html .= '<a class="dropdown-item" href="'.url($page['slug']).'">
<i class="'.$page['icon'].'" style="margin-right: 10px;"></i>
'.$page['name'].'</a>';
}
}
} else {
if ($level > 0) {
$html .= '</div></li>';
}
$html .= '<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="'.$page['icon'].'"></i>
<span>'.$page['name'].'</span></a>
<div class="dropdown-menu" aria-labelledby="pagesDropdown">';
$level = ++$level;
$html .= self::GenerateMenuHTML($page['sub'], $level);
$level = --$level;
if ($level > 0) {
$html .= '</div></li>';
}
}
}
return $html;
}
// loop the multidimensional array recursively to generate the HTML
public static function GenerateNavHTML($nav)
{
$html = '';
foreach($nav as $page)
{
$html .= '<ul><li>';
$html .= '<a href="' . $page['slug'] . '">' . $page['name'] . '</a>';
$html .= self::GenerateNavHTML($page['sub']);
$html .= '</li></ul>';
}
return $html;
}
請試試這個。
您只是在循環菜單及其直接子項。
這里最好的解決方案是創建一個打印子項的函數,然后在其內部調用該函數,這樣只要當前菜單項有子項,它就會一直被調用。
function printChildren($children){
foreach($children as $child){
//(add code to print menu item)
$moreChildren = //(add code to find children of this menu item)
printChildren($moreChildren);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.