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