`

生成后台管理菜单 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

相关推荐

    vue3使用element-plus搭建后台管理系统---菜单管理

    4. **菜单渲染**:Element-Plus中的Menu组件可以用来创建可折叠、多级的导航菜单,根据获取的数据动态生成菜单结构。 5. **状态管理**:Vuex可以帮助管理全局状态,包括当前选中的菜单、展开的子菜单等。 6. **...

    Magento 自定义后台menu Insert dynamical menu in Magento’s Admin

    Magento的后台菜单主要由` Mage_Adminhtml_Block_Menu`类控制,它通过遍历系统配置中的`adminhtml/menu`节点来生成菜单。每个菜单项都是一个XML节点,例如: ```xml &lt;menu&gt; &lt;custommodule module="Custom_Module...

    menu_admin_per_menu

    标题 "menu_admin_per_menu" 暗示我们正在讨论一个与后台管理系统中菜单权限分配相关的模块或功能。在IT行业中,特别是在开发企业级应用时,菜单管理是系统管理员进行权限控制的重要部分。它允许管理员根据用户角色...

    Laravel开发-adminmenu

    在`adminmenu`项目中,这些核心组件将起到关键作用,如路由定义后台菜单的访问路径,中间件确保只有授权用户可以访问,Eloquent则可能用于处理菜单项的数据库操作。 **二、Eloquent ORM** Eloquent是Laravel的ORM...

    KIT ADMIN 后台管理前端框架

    "KIT ADMIN 后台管理前端框架"是一款专为后端开发者设计的高效、便捷的前端解决方案,旨在简化后台管理系统界面的开发工作,让开发者能够快速构建功能完备且用户体验优秀的管理界面。这款框架集成了多种常见功能和...

    vue_ant-design-vue菜单递归

    本项目主要关注的是Ant Design Vue中的菜单(Menu)组件,特别是如何处理后台返回的无限层级菜单数据进行展示。 在实际的Web应用开发中,尤其是那些拥有复杂权限管理和动态路由的系统,后端服务器通常会返回一个...

    学生成绩管理系统

    10. **登录菜单(login_menu.asp)**:这是用户登录系统的入口,可能包括学生、教师和管理员的不同登录选项,根据角色分配不同权限。 综合来看,【学生成绩管理系统】是一个全面的在线平台,旨在提高教育管理效率,...

    后台框架--AdminLTE-2.3.0(系统菜单从后端动态加载)

    在这个版本中,我们将会探讨如何实现系统菜单的后端动态加载,使得后台管理系统更加灵活和高效。 动态加载系统菜单是一种常见的需求,尤其是在大型项目中,菜单结构可能随着系统的迭代而频繁变化。通过将菜单数据...

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

    在开发Web应用时,尤其是构建管理后台,...通过这种方式,我们可以根据后台返回的数据动态生成符合用户权限的菜单,提高管理后台的灵活性和用户体验。同时,这也展示了Layui框架在构建可定制化管理界面方面的强大能力。

    wordpress添加顶级菜单实现思路

    在WordPress中,添加顶级菜单是自定义主题或插件开发中的常见需求,这使得用户能够更方便地访问和管理特定的功能或设置。...通过这些步骤,你可以根据自己的需求定制出具有丰富功能的后台菜单系统。

    Axure 使用ElementUI组件的 web后台管理

    在本文中,我们将深入探讨如何使用Axure RP 9结合ElementUI组件库来构建一个功能丰富的Web后台管理系统。ElementUI是基于Vue.js的组件库,提供了丰富的UI元素,适用于快速开发高质量的前端界面。而Axure则是一款强大...

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

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

    学生成绩查询管理系统

    `login_menu.asp`很显然是登录菜单或登录界面的代码,用户可以通过这个页面输入凭证来访问系统。 总的来说,这个学生成绩查询管理系统利用ASP作为前端脚本语言,C#作为后端编程语言,构建了一个安全、高效、分角色...

    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; ...

    基于Vue+iView 动态路由权限菜单/多语言/增删改模版/代码生成/消息推送/日志记录/定时任务/第三方账号、短信登录

    基于Vue+iView 动态路由权限菜单/多语言/增删改模版/代码生成/消息推送/日志记录/定时任务/第三方账号、短信登录。项目基于 Vue-Cli 4.x 创建,主要Main组件框架基于iView-admin 1.0版本 修复其部分BUG,UI组件库...

    Laravel开发-laravel-menu

    $menu-&gt;add('后台管理', [ 'route' =&gt; 'voyager.dashboard', 'middleware' =&gt; HasRole::class . ':admin', ])-&gt;icon('fa-dashboard'); } }); ``` 在视图文件中,我们可以使用`render`方法将菜单渲染成HTML: ...

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

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

    Laravel开发-menu

    $menu-&gt;add('管理后台', '/admin'); } ``` ### 7. 自定义菜单构建器 如果你需要更复杂的逻辑来构建菜单,可以创建自定义的菜单构建器。创建一个新的服务提供者并注册到 Laravel,然后在 `boot` 方法中构建菜单: ...

    私服发布站

    8. **admin_msmir_menu.asp**:菜单管理页面,用于设置网站的导航菜单,方便用户快速找到所需内容。 9. **softessay.asp**:可能是一个专门发布游戏评测、心得或者攻略的文章页面。 10. **Jz_msmir_Add.asp**:与...

    简单的php后台模版

    2. **menu.html**:菜单栏,用于导航至后台的不同功能模块。通常会根据用户权限动态生成不同的菜单选项。 3. **header.html**:头部部分,包含网站标志、顶部导航等元素,可以全局引用,保持网站风格一致。 4. **...

Global site tag (gtag.js) - Google Analytics