入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

thinkphp5带分组功能的树形结构的无限级分类节点展示

创建时间:2017-09-19 投稿人: 浏览次数:1659

--

-- 表的结构 `h_group`
--


CREATE TABLE IF NOT EXISTS `h_group` (
  `id` smallint(3) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  `title` varchar(50) NOT NULL,
  `create_time` int(11) unsigned NOT NULL,
  `update_time` int(11) unsigned NOT NULL DEFAULT "0",
  `status` tinyint(1) unsigned NOT NULL DEFAULT "0",
  `sort` smallint(3) unsigned NOT NULL DEFAULT "0",
  `show` tinyint(1) unsigned NOT NULL DEFAULT "0",
  `group_menu` char(15) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=43 ;


--
-- 表的结构 `h_node`
--


CREATE TABLE IF NOT EXISTS `h_node` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `route` varchar(50) NOT NULL,
  `title` varchar(50) DEFAULT NULL,
  `status` tinyint(1) DEFAULT "0",
  `remark` varchar(255) DEFAULT NULL,
  `sort` smallint(6) unsigned DEFAULT NULL,
  `pid` smallint(6) unsigned NOT NULL,
  `level` tinyint(1) unsigned NOT NULL,
  `type` tinyint(1) NOT NULL DEFAULT "0",
  `group_id` tinyint(3) unsigned DEFAULT "0",
  PRIMARY KEY (`id`),
  KEY `level` (`level`),
  KEY `pid` (`pid`),
  KEY `status` (`status`),
  KEY `name` (`route`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ;



node模型中的方法

 /**
    * 获取节点
    * @date: 2017年9月6日 下午3:38:14
    * @param: $level    指定的级别
    *         $gid    分组ID
    * @return:
    */
    public function getNodes($level=0,$gid=0){
        $nodes  =array();
        $map = array("n.status" => 1);
        if($gid){
            $map["n.group_id"] = $gid;
        }
        if($level){
            $map["n.level"] = $level;
        }
        $nodes = $this
        ->alias("n")
        ->join("__GROUP__ g","g.id = n.group_id")
        ->where($map)
        
        ->field("n.id,n.id as nId,n.route,n.title,n.title as text,n.level,n.pid,n.sort,n.group_id,g.title as tags")
        ->order("n.sort", "desc")
        ->select();
        //将查询的结果对象转换为数组
        $nodes = collection($nodes)->toArray();
        return $nodes;
    }

/**
    * 递归节点形成左侧的菜单
    * @date: 2017年9月6日 下午3:39:47
    * @param: $data     所有节点
    *         $pId      父节点
    * @return:
    */
    public function buildTrees($data, $pId)
    {
        $treenodes = array();
        foreach($data as $k => $v)
        {
           if($v["pid"] == $pId)
           {        
            $v["child"] = $this->buildTrees($data, $v["id"]);
            $treenodes[] = $v;
           }
        }
        return $treenodes;
     }


node控制器中的方法


 public function createMenu(){
        /*获取左侧菜单 */
        $leftmenu = array(); 
        
        $h_configs = Config::get("hplus");
        $menu_cache_name = $h_configs["menu_cache_name"];
        //将菜单加入session 
        if(Session::has($menu_cache_name)){
            $leftmenu = Session::get($menu_cache_name);
        }else{
            /* 获取分组 */
            $group_model = new GroupM();
            $leftmenu["groups"]= $group_model->getGroups();
            $leftmenu["grouplist"]= $leftmenu["groups"];
            /* 获取节点 */
            $leftmenu["node"] = array();
            if(!empty($leftmenu["groups"])){
                foreach ($leftmenu["groups"] as $k=>$v){
                    $tmp =array();
                    //判断是否是admin用户
                    if($this->is_admin){
                        $tmp = $this->node_model->getNodes(0,$v["id"]);
                    }
                    else{
                        $tmp = $this->node_model->getNodesLeft(0,$v["id"],Session::get($this->user_auth_key));
                    }
                    if(!empty($tmp)){
                        $tmp = $this->node_model->buildTrees($tmp,0);
                        $leftmenu["node"][$v["id"]] = $tmp;
                       // array_walk($tmp,"walkfuc");
                       // $nodes_route[$v["id"]] = $tmp;
                    }else{
                        unset($leftmenu["groups"][$k]);
                    }
                    
                }
            }
            //用于判断左侧菜单是否高亮
            $leftmenu["level_two_childs"] = array();
            $leftmenu["level_two_childs"] = $this->node_model->getChildsByLevel();
            Session::set($menu_cache_name,$leftmenu);
        }
        
        //$treenode = $node_model->buildTrees($nodes,0);
        // $treenode = empty($treenode)?array():$treenode;
        $this->assign("level_two_childs",isset($leftmenu["level_two_childs"])?$leftmenu["level_two_childs"]:array());
        $this->assign("menugroup",isset($leftmenu["groups"])?$leftmenu["groups"]:array());
        $this->assign("grouplist",isset($leftmenu["grouplist"])?$leftmenu["grouplist"]:array());
        $this->assign("treenode",isset($leftmenu["node"])?$leftmenu["node"]:array());
    }

 实现效果


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。