131 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace addons\manystore\library;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use addons\manystore\model\ManystoreAuthRule;
							 | 
						||
| 
								 | 
							
								use fast\Tree;
							 | 
						||
| 
								 | 
							
								use think\Exception;
							 | 
						||
| 
								 | 
							
								use think\exception\PDOException;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ManystoreMenu
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 创建菜单
							 | 
						||
| 
								 | 
							
								     * @param array $menu
							 | 
						||
| 
								 | 
							
								     * @param mixed $parent 父类的name或pid
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function create($menu, $parent = 0)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!is_numeric($parent)) {
							 | 
						||
| 
								 | 
							
								            $parentRule = ManystoreAuthRule::getByName($parent);
							 | 
						||
| 
								 | 
							
								            $pid = $parentRule ? $parentRule['id'] : 0;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $pid = $parent;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $allow = array_flip(['file', 'name', 'title', 'icon', 'condition', 'remark', 'ismenu']);
							 | 
						||
| 
								 | 
							
								        foreach ($menu as $k => $v) {
							 | 
						||
| 
								 | 
							
								            $hasChild = isset($v['sublist']) && $v['sublist'] ? true : false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $data = array_intersect_key($v, $allow);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $data['ismenu'] = isset($data['ismenu']) ? $data['ismenu'] : ($hasChild ? 1 : 0);
							 | 
						||
| 
								 | 
							
								            $data['icon'] = isset($data['icon']) ? $data['icon'] : ($hasChild ? 'fa fa-list' : 'fa fa-circle-o');
							 | 
						||
| 
								 | 
							
								            $data['pid'] = $pid;
							 | 
						||
| 
								 | 
							
								            $data['status'] = 'normal';
							 | 
						||
| 
								 | 
							
								            try {
							 | 
						||
| 
								 | 
							
								                $menu = ManystoreAuthRule::create($data);
							 | 
						||
| 
								 | 
							
								                if ($hasChild) {
							 | 
						||
| 
								 | 
							
								                    self::create($v['sublist'], $menu->id);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            } catch (PDOException $e) {
							 | 
						||
| 
								 | 
							
								                throw new Exception($e->getMessage());
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 删除菜单
							 | 
						||
| 
								 | 
							
								     * @param string $name 规则name
							 | 
						||
| 
								 | 
							
								     * @return boolean
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function delete($name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $ids = self::getAuthRuleIdsByName($name);
							 | 
						||
| 
								 | 
							
								        if (!$ids) {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        ManystoreAuthRule::destroy($ids);
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 启用菜单
							 | 
						||
| 
								 | 
							
								     * @param string $name
							 | 
						||
| 
								 | 
							
								     * @return boolean
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function enable($name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $ids = self::getAuthRuleIdsByName($name);
							 | 
						||
| 
								 | 
							
								        if (!$ids) {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        ManystoreAuthRule::where('id', 'in', $ids)->update(['status' => 'normal']);
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 禁用菜单
							 | 
						||
| 
								 | 
							
								     * @param string $name
							 | 
						||
| 
								 | 
							
								     * @return boolean
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function disable($name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $ids = self::getAuthRuleIdsByName($name);
							 | 
						||
| 
								 | 
							
								        if (!$ids) {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        ManystoreAuthRule::where('id', 'in', $ids)->update(['status' => 'hidden']);
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 导出指定名称的菜单规则
							 | 
						||
| 
								 | 
							
								     * @param string $name
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function export($name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $ids = self::getAuthRuleIdsByName($name);
							 | 
						||
| 
								 | 
							
								        if (!$ids) {
							 | 
						||
| 
								 | 
							
								            return [];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $menuList = [];
							 | 
						||
| 
								 | 
							
								        $menu = ManystoreAuthRule::getByName($name);
							 | 
						||
| 
								 | 
							
								        if ($menu) {
							 | 
						||
| 
								 | 
							
								            $ruleList = collection(ManystoreAuthRule::where('id', 'in', $ids)->select())->toArray();
							 | 
						||
| 
								 | 
							
								            $menuList = Tree::instance()->init($ruleList)->getTreeArray($menu['id']);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $menuList;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 根据名称获取规则IDS
							 | 
						||
| 
								 | 
							
								     * @param string $name
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function getAuthRuleIdsByName($name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $ids = [];
							 | 
						||
| 
								 | 
							
								        $menu = ManystoreAuthRule::getByName($name);
							 | 
						||
| 
								 | 
							
								        if ($menu) {
							 | 
						||
| 
								 | 
							
								            // 必须将结果集转换为数组
							 | 
						||
| 
								 | 
							
								            $ruleList = collection(ManystoreAuthRule::order('weigh', 'desc')->field('id,pid,name')->select())->toArray();
							 | 
						||
| 
								 | 
							
								            // 构造菜单数据
							 | 
						||
| 
								 | 
							
								            $ids = Tree::instance()->init($ruleList)->getChildrenIds($menu['id'], true);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $ids;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |