menu_model = D("Common/Menu"); $this->auth_rule_model = D("Common/AuthRule"); } // 后台菜单列表 public function index() { session('admin_menu_index','Menu/index'); $result = $this->menu_model->order(array("listorder" => "ASC"))->select(); $tree = new \Tree(); $tree->icon = array('   │ ', '   ├─ ', '   └─ '); $tree->nbsp = '   '; $newmenus=array(); foreach ($result as $m){ $newmenus[$m['id']]=$m; } foreach ($result as $n=> $r) { //$result[$n]['level'] = $this->_get_level($r['id'], $newmenus); $result[$n]['parentid_node'] = ($r['parentid']) ? ' class="child-of-node-' . $r['parentid'] . '"' : ''; $result[$n]['style'] = empty($r['parentid']) ? '' : 'display:none;'; $result[$n]['str_manage'] = ' $r['id'], "menuid" => I("get.menuid"))) . '">'.L('ADD_SUB_MENU').' | $r['id'], "menuid" => I("get.menuid"))) . '">'.L('EDIT').' | $r['id'], "menuid" => I("get.menuid")) ). '">'.L('DELETE').' '; $result[$n]['status'] = $r['status'] ? L('DISPLAY') : L('HIDDEN'); if(APP_DEBUG){ $result[$n]['app']=$r['app']."/".$r['model']."/".$r['action']; } } $tree->init($result); $str = " \$id \$app \$spacer\$name \$status \$str_manage "; $categorys = $tree->get_tree(0, $str); $this->assign("categorys", $categorys); $this->display(); } /** * 获取菜单深度 * @param $id * @param $array * @param $i */ protected function _get_level($id, $array = array(), $i = 0) { if ($array[$id]['parentid']==0 || empty($array[$array[$id]['parentid']]) || $array[$id]['parentid']==$id){ return $i; }else{ $i++; return $this->_get_level($array[$id]['parentid'],$array,$i); } } // 后台所有菜单列表 public function lists(){ session('admin_menu_index','Menu/lists'); $result = $this->menu_model->order(array("app" => "ASC","model" => "ASC","action" => "ASC"))->select(); $this->assign("menus",$result); $this->display(); } // 后台菜单添加 public function add() { $tree = new \Tree(); $parentid = I("get.parentid",0,'intval'); $result = $this->menu_model->order(array("listorder" => "ASC"))->select(); foreach ($result as $r) { $r['selected'] = $r['id'] == $parentid ? 'selected' : ''; $array[] = $r; } $str = ""; $tree->init($array); $select_categorys = $tree->get_tree(0, $str); $this->assign("select_categorys", $select_categorys); $this->display(); } // 后台菜单添加提交 public function add_post() { if (IS_POST) { if ($this->menu_model->create()!==false) { if ($this->menu_model->add()!==false) { $app=I("post.app"); $model=I("post.model"); $action=I("post.action"); $name=strtolower("$app/$model/$action"); $menu_name=I("post.name"); $mwhere=array("name"=>$name); $find_rule_count=$this->auth_rule_model->where($mwhere)->count(); if(empty($find_rule_count)){ $this->auth_rule_model->add(array("name"=>$name,"module"=>$app,"type"=>"admin_url","title"=>$menu_name));//type 1-admin rule;2-user rule } $session_admin_menu_index=session('admin_menu_index'); $to=empty($session_admin_menu_index)?"Menu/index":$session_admin_menu_index; $this->_export_app_menu_default_lang($app); $this->success("添加成功!", U($to)); } else { $this->error("添加失败!"); } } else { $this->error($this->menu_model->getError()); } } } // 后台菜单删除 public function delete() { $id = I("get.id",0,'intval'); $count = $this->menu_model->where(array("parentid" => $id))->count(); if ($count > 0) { $this->error("该菜单下还有子菜单,无法删除!"); } if ($this->menu_model->delete($id)!==false) { $this->success("删除菜单成功!"); } else { $this->error("删除失败!"); } } // 后台菜单编辑 public function edit() { $tree = new \Tree(); $id = I("get.id",0,'intval'); $rs = $this->menu_model->where(array("id" => $id))->find(); $result = $this->menu_model->order(array("listorder" => "ASC"))->select(); foreach ($result as $r) { $r['selected'] = $r['id'] == $rs['parentid'] ? 'selected' : ''; $array[] = $r; } $str = ""; $tree->init($array); $select_categorys = $tree->get_tree(0, $str); $this->assign("data", $rs); $this->assign("select_categorys", $select_categorys); $this->display(); } // 后台菜单编辑提交 public function edit_post() { if (IS_POST) { $id = I('post.id',0,'intval'); $old_menu=$this->menu_model->where(array('id'=>$id))->find(); if ($this->menu_model->create()!==false) { if ($this->menu_model->save() !== false) { $app=I("post.app"); $model=I("post.model"); $action=I("post.action"); $name=strtolower("$app/$model/$action"); $menu_name=I("post.name"); $mwhere=array("name"=>$name); $find_rule_count=$this->auth_rule_model->where($mwhere)->count(); if(empty($find_rule_count)){ $old_app=$old_menu['app']; $old_model=$old_menu['model']; $old_action=$old_menu['action']; $old_name=strtolower("$old_app/$old_model/$old_action"); $find_old_rule_id=$this->auth_rule_model->where(array("name"=>$old_name))->getField('id'); if(empty($find_old_rule_id)){ $this->auth_rule_model->add(array("name"=>$name,"module"=>$app,"type"=>"admin_url","title"=>$menu_name));//type 1-admin rule;2-user rule }else{ $this->auth_rule_model->where(array('id'=>$find_old_rule_id))->save(array("name"=>$name,"module"=>$app,"type"=>"admin_url","title"=>$menu_name));//type 1-admin rule;2-user rule } }else{ $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 } $this->_export_app_menu_default_lang($app); $this->success("更新成功!"); } else { $this->error("更新失败!"); } } else { $this->error($this->menu_model->getError()); } } } // 后台菜单排序 public function listorders() { $status = parent::_listorders($this->menu_model); if ($status) { $this->success("排序更新成功!"); } else { $this->error("排序更新失败!"); } } // 后台菜单备份 public function backup_menu(){ $menus=$this->menu_model->get_menu_tree(0); $menus_str= var_export($menus,true); $menus_str=preg_replace("/\s+\d+\s=>\s(\n|\r)/", "\n", $menus_str); foreach ($menus as $m){ $app=$m['app']; $menudir=SPAPP.$app."/Menu"; if(!file_exists($menudir)){ mkdir($menudir); } $model=strtolower($m['model']); $menus_str= var_export($m,true); $menus_str=preg_replace("/\s+\d+\s=>\s(\n|\r)/", "\n", $menus_str); file_put_contents($menudir."/admin_$model.php", "success('菜单备份成功!'); } /** * 导出后台菜单语言包 * @param string $app */ private function _export_app_menu_default_lang($app){ $menus = $this->menu_model->where(array("app"=>$app))->order(array("listorder"=>"ASC","app" => "ASC","model" => "ASC","action" => "ASC"))->select(); $lang_dir=C('DEFAULT_LANG'); $admin_menu_lang_file_default=SITE_PATH."data/lang/$app/Lang/".$lang_dir."/admin_menu.php"; if(!empty($admin_menu_lang_file_default) && !file_exists_case(dirname($admin_menu_lang_file_default))){ mkdir(dirname($admin_menu_lang_file_default),0777,true); } $lang=array(); foreach ($menus as $menu){ $lang_key=strtoupper($menu['app'].'_'.$menu['model'].'_'.$menu['action']); $lang[$lang_key]=$menu['name']; } $lang_str= var_export($lang,true); $lang_str=preg_replace("/\s+\d+\s=>\s(\n|\r)/", "\n", $lang_str); if(!empty($admin_menu_lang_file_default)){ file_put_contents($admin_menu_lang_file_default, "menu_model->where(array("app"=>$app))->order(array("listorder"=>"ASC","app" => "ASC","model" => "ASC","action" => "ASC"))->select(); foreach ($lang_dirs as $lang_dir){ $admin_menu_lang_file=SPAPP.$app."/Lang/".$lang_dir."/admin_menu.php"; $admin_menu_lang_file_default=''; if($default_lang==$lang_dir){ $admin_menu_lang_file_default=SITE_PATH."data/lang/$app/Lang/".$lang_dir."/admin_menu.php"; } if(!file_exists_case(dirname($admin_menu_lang_file))){ mkdir(dirname($admin_menu_lang_file),0777,true); } if(!empty($admin_menu_lang_file_default) && !file_exists_case(dirname($admin_menu_lang_file_default))){ mkdir(dirname($admin_menu_lang_file_default),0777,true); } $lang=array(); if($lang_dir!=$default_lang && is_file($admin_menu_lang_file)){ $lang=include $admin_menu_lang_file; } foreach ($menus as $menu){ $lang_key=strtoupper($menu['app'].'_'.$menu['model'].'_'.$menu['action']); if($lang_dir==$default_lang){ $lang[$lang_key]=$menu['name']; }else if(!isset($lang[$lang_key])){ $lang[$lang_key]=$menu['name']; } } $lang_str= var_export($lang,true); $lang_str=preg_replace("/\s+\d+\s=>\s(\n|\r)/", "\n", $lang_str); file_put_contents($admin_menu_lang_file, "success('生成菜单语言包已经完成!'); } /* public function dev_import_menu(){ $menus=F("Menu"); if(!empty($menus)){ $table_menu=C('DB_PREFIX')."menu"; $this->menu_model->execute("TRUNCATE TABLE $table_menu;"); foreach($menus as $menu){ $this->menu_model->add($menu); } } $this->display(); } */ // 导入后台菜单 private function _import_menu($menus,$parentid=0,&$error_menus=array()){ foreach ($menus as $menu){ $app=$menu['app']; $model=$menu['model']; $action=$menu['action']; $where['app']=$app; $where['model']=$model; $where['action']=$action; $children=isset($menu['children'])?$menu['children']:false; unset($menu['children']); $find_menu=$this->menu_model->where($where)->find(); if($find_menu){ $newmenu=array_merge($find_menu,$menu); $result=$this->menu_model->save($newmenu); if($result===false){ $error_menus[]="$app/$model/$action"; $parentid2=false; }else{ $parentid2=$find_menu['id']; } }else{ $menu['parentid']=$parentid; $result=$this->menu_model->add($menu); if($result===false){ $error_menus[]="$app/$model/$action"; $parentid2=false; }else{ $parentid2=$result; } } $name=strtolower("$app/$model/$action"); $mwhere=array("name"=>$name); $find_rule=$this->auth_rule_model->where($mwhere)->find(); if(!$find_rule){ $this->auth_rule_model->add(array("name"=>$name,"module"=>$app,"type"=>"admin_url","title"=>$menu['name']));//type 1-admin rule;2-user rule }else{ $this->auth_rule_model->where($mwhere)->save(array("module"=>$app,"type"=>"admin_url","title"=>$menu['name']));//type 1-admin rule;2-user rule } if($children && $parentid!==false){ $this->_import_menu($children,$parentid2,$error_menus); } } } // 还原菜单 public function restore_menu(){ $apps=sp_scan_dir(SPAPP."*",GLOB_ONLYDIR); $error_menus=array(); foreach ($apps as $app){ if(is_dir(SPAPP.$app)){ $menudir=SPAPP.$app."/Menu"; $menu_files=sp_scan_dir($menudir."/admin_*.php",null); if(count($menu_files)){ foreach ($menu_files as $mf){ //是php文件 $mf_path=$menudir."/$mf"; if(file_exists($mf_path)){ $menudatas=include $mf_path; if(is_array($menudatas) && !empty($menudatas)){ $this->_import_menu(array($menudatas),0,$error_menus); } } } } } } if (empty($error_menus)){ $this->success('菜单恢复成功!'); }else{ $this->error('菜单恢复失败:'.implode(',', $error_menus)); } } private function _import_submenu($submenus,$parentid){ foreach($submenus as $sm){ $data=$sm; $data['parentid']=$parentid; unset($data['items']); $id=$this->menu_model->add($data); if(!empty($sm['items'])){ $this->_import_submenu($sm['items'],$id); }else{ return; } } } private function _generate_submenu(&$rootmenu,$m){ $parentid=$m['id']; $rm=$this->menu_model->menu($parentid); unset($rootmenu['id']); unset($rootmenu['parentid']); if(count($rm)){ $count=count($rm); for($i=0;$i<$count;$i++){ $this->_generate_submenu($rm[$i],$rm[$i]); } $rootmenu['items']=$rm; }else{ return ; } } // 导入新菜单 public function getactions(){ $apps_r=array("Comment"); $groups=C("MODULE_ALLOW_LIST"); $group_count=count($groups); $newmenus=array(); $g=I("get.app"); if(empty($g)){ $g=$groups[0]; } if(in_array($g, $groups)){ if(is_dir(SPAPP.$g)){ if(!(strpos($g, ".") === 0)){ $actiondir=SPAPP.$g."/Controller"; $actions=sp_scan_dir($actiondir."/*"); if(count($actions)){ foreach ($actions as $mf){ if(!(strpos($mf, ".") === 0)){ if($g=="Admin"){ $m=str_replace("Controller.class.php", "",$mf); $noneed_models=array("Public","Index","Main"); if(in_array($m, $noneed_models)){ continue; } }else{ if(strpos($mf,"adminController.class.php") || strpos($mf,"Admin")===0){ $m=str_replace("Controller.class.php", "",$mf); }else{ continue; } } $class=A($g."/".$m); $adminbaseaction=new \Common\Controller\AdminbaseController(); $base_methods=get_class_methods($adminbaseaction); $methods=get_class_methods($class); $methods=array_diff($methods, $base_methods); foreach ($methods as $a){ if(!(strpos($a, "_") === 0) && !(strpos($a, "spmy_") === 0)){ $where['app']=$g; $where['model']=$m; $where['action']=$a; $count=$this->menu_model->where($where)->count(); if(!$count){ $data['parentid']=0; $data['app']=$g; $data['model']=$m; $data['action']=$a; $data['type']="1"; $data['status']="0"; $data['name']="未知"; $data['listorder']="0"; $result=$this->menu_model->add($data); if($result!==false){ $newmenus[]= $g."/".$m."/".$a.""; } } $name=strtolower("$g/$m/$a"); $mwhere=array("name"=>$name); $find_rule=$this->auth_rule_model->where($mwhere)->find(); if(!$find_rule){ $this->auth_rule_model->add(array("name"=>$name,"module"=>$g,"type"=>"admin_url","title"=>""));//type 1-admin rule;2-user rule } } } } } } } } $index=array_search($g, $groups); $nextindex=$index+1; $nextindex=$nextindex>=$group_count?0:$nextindex; if($nextindex){ $this->assign("nextapp",$groups[$nextindex]); } $this->assign("app",$g); } $this->assign("newmenus",$newmenus); $this->display("getactions"); } }