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. 图文详解:阿里宠儿【小兔】RabbitMQ的养成攻略

  2. entitybuilder--一个简单的业务通用框架

    关于业务通用框架的思考 业务系统是千差万别的,例如,保存.更新和删除订单,或者保存订单和保存客户,走的根本不是一个流程.但是,它们还是有共同点,它们的流程大致可以分成下面的几个部分: 拿到增删改等操作 ...

  3. MVC base64加密的文件,前端下载

    后端代码: public FileResult OutPutFile(string  base64file,string filename) { buffer = Convert.FromBase64 ...

  4. JAVA中枚举Enum详解

    1.关键字:enum.枚举可以定义成单独的文件,也可以定义在其他类内部. 枚举在类内部的示例: public class EnumInner { public static void main(Str ...

  5. 树莓派4刷FreeBSD

    树莓派4可以刷FreeBSD了.需要替换boot文件.​加群获得文件QQ交流群817507910.

  6. js 检测当前浏览其类型

    需求:检测并打印当前使用的浏览器类型 <script type="text/javascript"> function getBrowser(){ const str ...

  7. drozer使用总结

    adb forward tcp:31415 tcp:31415 drozer console connect run app.package.list -f baidu      查看包名 run a ...

  8. WinForm的Socket实现简单的聊天室 IM

    1:什么是Socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. 从 ...

  9. 内存模型与c++中的memory order

    概 c++的atomic使用总会配合各种各样的memory order进行使用,memory order控制了执行结果在多核中的可见顺序,,这个可见顺序与代码序不一定一致(第一句代码执行完成的结果不一 ...

  10. SFDC 利用Schema.Describe来取得Picklist所有的选项

    Salesforce的开发语言Apex与Java极为类似.也有封装,基础,多态特性. 并且也能 反射,Object的属性和Field属性. 今天主要记录的是一个需求:Visualforce Page或 ...