1 <?php
2
3 /**
4 * Menu(菜单管理)
5 */
6 namespace Admin\Controller;
7 use Common\Controller\AdminbaseController;
8 class MenuController extends AdminbaseController {
9
10 protected $menu_model;
11 protected $auth_rule_model;
12
13 function _initialize() {
14 parent::_initialize();
15 $this->menu_model = D("Common/Menu");
16 $this->auth_rule_model = D("Common/AuthRule");
17 }
18
19 /**
20 * 显示菜单
21 */
22 public function index() {
23 $_SESSION['admin_menu_index']="Menu/index";
24 $result = $this->menu_model->order(array("listorder" => "ASC"))->select();
25 import("Tree");
26 $tree = new \Tree();
27 $tree->icon = array('&nbsp;&nbsp;&nbsp;│ ', '&nbsp;&nbsp;&nbsp;├─ ', '&nbsp;&nbsp;&nbsp;└─ ');
28 $tree->nbsp = '&nbsp;&nbsp;&nbsp;';
29
30 $newmenus=array();
31 foreach ($result as $m){
32 $newmenus[$m['id']]=$m;
33
34 }
35 foreach ($result as $n=> $r) {
36
37 $result[$n]['level'] = $this->_get_level($r['id'], $newmenus);
38 $result[$n]['parentid_node'] = ($r['parentid']) ? ' class="child-of-node-' . $r['parentid'] . '"' : '';
39
40 $result[$n]['str_manage'] = '<a href="' . U("Menu/add", array("parentid" => $r['id'], "menuid" => $_GET['menuid'])) . '">添加子菜单</a> | <a target="_blank" href="' . U("Menu/edit", array("id" => $r['id'], "menuid" => $_GET['menuid'])) . '">修改</a> | <a class="J_ajax_del" href="' . U("Menu/delete", array("id" => $r['id'], "menuid" => I("get.menuid")) ). '">删除</a> ';
41 $result[$n]['status'] = $r['status'] ? "显示" : "隐藏";
42 if(APP_DEBUG){
43 $result[$n]['app']=$r['app']."/".$r['model']."/".$r['action'];
44 }
45 }
46
47 $tree->init($result);
48 $str = "<tr id='node-\$id' \$parentid_node>
49 <td style='padding-left:20px;'><input name='listorders[\$id]' type='text' size='3' value='\$listorder' class='input input-order'></td>
50 <td>\$id</td>
51 <td>\$app</td>
52 <td>\$spacer\$name</td>
53 <td>\$status</td>
54 <td>\$str_manage</td>
55 </tr>";
56 $categorys = $tree->get_tree(0, $str);
57 $this->assign("categorys", $categorys);
58 $this->display();
59 }
60
61 /**
62 * 获取菜单深度
63 * @param $id
64 * @param $array
65 * @param $i
66 */
67 protected function _get_level($id, $array = array(), $i = 0) {
68
69 if ($array[$id]['parentid']==0 || empty($array[$array[$id]['parentid']]) || $array[$id]['parentid']==$id){
70 return $i;
71 }else{
72 $i++;
73 return $this->_get_level($array[$id]['parentid'],$array,$i);
74 }
75
76 }
77
78 public function lists(){
79 $_SESSION['admin_menu_index']="Menu/lists";
80 $result = $this->menu_model->order(array("app" => "ASC","model" => "ASC","action" => "ASC"))->select();
81 $this->assign("menus",$result);
82 $this->display();
83 }
84
85 /**
86 * 添加
87 */
88 public function add() {
89 import("Tree");
90 $tree = new \Tree();
91 $parentid = intval(I("get.parentid"));
92 $result = $this->menu_model->order(array("listorder" => "ASC"))->select();
93 foreach ($result as $r) {
94 $r['selected'] = $r['id'] == $parentid ? 'selected' : '';
95 $array[] = $r;
96 }
97 $str = "<option value='\$id' \$selected>\$spacer \$name</option>";
98 $tree->init($array);
99 $select_categorys = $tree->get_tree(0, $str);
100 $this->assign("select_categorys", $select_categorys);
101 $this->display();
102 }
103
104 /**
105 * 添加
106 */
107 public function add_post() {
108 if (IS_POST) {
109 if ($this->menu_model->create()) {
110 if ($this->menu_model->add()!==false) {
111 $app=I("post.app");
112 $model=I("post.model");
113 $action=I("post.action");
114 $name=strtolower("$app/$model/$action");
115 $menu_name=I("post.name");
116 $mwhere=array("name"=>$name);
117
118 $find_rule=$this->auth_rule_model->where($mwhere)->find();
119 if(!$find_rule){
120 $this->auth_rule_model->add(array("name"=>$name,"module"=>$app,"type"=>"admin_url","title"=>$menu_name));//type 1-admin rule;2-user rule
121 }
122 $to=empty($_SESSION['admin_menu_index'])?"Menu/index":$_SESSION['admin_menu_index'];
123 $this->success("添加成功!", U($to));
124 } else {
125 $this->error("添加失败!");
126 }
127 } else {
128 $this->error($this->menu_model->getError());
129 }
130 }
131 }
132
133 /**
134 * 删除
135 */
136 public function delete() {
137 $id = intval(I("get.id"));
138 $count = $this->menu_model->where(array("parentid" => $id))->count();
139 if ($count > 0) {
140 $this->error("该菜单下还有子菜单,无法删除!");
141 }
142 if ($this->menu_model->delete($id)!==false) {
143 $this->success("删除菜单成功!");
144 } else {
145 $this->error("删除失败!");
146 }
147 }
148
149 /**
150 * 编辑
151 */
152 public function edit() {
153 import("Tree");
154 $tree = new \Tree();
155 $id = intval(I("get.id"));
156 $rs = $this->menu_model->where(array("id" => $id))->find();
157 $result = $this->menu_model->order(array("listorder" => "ASC"))->select();
158 foreach ($result as $r) {
159 $r['selected'] = $r['id'] == $rs['parentid'] ? 'selected' : '';
160 $array[] = $r;
161 }
162 $str = "<option value='\$id' \$selected>\$spacer \$name</option>";
163 $tree->init($array);
164 $select_categorys = $tree->get_tree(0, $str);
165 $this->assign("data", $rs);
166 $this->assign("select_categorys", $select_categorys);
167 $this->display();
168 }
169
170 /**
171 * 编辑
172 */
173 public function edit_post() {
174 if (IS_POST) {
175 if ($this->menu_model->create()) {
176 if ($this->menu_model->save() !== false) {
177 $app=I("post.app");
178 $model=I("post.model");
179 $action=I("post.action");
180 $name=strtolower("$app/$model/$action");
181 $menu_name=I("post.name");
182 $mwhere=array("name"=>$name);
183
184 $find_rule=$this->auth_rule_model->where($mwhere)->find();
185 if(!$find_rule){
186 $this->auth_rule_model->add(array("name"=>$name,"module"=>$app,"type"=>"admin_url","title"=>$menu_name));//type 1-admin rule;2-user rule
187 }else{
188 $this->auth_rule_model->where($mwhere)->save(array("name"=>$name,"module"=>$app,"type"=>"admin_url","title"=>$menu_name));//type 1-admin rule;2-user rule
189 }
190
191 $this->success("更新成功!");
192 } else {
193 $this->error("更新失败!");
194 }
195 } else {
196 $this->error($this->menu_model->getError());
197 }
198 }
199 }
200
201 //排序
202 public function listorders() {
203 $status = parent::_listorders($this->menu_model);
204 if ($status) {
205 $this->success("排序更新成功!");
206 } else {
207 $this->error("排序更新失败!");
208 }
209 }
210
211 public function spmy_export_menu(){
212 $menus=$this->menu_model->get_menu_tree(0);
213
214 $menus_str= var_export($menus,true);
215 $menus_str=preg_replace("/\s+\d+\s=>\s(\n|\r)/", "\n", $menus_str);
216
217 foreach ($menus as $m){
218 $app=$m['app'];
219 $menudir=SPAPP.$app."/Menu";
220 if(!file_exists($menudir)){
221 mkdir($menudir);
222 }
223 $model=strtolower($m['model']);
224
225 $menus_str= var_export($m,true);
226 $menus_str=preg_replace("/\s+\d+\s=>\s(\n|\r)/", "\n", $menus_str);
227
228 file_put_contents($menudir."/admin_$model.php", "<?php\nreturn $menus_str;");
229
230 }
231 $this->display("export_menu");
232 }
233
234 /* public function dev_import_menu(){
235 $menus=F("Menu");
236 if(!empty($menus)){
237 $table_menu=C('DB_PREFIX')."menu";
238 $this->menu_model->execute("TRUNCATE TABLE $table_menu;");
239
240 foreach($menus as $menu){
241 $this->menu_model->add($menu);
242 }
243 }
244
245 $this->display();
246 } */
247
248 private function _import_menu($menus,$parentid=0,&$error_menus=array()){
249 foreach ($menus as $menu){
250
251 $app=$menu['app'];
252 $model=$menu['model'];
253 $action=$menu['action'];
254
255 $where['app']=$app;
256 $where['model']=$model;
257 $where['action']=$action;
258 $children=isset($menu['children'])?$menu['children']:false;
259 unset($menu['children']);
260 $find_menu=$this->menu_model->where($where)->find();
261 if($find_menu){
262 $newmenu=array_merge($find_menu,$menu);
263 $result=$this->menu_model->save($newmenu);
264 if($result===false){
265 $error_menus[]="$app/$model/$action";
266 $parentid2=false;
267 }else{
268 $parentid2=$find_menu['id'];
269 }
270 }else{
271 $menu['parentid']=$parentid;
272 $result=$this->menu_model->add($menu);
273 if($result===false){
274 $error_menus[]="$app/$model/$action";
275 $parentid2=false;
276 }else{
277 $parentid2=$result;
278 }
279 }
280
281 $name=strtolower("$app/$model/$action");
282 $mwhere=array("name"=>$name);
283
284 $find_rule=$this->auth_rule_model->where($mwhere)->find();
285 if(!$find_rule){
286 $this->auth_rule_model->add(array("name"=>$name,"module"=>$app,"type"=>"admin_url","title"=>$menu['name']));//type 1-admin rule;2-user rule
287 }else{
288 $this->auth_rule_model->where($mwhere)->save(array("module"=>$app,"type"=>"admin_url","title"=>$menu['name']));//type 1-admin rule;2-user rule
289 }
290
291 if($children && $parentid!==false){
292 $this->_import_menu($children,$parentid2,$error_menus);
293 }
294 }
295
296 }
297
298 public function spmy_import_menu(){
299
300 $apps=sp_scan_dir(SPAPP."*",GLOB_ONLYDIR);
301 $error_menus=array();
302 foreach ($apps as $app){
303 if(is_dir(SPAPP.$app)){
304 $menudir=SPAPP.$app."/Menu";
305 $menu_files=sp_scan_dir($menudir."/admin_*.php",null);
306 if(count($menu_files)){
307 foreach ($menu_files as $mf){
308 //是php文件
309 $mf_path=$menudir."/$mf";
310 if(file_exists($mf_path)){
311 $menudatas=include $mf_path;
312 if(is_array($menudatas) && !empty($menudatas)){
313 $this->_import_menu(array($menudatas),0,$error_menus);
314 }
315 }
316
317
318 }
319 }
320
321 }
322 }
323 $this->assign("errormenus",$error_menus);
324 $this->display("import_menu");
325 }
326
327 private function _import_submenu($submenus,$parentid){
328 foreach($submenus as $sm){
329 $data=$sm;
330 $data['parentid']=$parentid;
331 unset($data['items']);
332 $id=$this->menu_model->add($data);
333 if(!empty($sm['items'])){
334 $this->_import_submenu($sm['items'],$id);
335 }else{
336 return;
337 }
338 }
339 }
340
341 private function _generate_submenu(&$rootmenu,$m){
342 $parentid=$m['id'];
343 $rm=$this->menu_model->menu($parentid);
344 unset($rootmenu['id']);
345 unset($rootmenu['parentid']);
346 if(count($rm)){
347
348 $count=count($rm);
349 for($i=0;$i<$count;$i++){
350 $this->_generate_submenu($rm[$i],$rm[$i]);
351
352 }
353 $rootmenu['items']=$rm;
354
355 }else{
356 return ;
357 }
358
359 }
360
361
362 public function spmy_getactions(){
363 $apps_r=array("Comment");
364 $groups=C("MODULE_ALLOW_LIST");
365 $group_count=count($groups);
366 $newmenus=array();
367 $g=I("get.app");
368 if(empty($g)){
369 $g=$groups[0];
370 }
371
372 if(in_array($g, $groups)){
373 if(is_dir(SPAPP.$g)){
374 if(!(strpos($g, ".") === 0)){
375 $actiondir=SPAPP.$g."/Controller";
376 $actions=sp_scan_dir($actiondir."/*");
377 if(count($actions)){
378 foreach ($actions as $mf){
379 if(!(strpos($mf, ".") === 0)){
380 if($g=="Admin"){
381 $m=str_replace("Controller.class.php", "",$mf);
382 $noneed_models=array("Public","Index","Main");
383 if(in_array($m, $noneed_models)){
384 continue;
385 }
386 }else{
387 if(strpos($mf,"adminController.class.php") || strpos($mf,"Admin")===0){
388 $m=str_replace("Controller.class.php", "",$mf);
389 }else{
390 continue;
391 }
392 }
393 $class=A($g."/".$m);
394 $adminbaseaction=new \Common\Controller\AdminbaseController();
395 $base_methods=get_class_methods($adminbaseaction);
396 $methods=get_class_methods($class);
397 $methods=array_diff($methods, $base_methods);
398
399 foreach ($methods as $a){
400 if(!(strpos($a, "_") === 0) && !(strpos($a, "spmy_") === 0)){
401 $where['app']=$g;
402 $where['model']=$m;
403 $where['action']=$a;
404 $count=$this->menu_model->where($where)->count();
405 if(!$count){
406 $data['parentid']=0;
407 $data['app']=$g;
408 $data['model']=$m;
409 $data['action']=$a;
410 $data['type']="1";
411 $data['status']="0";
412 $data['name']="未知";
413 $data['listorder']="0";
414 $result=$this->menu_model->add($data);
415 if($result!==false){
416 $newmenus[]= $g."/".$m."/".$a."";
417 }
418 }
419
420 $name=strtolower("$g/$m/$a");
421 $mwhere=array("name"=>$name);
422
423 $find_rule=$this->auth_rule_model->where($mwhere)->find();
424 if(!$find_rule){
425 $this->auth_rule_model->add(array("name"=>$name,"module"=>$g,"type"=>"admin_url","title"=>""));//type 1-admin rule;2-user rule
426 }
427 }
428 }
429 }
430
431
432 }
433 }
434 }
435 }
436
437 $index=array_search($g, $groups);
438 $nextindex=$index+1;
439 $nextindex=$nextindex>=$group_count?0:$nextindex;
440 if($nextindex){
441 $this->assign("nextapp",$groups[$nextindex]);
442 }
443 $this->assign("app",$g);
444 }
445
446 $this->assign("newmenus",$newmenus);
447 $this->display("getactions");
448
449 }
450
451 }

Thinkphp树形菜单相关方法的更多相关文章

  1. jQuery 树形菜单

    树形菜单 在 jQuery easyu中其左侧的主菜单使用的是 easyui 中的 tree 组件,不是太熟悉,不过感觉不是太好用. 比如 easyui 中的 tree 需要单击分叉节点前的小三角,才 ...

  2. JS树形菜单

    超全的JS树形菜单源代码共享(有实例图) 树形菜单是很常用的效果,常用在管理软件当中,但是一套树形菜单已经不能满足需求,所以如果能有一套比较全面的树形菜单JS特效代码,将会非常方便,下面懒人萱将超全的 ...

  3. 简单实用的二级树形菜单hovertree

    原创 hovertree是一个仿京东的树形菜单jquery插件,暂时有银色和绿色两种. 官方网址:http://keleyi.com/jq/hovertree/欢迎下载使用 查看绿色效果:http:/ ...

  4. Vue.js 递归组件实现树形菜单

    最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = tr ...

  5. EasyUI创建异步树形菜单和动态添加标签页tab

    创建异步树形菜单 创建树形菜单的ul标签 <ul class="easyui-tree" id="treeMenu"> </ul> 写j ...

  6. WEB开发中前后台树形菜单的展示设计

    在WEB开发中经常需要进行树形菜单的展示,本例通过不同角度的总结了如下三种实现方式: 通过JS的递归实现前端菜单DOM的动态创建 通过JSP的include指令结合JSTL表达式语言递归实现菜单的展示 ...

  7. jQuery树形菜单(1)jquery.treeview

    jQuery的树形插件资料URL:http://bassistance.de/jquery-plugins/jquery-plugin-treeview/从该网站Download得到jquery.tr ...

  8. DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案

    最近在对DWZ和asp.net MVC3进行整合,其中遇到了很多问题,总算一一解决了,今天就说说题目所示的问题解决方案. 想做一个基于角色的权限管理,要对每一个Action进行权限控制.就想用DWZ的 ...

  9. ux.form.field.SearchField 列表、树形菜单查询扩展

    //支持bind绑定store //列表搜索扩展,支持本地查询 //支持树形菜单本地一级菜单查询 Ext.define('ux.form.field.SearchField', { extend: ' ...

随机推荐

  1. Java RPC 框架 Solon 1.3.9 发布,更便利的支持

    Solon 是一个微型的Java RPC开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC. ...

  2. Mybatis检查SQL注入

    Mybatis 的 Mapper.xml 语句中 parameterType 向SQL语句传参有两种方式:#{ } 和 ${ }. 使用#{ }是来防止SQL注入,使用${ }是用来动态拼接参数. 如 ...

  3. Elastic App Search 快速构建 ES 应用

    公号:码农充电站pro 主页:https://codeshellme.github.io App Search 是 Elastic 家族中的一个产品,它可以帮助我们(基于 ES)快速高效的构建搜索应用 ...

  4. 话说 synchronized

    一.前言 ​ 说起java的锁呀,我们先想到的肯定是synchronized[ˈsɪŋ krə naɪ zd]了 ,这个单词很拗口,会读这个单词在以后的面试中很加分(我面试过一些人 不会读 ,他们说的 ...

  5. MySql_176. 第二高的薪水 + limit + distinct + null

    MySql_176. 第二高的薪水 LeetCode_MySql_176 题目描述 题解分析 代码实现 # Write your MySQL query statement below select( ...

  6. sql之对top语句理解

    起因 事情的起因是在群里和大佬讨论问题,讨论select top x后加*的问题,这时突发奇想,想搞清楚这个看起来在sql中略显突兀的语句结构,就有了这篇文 先看例子 select * from 表 ...

  7. vue 仿zTree折叠树

    需求: vue实现仿zTree折叠树,此文章仅作为记录文档. 实现: <template> <div class="line-tree"> <div ...

  8. 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(Unified API篇)

    SDK 开发 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(理念与设计原则篇) 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(开发基础篇) 顶级开源项目 Sentry ...

  9. 一个操作 cookie 的原生方法 cookieStore

    我们平时对 cookie 的增删改查等操作,都是在操作 document.cookie,这里我们介绍一个新方法cookieStore. 1. 平时如何操作 cookie document.cookie ...

  10. Azure Cost alerts 费用成本分析

    一,引言 依稀记得在一月初,我们在 Azure 上做成了一个 费用警报的监控,果不其然,前两天 Azure 给我发了两封封 Azure 预警警报的邮件,提醒我的预算的总费用超过了设置的通知阈值 &qu ...