前一周写的吧,使用中效果还不错。
主要思想来自:http://www.phpobject.net/b…[url=http://www.phpobject.net/blog/read.php?49][/url]
这里就不多解释原理了,直接发代码。
PS:这里代码是不能直接使用的,必须结合我的一些其他库类。应该说思想才是最重要的,这里主要提供一种分类的思路。
<? <BR>/** <BR>-- <BR>-- 表的结构 `daxue8_category` <BR>-- <br><br>CREATE TABLE `daxue8_category` ( <BR> `cid` smallint(6) NOT NULL auto_increment, <BR> `pid` smallint(6) NOT NULL default '0', <BR> `level` smallint(6) NOT NULL default '0', <BR> `cname` char(64) NOT NULL default '', <BR> `lft` smallint(6) NOT NULL default '0', <BR> `rgt` smallint(6) NOT NULL default '0', <BR> `uid` mediumint(8) NOT NULL default '0', <BR> `username` char(32) NOT NULL default '', <BR> `ctime` int(10) NOT NULL default '0', <BR> `cstate` tinyint(1) NOT NULL default '0', <BR> `gnum` mediumint(8) NOT NULL default '0', <BR> `orderstyle` smallint(3) NOT NULL default '0', <BR> PRIMARY KEY (`cid`) <BR>) TYPE=MyISAM AUTO_INCREMENT=2 ; <br><br>-- <BR>-- 导出表中的数据 `daxue8_category` <BR>-- <br><br>INSERT INTO `daxue8_category` VALUES (1, 0, 1, 'root', 1, 2, 0, '管理员', 1163608814, 1, 0, 0); <BR>*/ <BR>class category <BR>{ <BR> var $module; <br><br> var $tbname; <br><br> function category() <BR> { <BR> $this->tbname=TB_PREX.'_category'; <BR> $this->module=new module($this->tbname); <BR> } <br><br> /** <BR> * 增加子节点 <BR> * @param array $node 待增加子节点的属性 <BR> * @param int $pid 父节点的ID <BR> */ <BR> function add($node,$pid){ <BR> //检查是否已经存在该节点 <BR> if($node_exist=$this->module->detail('where pid='.$pid.' and cname=\''.$node['cname'].'\'')){ <BR> //$this->error(__FUNCTION__.'():该节点'.$node['cname'].'已经存在!'); <BR> //print_r($node_exist); <BR> return $node_exist['cid']; <BR> } <BR> //获取父节点信息 <BR> $pnode=$this->get_by_cid($pid); <BR> //更新其他节点 <BR> $this->module->query('update `'.$this->tbname.'` set lft=lft+2 where lft>'.$pnode['rgt']); <BR> $this->module->query('update `'.$this->tbname.'` set rgt=rgt+2 where rgt>='.$pnode['rgt']); <BR> //插入新节点 <BR> $node['pid']=$pid; <BR> $node['lft']=$pnode['rgt']; <BR> $node['rgt']=$pnode['rgt']+1; <BR> $node['level']=$pnode['level']+1;//层次加一 <BR> return $this->module->add($node); <BR> } <br><br> /** <BR> * 删除节点 <BR> * @param $cid 待删除的节点的ID <BR> * @param $delete_childern 如果该节点存在子节点,是否强制删除。设置未true,则当存在子节点的时候,删除失败,返回false <BR> * <BR> */ <BR> function delete($cid,$delete_childern=false) <BR> { <BR> //获取节点信息 <BR> $node=$this->get_by_cid($cid); <BR> if(($this->child_num($node)>0)&&(!$delete_childern))$this->error(__FUNCTION__.'():该节点存在子节点!'); <BR> //删除该节点及其所有子节点 <BR> $this->module->delete('where lft between '.$node['lft'].' and '.$node['rgt']); <BR> //修改相应的左右键值 <BR> $plus=$node['rgt']-$node['lft']+1; <BR> $this->module->query('update `'.$this->tbname.'` set lft=lft-'.$plus.' where lft>'.$node['rgt']); <BR> $this->module->query('update `'.$this->tbname.'` set rgt=rgt-'.$plus.' where rgt>'.$node['rgt']); <BR> return true; <BR> } <br><br> /** <BR> * 更新一个节点 <BR> * @param array $set更新集 <BR> * @param int $cid 更新的节点的主键ID <BR> */ <BR> function update($set,$cid){ <BR> return $this->module->update($set,'where cid='.$cid); <BR> } <br><br> /** <BR> * 选取节点及其子节点 <BR> * @param int $cid节点的主键ID <BR> * @param int $deep选取深度 <BR> */ <BR> function select($cid,$deep=0) <BR> { <BR> //获取节点信息 <BR> $node=$this->get_by_cid($cid); <BR> $where='where lft between '.$node['lft'].' and '.$node['rgt']; <BR> if(!empty($deep))$where.=' and level<'.$node['level']+$deep; <BR> if($deep==1){ <BR> $where.=' order by orderstyle desc'; <BR> }else{ <BR> $where.=' order by lft asc'; <BR> } <BR> return $this->module->select($where); <BR> } <br><br> /** <BR> * 获取父节点路径 <BR> * @param int $cid 节点的ID <BR> */ <BR> function get_parent($cid) <BR> { <BR> $node=$this->get_by_cid($cid); <BR> return $this->module->select('where lft='.$node['rgt'].' order by lft asc'); <BR> } <BR> /** <BR> * 选取子节点 <BR> * @param int $cid节点的主键ID <BR> * @param int $deep选取深度 <BR> */ <BR> function get_children($pid,$deep=0){ <BR> //获取节点信息 <BR> $pnode=$this->get_by_cid($pid); <BR> $where='where lft>'.$pnode['lft'].' and rgt<'.$pnode['rgt']; <BR> if(!empty($deep))$where.=' and level<='.($pnode['level']+$deep); <BR> if($deep==1){ <BR> $where.=' order by orderstyle desc'; <BR> }else{ <BR> $where.=' order by lft asc'; <BR> } <BR> return $this->module->select($where); <BR> } <br><br> /** <BR> * 获取第deep层子节点 <BR> * @param int $cid节点的主键ID <BR> * @param int $deep选取深度 <BR> */ <BR> function get_level_children($pid,$deep){ <BR> //获取节点信息 <BR> $pnode=$this->get_by_cid($pid); <BR> $where='where lft>'.$pnode['lft'].' and rgt<'.$pnode['rgt']; <BR> $where.=' and level='.($pnode['level']+$deep); <BR> $where.=' order by orderstyle desc'; <BR> return $this->module->select($where); <BR> } <br><br> /** <BR> * 获取节点信息 <BR> * @param $cid 节点的主键ID <BR> * @return array $node <BR> */ <BR> function get_by_cid($cid){ <BR> $node=$this->module->detail('where cid='.$cid); <BR> if(!$node)$this->error(__FUNCTION__.'():获取节点'.$cid.'失败!'); <BR> return $node; <BR> } <BR> /** <BR> * 获取子节点的数目 <BR> * @param array $node 节点信息 <BR> * @return num <BR> */ <BR> function child_num($node){ <BR> return ($node['rgt']-$node['lft']-1)/2; <BR> } <BR> /** <BR> * 按照层次显示分类 <BR> * @param int $cid节点的主键ID <BR> * @output <BR> */ <BR> function display($cid) <BR> { <BR> $nodes=$this->select($cid); <BR> foreach($nodes as $node){ <BR> echo str_repeat(' ',$node['level']-1).$node['cname']."\n"<strong>+本文来源gao@daima#com搞(%代@#码网</strong><pre>搞代gaodaima码
;
}
}
/*——-private———————————–*/
function error($msg){
die(‘ERROR : file ‘.__FILE__.’ function ‘.$msg);
}
}
?>