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

--

-- 表的结构 `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());

}

实现效果

84ae2fb177bb15195118c9377294ad74.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值