`

生成后台管理菜单 admin_menu 类

php 
阅读更多
<?php
/**
 * 管理菜单
 *
 */
class App_Helper_Admin_Menu {
	
	const quuid = 'q';
	const qargs = 'args';
	const qtitle = 'title';
	const qtype = 'type';
	const qparent = 'parent';
	
	/**
	 * 扩展选项,如 style class 等等
	 */
	const qoptions = 'options';
	
	const qchildren = 'children';	
	const qactive = 'active';
	
	/**
	 * 顶级菜单标识
	 */
	const qparent_top = '#ROOT#';
	
	/**
	 * 茎节点
	 */
	const qtype_stem = 'stem';
	
	/**
	 * 叶节点
	 */
	const qtype_leaf = 'leaf';
	
	private function __construct(){
		$this->init();
	}
	
	/**
	 * @return App_Helper_Admin_Menu
	 */
	static function getInstance(){
		static $it = false;
		if (!$it){
			$it = new self();
		}
		return $it;
	}
	
	/**
	 * 返回生成的 菜单
	 * 
	 * @return array
	 */
	private function init(){
		
		$qid = Core_AppUtils::get(Core_Mvc_Router::queryAccessor);
		
		$active = false;
		
		$catalog = $this->aclFilter($this->loadData());	
		
		do {
			$item = Core_AppUtils::val($catalog,$qid,null);
			if (empty($item)) break;
			
			$active = $catalog[$qid][self::qactive] = true;
			if (self::qparent_top == $item[self::qparent]) break;
			
			$qid = $item[self::qparent];
			
		} while(true);
		
		// 转成树
		$catalog = (array) Core_AppUtils::array_to_tree($catalog,self::quuid,self::qparent,self::qchildren);
		
		// 节点过滤,规范 茎叶类型
		$catalog = $this->nodeFilter($catalog);
		
		$this->activeItems = array();
		$this->catalog = $this->locateActiveItem($catalog);
	}
	
	/**
	 * 返回激活的菜单项数组
	 *
	 * @return array
	 */
	function getActiveItems(){
		return $this->activeItems;
	}
	
	/**
	 * 返回生成的菜单数据
	 *
	 * @return array
	 */
	function getCatalog(){
		return $this->catalog;
	}
	
	/**
	 * 生成菜单项
	 *
	 * @param string $quuid
	 * @param array $qargs
	 * @param string $qtitle
	 * @param string $qparent
	 * @param string $qtype
	 * @param array $qoptions
	 * 
	 * @return array
	 */
	static function createItem($quuid ,$qargs ,$qtitle ,$qparent ,$qtype ,$qoptions=null){
		
		$d = array(
			self::quuid => $quuid,
			self::qargs => $qargs,
			self::qtitle => $qtitle,
			self::qparent => $qparent,
			self::qtype => $qtype,
		);
		
		if (!empty($qoptions)) $d[self::qoptions] = (array) $qoptions;
		
		return $d;
	}
	
	private function loadData(){
		
		$catalog = (array) Core_Autoloader::loadFile(APPPATH . '/config/adminmenu.php',false);
		
		return Core_AppUtils::array_to_hashmap($catalog,self::quuid) ;
	}

	private function addActiveItem(array $item){
		if (self::qtype_stem == $item[self::qtype]){
			unset($item[self::qchildren]);
		}
		$this->activeItems[] = $item;
	}
	
	private function locateActiveItem(array $items){
		
		$activeItem = null;
		
		foreach ($items as $offset => $item){
			if (Core_AppUtils::val($item,self::qactive,false)){
				$activeItem = & $items[$offset];
				break;
			}
		}
		if (empty($activeItem)) {
			$activeItem = & $items[0];
			$activeItem[self::qactive] = true;
		}
		$this->addActiveItem($activeItem);
		if (self::qtype_stem == $activeItem[self::qtype]){
			$activeItem[self::qchildren] = $this->locateActiveItem($activeItem[self::qchildren]);
		}
		return $items;
	}
	
	private function nodeFilter(array $items){
		
		if (empty($items)) return $items;
		
		$data = array();
		foreach ($items as $item){
			
			switch ($item[self::qtype]) {
				
				case self::qtype_leaf: 
					unset($item[self::qchildren]);
					break;
					
				case self::qtype_stem:
					if (empty($item[self::qchildren])){
						$item[self::qtype] = self::qtype_leaf;
						unset($item[self::qchildren]);
					}else {
						$item[self::qchildren] = $this->nodeFilter($item[self::qchildren]);
					}
					break;
				
				default:
					$item = null;
			}
			
			if (!empty($items)) $data[] = $item;				
		}
		
		return $data;
	}
	
	private function aclFilter(array $items){
		
		if (empty($items)) return $items;
		
		if (Core_Event::isRegistered(Core_Mvc_EventId::dispatching_aclcheck)){
			$data = array();
			foreach ($items as $uuid => $item){				
				if (App_Convention::canAccess($uuid) ){
					$data[$uuid] = $item;
				}
			}
			return $data;
		}
		
		return $items;		
	}
}
 
分享到:
评论
1 楼 vb2005xu 2012-05-07  
教育部考试中心成绩查询系统
http://chaxun.neea.edu.cn/examcenter/query.cn?op=doQueryCond&sid=280&pram=results

相关推荐

    vue_ant-design-vue菜单递归

    后台返回菜单无限层级展示

    layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)

    本人在做管理后台事用到了左侧的导航列表,但是管理后台进来的菜单是根据不同账户的权限,显示不同的菜单。这时候需要动态的渲染左侧的列表。但是1.0版本只是更新到2级菜单,不满足如下图的3级菜单需求,只能自己...

    ASP.Net电子商务网站后台模板

    &lt;li id="left_tab1" title="操作菜单" onClick="javascript:border_left('left_tab1','left_menu_cnt1');"&gt;人事&lt;/span&gt;&lt;/li&gt; &lt;div id="left_menu_cnt1" class="left_menu_cnt"&gt; &lt;ul id="dleft_tab1"&gt; ...

    yii2-admin:Yii2基础的后台管理

    后台基础的setting配置(支持文本、下拉菜单、日期选择、文件等类型)和menu配置,弹窗小部件等 RBAC简单的权限控制,用户选择角色,角色再包含权限,角色、权限不能自我嵌套,否则想不出好的展示方式 restful api相关...

    ZYCHCMS企业网站管理系统商业版V2012.1212

    2、新增CU3ER官网flash 3D焦点图,可以通过后台上传后设定好属性后台生成XML文件,展示不同的风格 3、新增后台后上传设置背景图片, 4、新增后台设置网站背景颜色 5、新增背景判断,背景为空时则显示默认背景,有...

    Vue iview-admin框架二级菜单改为三级菜单的方法

    最近在用 iview-admin的Vue后台模板,从git上下载后发现左侧导航栏最多支持到二级菜单,也发现很多童鞋在问如何实现三级菜单。在实际的应用场景中还是会出现三级菜单的需求的,木有其他好办法,只能自己手动改代码了...

    yii2-admin:Yii2-admin(RBAC)NOT MODULE

    Yii2开发的后台管理系统 用Yii2.0.0开发的后台管理系统.通过RBAC控制不同用户的菜单显示以及权限。...运行yii migrate导入菜单表t_menu和用户表t_admin_user 运行yii migrate --migrationPath=@yii/rbac/migrati

    关东人企业站通用全站静态程序 v2.0

    本站是利用关东人控件2.0版本,开发而成 1、根目录下的所有静态页都是后台自动生成的,在...8、后台的右边的菜单,在数据库里面c_menu里面可以设置菜单是否显示 更多问题,咨询http://www.guandongren.comQQ:359000335

    JAVA程序开发大全---上半部分

    网上这本书的电子版不好这,这是用money换来的...20.11.7 后台管理模块的业务逻辑处理类CtrlAdmin 393 20.12 项目发布与执行 397 20.13 本章小结 397 第21章 新闻管理系统(Struts+Hibernate) 398 21.1 系统需求分析与...

    信阳热线-门户综合网站.rar

    *********************************************************************************** 默认的管理员用户名是:admin ,密码和验证码都是... 管理员在后台修改,改了后,再点“JS 生成”就好了

    杰奇1.4 破解版+注册机

    b、定制菜单:默认菜单是配置文件配合js生成的,配置文件在 configs/mainmenu.php,js是sctipts/menu.js。用户可以用自己的菜单代码,直接写道theme.html里面,然后后台的系统定义里面选择不使用系统菜单,这样可以...

    杰奇1.4 破解版

    b、定制菜单:默认菜单是配置文件配合js生成的,配置文件在 configs/mainmenu.php,js是sctipts/menu.js。用户可以用自己的菜单代码,直接写道theme.html里面,然后后台的系统定义里面选择不使用系统菜单,这样可以...

    杰奇1.3标准版

    b、定制菜单:默认菜单是配置文件配合js生成的,配置文件在 configs/mainmenu.php,js是sctipts/menu.js。用户可以用自己的菜单代码,直接写道theme.html里面,然后后台的系统定义里面选择不使用系统菜单,这样...

    vue 导航菜单刷新状态不消失,显示对应的路由界面操作

    使用vue element-ui框架构建公共导航栏...1.先确认自己在route.js 或者 main.js 中有没有使用 路由守卫vue.beforeEach和vue.addRouters() 促使页面每次刷新,重新根据后台返回数据生成动态路由,就

    KesionCMS内容管理系统V5.01UTF-8

    36、修复admin/KS.ClassMenu.asp文件错误 生成的菜单重复 37、修复生成静态时相关商品标签出错,无法解释 38、修复前台投稿的文章,审核后文章生成的文件名都变成了id.html. 39、修复友情链接太多时,后台看不到翻页...

    vc++ 应用源码包_1

    自绘MENU 自绘tab 自绘Tree 自绘按钮button源代码 自绘编辑框 自绘窗体界面 自绘对话框 listbox-6 重载CListBox,演示了拖动功能。 Mail_Report 演示了发送邮箱的功能。 MD5算法 MediaPlayer 视频播放的实现。 ...

    vc++ 应用源码包_2

    自绘MENU 自绘tab 自绘Tree 自绘按钮button源代码 自绘编辑框 自绘窗体界面 自绘对话框 listbox-6 重载CListBox,演示了拖动功能。 Mail_Report 演示了发送邮箱的功能。 MD5算法 MediaPlayer 视频播放的实现。 ...

    vc++ 应用源码包_6

    自绘MENU 自绘tab 自绘Tree 自绘按钮button源代码 自绘编辑框 自绘窗体界面 自绘对话框 listbox-6 重载CListBox,演示了拖动功能。 Mail_Report 演示了发送邮箱的功能。 MD5算法 MediaPlayer 视频播放的实现。 ...

    vc++ 应用源码包_3

    自绘MENU 自绘tab 自绘Tree 自绘按钮button源代码 自绘编辑框 自绘窗体界面 自绘对话框 listbox-6 重载CListBox,演示了拖动功能。 Mail_Report 演示了发送邮箱的功能。 MD5算法 MediaPlayer 视频播放的实现。 ...

Global site tag (gtag.js) - Google Analytics