Laravel - 菜单列表视图

菜单列表视图-start

  • 获取菜单列表方法改进
    上一篇文章中,我们在仓库中编写了获取菜单并按照降序排列的数组。下面我们来完善一下这个方法,使其这个方法更加好用。
    打开 app\Repositories\Eloquent\MenuRepository.php ,进行编写。

    <?php 
    namespace App\Repositories\Eloquent;
    
    use App\Repositories\Eloquent\Repository;
    use App\Models\Menu;
    use Cache;
    /**
    * 菜单仓库
    */
    class MenuRepository extends Repository
    {
            public function model()
            {
                return Menu::class;
            }
    
            /*
            * 递归调用菜单数据
            */
            public function sortMenu($menus,$pid=0)
            {
                $arr = [];
                if (empty($menus)) {
                    return '';
                }
    
                foreach ($menus as $key => $value) {
                    if ($value['parent_id'] == $pid) {
                        $arr[$key] = $value;
                        $arr[$key]['child'] = self::sortMenu($menus,$value['id']);
                    }
                }
                return $arr;
            }
    
            /*
            * 排序子菜单并缓存
            * ---------------------------------
            * array_column($array,$name)
            * $array => 要查询的数组
            * $name  => 在数组中要返回的字段值
            *----------------------------------
            * array_multisort($array1,$rule,$array2)
            * $array1 => 规定数组(规定以这个数组来排序)
            * $rule   => 规定排列顺序。
            * 可能的值:
            *   SORT_ASC - 默认。按升序排列 (A-Z)。
            *   SORT_DESC - 按降序排列 (Z-A)。
            * $array2 => 要规定的数组。(要排序的数组)
            */
            public function sortMenuSetCache()
            {
                $menus = $this->model->orderBy('sort','desc')->get()->toArray();
                if ($menus) {
                    $menuList = $this->sortMenu($menus);
                    foreach ($menuList as $key => $value) {
                        if ($value['child']) {
                            $sort = array_column($value['child'], 'sort');
                            array_multisort($sort,SORT_DESC,$value['child']);
                        }
                    }
                    return $menuList;
                }
                return '';
            }
    
        /*
        * 获取菜单数据
        */
        public function getMenuList()
        {
            return $this->sortMenuSetCache();
        }
  • 菜单列表视图展示(Presenter):
    最大限度的复用方法,在app\Repositories\Presenter\MenuPresenter.php 文件下面编写前台展示代码的方法:

    //菜单列表视图
    public function getMenuList($menus){
            if ($menus){
                $item = '';
                foreach ($menus as $v){
                        $item .= $this->getNetableItem($v['id'],$v['name'],$v['child']);
                }
                return $item;
            }
            return '暂无菜单';
    }
    
    //返回菜单 HTML代码
    public function  getNetableItem($id,$name,$child){
            if ($child){
                    return $this->getHandleList($id,$name,$child);
            }
            return '<li class="dd-item dd3-item" data-id="'.$id.'"><div class="dd-handle dd3-handle"> </div><div class="dd3-content"> '.$name.' </div> </li>';
    }
    
    //判断是否有子集
    public function getHandleList($id,$name,$child){
            $handle = '<li class="dd-item dd3-item" data-id="'.$id.'"><div class="dd-handle dd3-handle"> </div><div class="dd3-content"> '.$name.' </div><ol class="dd-list">';
    
            foreach ($child as $v){
                    $handle .= $this->getNetableItem($v['id'],$v['name'],$v['child']);
            }
            $handle .= '</ol></li>';
    
            return $handle;
    }

    然后从前台相应的位置调用方法即可。
    首先要在前台引入此文件,代码如下:

    @inject('menus','App\Repositories\Presenter\MenuPresenter')

    然后再从指定位置调用方法,以达到实现页面的目的,代码如下:

    {!! $menus->getMenuList($menu) !!}

菜单列表视图-end

本作品采用《CC 协议》,转载必须注明作者和本文链接
老郭博客:laughing: 个人博客地址:www.phpsix.com
PHPSIX
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!