<?php namespace common\models; use Yii; use common\helpers\ArrayHelper; class Menu extends \common\modelsgii\Menu { const BASE_KEY = 'cache_menu_'; /** * 配置model规则 */ public function rules() { return [ [['title','url'],'required'], [['pid', 'sort', 'hide', 'status'], 'integer'], [['title', 'group', 'icon'], 'string', 'max' => 50], [['url'], 'string', 'max' => 255] ]; } /** * [栏目权限检测] * @author libingke * @param string $rule 检测的规则 * @return bool */ public static function checkRule($rule) { /* 超级管理员允许访问任何页面 */ if(Yii::$app->params['admin'] == Yii::$app->user->id){ return true; } /* rbac */ if (!\Yii::$app->user->can($rule)) return false; return true; } public static function getPermissions() { $authManager = Yii::$app->authManager; $user = Yii::$app->user; if (Yii::$app->params['admin'] == $user->id) { $can_permissions = $authManager->getPermissions(); }else{ $can_permissions = $authManager->getPermissionsByUser($user->id); } $can_permission_keys = array_keys($can_permissions); return $can_permission_keys; } /** * [获取导航缓存] * @author: libingke */ public static function getBreadcrumbs() { $uid = 'base'; $key = static::BASE_KEY . $uid; $cache = Yii::$app->cache; $data = $cache->get($key); $data = false; if ($data === false) { $all = static::find() ->where(['hide' => static::HIDE_NO, 'status' => static::STATUS_SHOW]) ->orderBy('pid ASC,sort ASC')->asArray()->all(); $can_permission_keys = self::getPermissions(); $data = static::menuTree($all, 0, $can_permission_keys); $cache->set($key, $data); } return $data; } /** * [刷新数据] * @author: libingke * @param null $uid */ public static function flushMenu($uid = null) { $key = $uid == null ? $key = static::BASE_KEY . 'base' : static::BASE_KEY . $uid; Yii::$app->cache->delete($key); } /** * [导航树] * @author: libingke * @param $all * @param $pid * @return array */ public static function menuTree($all, $pid, &$can_permission_keys) { $tree = []; foreach ($all as $v) { if (!in_array($v['url'], $can_permission_keys)) { continue; } if ($v['pid'] == $pid) { $notes = static::menuTree($all, $v['id'], $can_permission_keys); $temp = []; $temp['id'] = $v['id']; $temp['label'] = $v['title']; if ($pid == 0) { $temp['url'] = $notes ? 'javascript:;' : \yii\helpers\Url::toRoute($v['url']); $temp['icon'] = ''; } else { $temp['url'] = \yii\helpers\Url::toRoute($v['url']); $temp['icon'] = $v['icon']; } //子节点 $notes ? $temp['notes'] = $notes : null; $tree[] = $temp; } } return $tree; } /** * --------------------------------------- * 根据menu库,返回权限节点,或后台菜单 * @param boolean $tree 是否返回多维数组结构(生成菜单时用到),为false返回一维数组(生成权限节点时用到) * @return array * --------------------------------------- */ public static function returnNodes($tree = true){ /* 如果已经生成,直接调用 */ static $tree_nodes = array(); if ( $tree && !empty($tree_nodes[(int)$tree]) ) { return $tree_nodes[$tree]; } /* 生成节点 */ if((int)$tree){ $list = (new \yii\db\Query()) ->select(['id','pid','title','url','hide']) ->from(Menu::tableName()) ->orderBy(['sort'=>SORT_ASC])->all(); $can_permission_keys = self::getPermissions(); foreach ($list as $key => $value) { if (!in_array($value['url'], $can_permission_keys)) { unset($list[$key]); } } $nodes = ArrayHelper::list_to_tree($list, $pk='id', $pid='pid', $child='child', $root=0); }else{ $nodes = (new \yii\db\Query()) ->select(['title','url','tip','pid']) ->from(Menu::tableName()) ->orderBy(['sort'=>SORT_ASC])->all(); foreach ($nodes as $key => $value) { if (!in_array($value['url'], $can_permission_keys)) { unset($nodes[$key]); } } } /* 节点赋值到静态变量中,以供下次调用 */ $tree_nodes[(int)$tree] = $nodes; return $nodes; } /** * --------------------------------------- * 递归获取其所有父栏目 * @param $id * @return array * --------------------------------------- */ public static function getParentMenus($id){ $path = []; $nav = static::find()->select(['id','pid','title', 'url'])->where(['id'=>$id])->asArray()->one(); $path[] = $nav; if($nav['pid'] > 0){ $path = array_merge(static::getParentMenus($nav['pid']),$path); } return $path; } }