これは 1 週間前に書きましたが、実際に使ってみると非常にうまく機能しています。
主なアイデアの出典: http://www.phpobject.net/b...[url=http://www.phpobject.net/blog/read.php?49][/url ]
ここでは原理は説明しません。コードを直接送信してください。
PS: このコードは直接使用できないため、他のライブラリ クラスと組み合わせる必要があります。ここでは主に分類の考え方を紹介します。
コードをコピー コードは次のとおりです:
<
/**
--
-- 表の構造 `daxue8_category`
--
CREATE TABLE `daxue8_category` (
`cid` smallint(6) NOT NULL auto_increment,
`pid` smallint(6) NOT NULL default '0',
`level` smallint(6) NOT NULL default '0',
`cname` char(64) NOT NULL default '',
`lft` smallint(6) NOT NULL デフォルト '0',
`rgt` smallint(6) NOT NULL デフォルト '0',
`uid` mediumint(8) NOT NULL デフォルト '0',
`username` char(32) NOT NULL default '',
`ctime` int(10) NOT NULL default '0',
`cstate` tinyint(1) NOT NULL default '0',
`gnum` mediumint(8) NOT NULL default '0',
`orderstyle` smallint(3) NOT NULL default '0',
PRIMARY KEY (`cid`)
) TYPE=MyISAM AUTO_INCREMENT =2;
--
-- 表中のデータ `daxue8_category`
--
INSERT INTO `daxue8_category` VALUES (1, 0, 1, 'root', 1 , 2, 0, '管理员', 1163608814, 1, 0, 0);
*/
クラスカテゴリ
{
var $module;
var $tbname; 🎜> 関数 category()
{
$this->tbname=TB_PREX.'_category'
$this->module=new module($this->tbname); }
/**
* 子ノードの追加
* @param array $node 追加する子ノードの属性
* @param int $pid 親ノードの ID
*/
function add($node,$pid){
//ノードが既に存在するかどうかを確認します
if($node_exist=$this- >module->detail('where pid='.$pid.' and cname=''.$node['cname'].''')){ __FUNCTION__.'(): ノード ' 。$ node [cname ']。 '.$pnode['rgt']);
$this->module->query('update ` '.$this->tbname.'` set rgt=rgt 2 where rgt>='. $pnode['rgt']);
//新しいノードを挿入
$node['pid']= $pid; $node['lft']=$pnode['rgt'];
$node['rgt']=$pnode['rgt'] 1;
$node['level ']=$pnode['level'] 1; // レベルを 1 つ追加します
return $ this->module->add($node);
}
/**
* ノードの削除
* @param $cid 削除するノードの ID
* @param $delete_childern ノードに子ノードがある場合、強制的に削除するかどうか。設定が true でない場合、子ノードが存在する場合、削除は失敗し false を返します
* *
*/
function delete($cid,$delete_childern=false)
{
//ノード情報を取得
$node=$this->get_by_cid($cid);
if(($this->child_num($node)>0)&&(!$delete_childern)) $this-> ;error(__FUNCTION__.'(): このノードには子ノードがあります。');
//ノードとそのすべての子ノードを削除します
$this->module->delete('where lft between '.$node['lft'].' と '.$node ['rgt']);
//対応する左右のキーの値を変更します
$plus=$node['rgt']-$node['lft'] 1; ->module ->query('update `'.$this->tbname.'` set lft=lft-'.$plus.' where lft>'.$node['rgt']); > $this- >module->query('update `'.$this->tbname.'` set rgt=rgt-'.$plus.' where rgt>'.$node['rgt']) ;
return true;
}
/**
* ノードを更新します
* @param array $set update set
* @param int $cid 更新されたノードの主キー ID
*/
function update($set,$cid){
return $this->module-> ;update($ set,'where cid='.$cid); > // ノード情報を取得します'rgt'];
if(!empty($deep))$where.=' および level<'.$ node['level'] $deep;
if($deep==1){
$where.=' orderstyle desc で並べ替える' 🎜> return $this->module->ここで);
}
/**
* ノードとそのサブノードを選択します
* @param int $cid ノードの主キー ID
* @param int $deep 選択の深さ
*/
function get_parent($cid)
{
$node=$this->get_by_cid( $cid) ;
return $this->module->select('where lft<='.$node['lft'].' and rgt>='.$node['rgt'].' order by lft asc');
}
/**
* 子ノードを選択します*/
function get_children($pid,$deep=0){
//获取节点情報
$pnode=$this->get_by_cid($pid) ;
$where='where lft>'.$pnode['lft'].' そしてrgt if(!empty($deep))$where.=' and level<='.($pnode['level'] $deep);
if($deep==1){
$where.=' order by orderstyle desc';
}else{
$where.='order by lft asc';
}
return $this->module->select($where);
}
/**
* 深層サブノードを取得します
* @param int $cid ノードの主キー ID
* @param int $deepselection Depth
*/
function get_level_children($pid,$deep){
//获取节点情報
$pnode=$this-> get_by_cid($pid);
$where='where lft>'.$pnode['lft'].' そしてrgt $where.=' and level='.($pnode['level'] $deep);
$where.=' order by orderstyle desc';
return $this->module->select($where);
}
/**
* ノード情報の取得
* @param $cid ノードの主キー ID
* @return array $node
*/
function get_by_cid($cid){
$node=$this->module->detail('where cid=' .$cid);
if(!$node)$this->error(__FUNCTION__.'():获取节点'.$cid.'失败!');
$node を返す;
}
/**
* 子ノードの数を取得
* @param array $node ノード情報
* @return num
*/
function child_num($node){
return ($node['rgt']-$node['lft']-1)/2 ;
}
/**
* 階層による分類を表示
* @param int $cid ノードの主キー ID
* @output
*/
function display($cid)
{
$nodes=$this->select($cid);
foreach($nodes as $node){
echo str_repeat(' ',$node['level']-1).$node['cname']."n";
}
}
/*-------private----------------------------- ------*/
function error($msg){
die('ERROR : file '.__FILE__.' function '.$msg);
}
}
?>