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");
}
}