Links.php 6.3 KB
<?php

namespace App\Admin\Extensions\Nav;

use Illuminate\Support\Arr;

class Links
{
    public function __toString()
    {
        //  获取登录用户的未读消息
        $user = \Admin::user();
        $role = $user->role;
        // 获取用户的菜单
        $menus  = null;// session('menus');
        if (!$menus) {
            $menus = \Admin::menu();
        }

        // 获取一级菜单
        $list = [];
        // 获取当前请求的完整的路径
        $path =  request()->getUri();
        // 获取相对路径
        $path = str_replace(config('app.url').config('admin.route.prefix'), '', $path);
        // 获取该菜单信息
        $menuModel = config('admin.database.menu_model');
        $model = new $menuModel();
        $menu = $model->where('uri', $path)->where('parent_id', '>', 0)->first();
        $p_menu = null;
        if ($menu) {
            $p_menu = $model->find($menu->parent_id);
//            dd($p_menu);
//            $p_menu = $model->parentMenu;
//            dd($p_menu);
            if ($p_menu && $p_menu->pid > 0) {
                $p_menu = $model->find($p_menu->parent_id);
            }
        }

        // 获取当前的路径
        $cur_url =  request()->url();
        // 只显示当前模块的
        $arr = explode('/'.config('admin.route.prefix'), $cur_url) ;
        $moudle = '/'. Arr::first(array_filter(explode('/', Arr::get($arr, 1))));
//

//        // 根据当前的 路径获取 父类
//        $menuModel = config('admin.database.menu_model');
//        $model = new $menuModel();
////        // 获取一级菜单
////        $firsts = $model->where('parent_id', 0)->where('visible', 1)->with(['roles'])->get(/*['id','order','title','icon','uri','permission']*/);
////        dump($firsts->toArray());
//        // 根据当前的 路径获取 父类
//        $p_menu = $model->where('uri', $moudle)->first();

        $pid        = 0;
        $ptitle     ='首页';
        $picon = 'fa-home';
        if ($p_menu) {
            $pid = $p_menu->id;
            $ptitle     = $p_menu->title;
            $picon     = $p_menu->icon;
//            $parentMenu = $p_menu->parentMenu;
//            if ($parentMenu) {
//                $pid = $parentMenu->parent_id;
//            }
        }

        // 获取子菜单
        foreach ($menus as $key => &$menu) {
            $active = '';
            // 判断根路径
            if ($menu['parent_id'] == 0 && $menu['visible'] == 1) {
                if ((!$menu['uri'] && $moudle =='/') || ($menu['uri'] ==  $moudle)) {
                    $active = 'active';
                    $pid = $menu['id'];
                }
                $menu['active'] = $active;
                $list[] = $menu;
            }

            // 如果未获取到选中状态
            if ($active == '') {
                // 判断子路径
                $children = Arr::get($menu, 'children');
                if ($children) {
                    foreach ($children as $child) {
                        if ($child['uri'] == $moudle) {
                            // dump($child);
                            $active = 'active';
                            $pid = $menu['id'];
                            break;
                        }
                    }
                }

            }

            // 如果未获取到选中状态
            if ($active == '') {
                // 需要循环子类
                if ($menu['uri'] ==  $moudle) {
                    if ($list) {
                        foreach ($list as &$vo) {
                            if ($vo['id'] == $menu['parent_id']) {
                                $pid = $menu['parent_id'];
                                $active = 'active';
                                $vo['active'] = 'active';
                            }
                        }
                    }
                }
            }
        }
        //dd($moudle);
        $menu_child = [];
        unset($menu);

        foreach ($menus as $key => $menu) {
//            if($menu['id'] == 68){
//                dd($menu);
//            }
            if ($menu['parent_id'] === $pid && $menu['visible'] == 1) {
                $menu_child[] = $menu;
            }
        }
        if ($menu_child) {
            // 组合子菜单
            foreach ($menu_child as &$v1) {
                $children = [];
                foreach ($menus as $key => $v2) {
                    if ($v2['parent_id'] === $v1['id'] && $v2['visible'] == 1) {
                        $children[] = $v2;
                    }
                }
                $v1['children'] = $children;
            }
            $menu_child = json_encode($menu_child);
            unset($menu);
            foreach ($list as &$vo) {
                foreach ($menus as $menu) {
                    if ($menu['parent_id'] === $vo['id'] && $menu['order'] == 1) {
                        $vo['uri'] = $menu['uri'];
                    }
                }
                if ($vo['id'] == $pid) {
                    $vo['active'] = 'active';
                }
            }
        }
        foreach ($menus as &$menu) {
            $children = Arr::get($menu, 'children');
            if ($children) {
                $menu['children'] = array_values($children);
            }
        }

        $menus_json = json_encode(array_values($menus));
       // dd($list);
        $view = /*config('admin.route.prefix').*/'admin.links';
        return view($view, compact('list', 'pid', 'ptitle', 'picon', 'menus', 'menu_child', 'menus_json', 'role'))->render();
    }

    /**
     * @param $menus
     * @param $user_role
     * @return mixed
     */
    public function cleanUpMenu ($menus, $user_role)
    {
        // 将不是我的权限的菜单全部去掉
        if ($menus) {
            foreach ($menus as $k_m => &$menu) {
                $roles = Arr::get($menu, 'roles');
                $roles = collect($roles);
                $slugs = $roles->pluck('slug');
                if (!in_array($user_role, $slugs->all())) {
                    unset($menus[$k_m]);
                } else {
                    // 获取子类
                    $children = Arr::get($menu, 'children');
                    $children = $this->cleanUpMenu ($children, $user_role);
                    $menu['children'] = $children;
                }
            }
        }

        return $menus;
    }
}