hans
中级会员
 
老会员
UID 19962
精华
0
积分 445
帖子 457
金钱 445 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2003-5-19 来自 上海 浦东
状态 离线
|
发个通过左右节点来实现无级分类办法
<?php /* tree.class.php @Author: enze [email]enze@sina100.com[/email] [email]enzewei@gmail.com[/email] */
//暂时没有做更新菜单 /* 调用显示 $f=array(0=>'id',1=>'name',2=>'lev'); $w='where pause=1'; $tree=new Tree('news','news_sort'); $sort=$tree->show_tree($f,$w); foreach($sort as $sortname) { unset($space); for($i=0;$i<$sortname->lev;$i++) { $space.=' '; } $sortname->name=$sortname->lev>0?$space.'├ '.$sortname->name:$sortname->name; $sortname->id=$id==$sortname->id?$sortname->id.' selected':$sortname->id; }
添加
$f=array(0=>'fid',1=>'name',2=>'dirname'); $v=array(0=>"'$fid'",1=>"'$name'",2=>"'$ename'");
$tree=new Tree('news','news_sort'); $tree->add_tree($f,$v,$fid);
*/ Class Tree { //声明一些变量 var $db; var $sql; var $query; var $num; var $result=array(); var $array_num; var $res; //类同名函数,调用类时自动执行。 //$dbname是数据库名称 //$table是数据库表 function Tree($dbname='',$table='') { $this->dbname=$dbname; $this->table=$table; }
//以数组的形式返回树状菜单 //filed是查询数据库的字段为数组,where是限制条件
function show_tree($filed,$where='') { $this->array_num=count($filed); $fileds=$this->array_num>1?join(',',$filed):$filed[0]; $this->db=new DataBase($this->dbname); $this->sql="select $fileds from `$this->table` $where order by `lft`"; $this->query=$this->db->query($this->sql); $this->num=$this->db->query_num($this->query); if($this->num<1) { return false; } for($i=0;$i<$this->num;$i++) { $result[]=$this->db->query_object($this->query); } return $result; }
//添加菜单,$filed,$value为数组,即字段名,值 //$fid为当前添加菜单的父,根的时候为0
function add_tree($filed,$value,$fid) { //获取左右节点 $lft=$this->__get_lft($fid); $rgt=$this->__get_rgt($fid);
//下面两个是方便显示与排序用的。 $lev=$this->__get_level($fid); $oid=$this->__get_order($fid);
//压入数组 array_push($filed,'lft'); array_push($filed,'rgt'); array_push($filed,'lev'); array_push($filed,'oid'); array_push($value,$lft); array_push($value,$rgt); array_push($value,$lev); array_push($value,$oid);
//更新节点 $this->__update_node($lft,$rgt); //取出sql语句 $this->array_num=count($filed); $fileds=$this->array_num>1?join(',',$filed):$filed[0]; $this->array_num=count($value); $values=$this->array_num>1?join(',',$value):$value[0];
$this->db=new DataBase($this->dbname);
$this->sql="insert into `$this->table` ($fileds) values ($values)";
$this->query=$this->db->query($this->sql); }
//获取左节点 function __get_lft(&$fid) { $this->db=new DataBase($this->dbname); $this->sql="select `rgt` from $this->table where `fid` = '$fid' order by lft desc limit 1"; $this->query=$this->db->query($this->sql); $this->num=$this->db->query_num($this->query); //当前菜单的父菜单具有子菜单 if($this->num>0) { $this->res=$this->db->query_object($this->query); //这里是同级菜单的右节点+1 $lft=$this->res->rgt+1; } else { $this->sql="select `lft` from $this->table where `id` = '$fid' order by id"; $this->query=$this->db->query($this->sql); $this->num=$this->db->query_num($this->query); //父菜单暂时没有子菜单 if($this->num==1) { $this->res=$this->db->query_object($this->query); //这里是父菜单左节点+1 $lft=$this->res->lft+1; } else { //第一个菜单 $lft=1; } } return $lft; } //获取右节点 function __get_rgt(&$fid) { $this->db=new DataBase($this->dbname); $this->sql="select `rgt` from $this->table where `fid` = '$fid' order by lft desc limit 1"; $this->query=$this->db->query($this->sql); $this->num=$this->db->query_num($this->query); //当前菜单的父菜单具有子菜单 if($this->num>0) { $this->res=$this->db->query_object($this->query); //这里是同级菜单的右节点+2 $rgt=$this->res->rgt+2; } else { $this->sql="select `rgt` from $this->table where `id` = '$fid' order by id"; $this->query=$this->db->query($this->sql); $this->num=$this->db->query_num($this->query); //父菜单暂时没有子菜单 if($this->num==1) { $this->res=$this->db->query_object($this->query); //这里是父菜单右节点+1 $rgt=$this->res->rgt+1; } else { //第一个菜单 $rgt=2; } } return $rgt; } //更新节点 function __update_node(&$lft,&$rgt) { $this->db=new DataBase($this->dbname); $this->sql="update $this->table set `lft`=`lft`+2 where `lft`>='$lft'"; $this->query=$this->db->query($this->sql); $this->sql="update $this->table set `rgt`=`rgt`+2 where `rgt`>='$lft'"; $this->query=$this->db->query($this->sql); } //获取菜单的级别 function __get_level(&$fid) { $this->db=new DataBase($this->dbname); $this->sql="select `lev` from $this->table where `id` = '$fid' order by id"; $this->query=$this->db->query($this->sql); $this->num=$this->db->query_num($this->query); if($this->num>0) { $this->res=$this->db->query_object($this->query); $lev=$this->res->lev+1; } else { $lev=0; } return $lev; } //获取菜单的排序 function __get_order(&$fid) { $this->db=new DataBase($this->dbname); $this->sql="select `oid` from $this->table where `fid` = '$fid' order by id desc limit 1"; $this->query=$this->db->query($this->sql); $this->num=$this->db->query_num($this->query); if($this->num>0) { $this->res=$this->db->query_object($this->query); $oid=$this->res->oid+1; } else { $oid=1; } return $oid; } } ?>
|
|