`
sony-soft
  • 浏览: 1015576 次
文章分类
社区版块
存档分类
最新评论

无限级分类-非递归

 
阅读更多

[CODE:]表menu_cls该表结构如下图:

CREATE TABLE IF NOT EXISTS `menu_cls` (
`id` int(4) NOT NULL auto_increment,
`parent_id` int(4) NOT NULL default '0',
`level` int(4) NOT NULL default '0',
`path` varchar(200) collate utf8_unicode_ci default NULL,
`title` varchar(40) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=29 ;

[CODE:]类Menu_Class.php

<?php
classMenu_Class{
private
$menu;
publicfunction
Set_Array($array){
$this->menu=$array;
}
publicfunction
Path_Line($i){ //随便放了几个符号
switch(
$i){
case
1:return'▲';break;
case
2:return'★';break;
case
3:return'◆';break;
case
4:return'●';break;
default:return
'→';break;
}
}
publicfunction
Path_Count($int){ //往前放点空格,分开层次
switch(
$int){
case
0:returnstr_repeat('&nbsp;&nbsp;',0);break;
default:return
str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;',$int).$this->Path_Line($int);break;
}
}
publicfunction
Menu_Output(){ //显示菜单
$rows=count($this->menu);
$level_max=$this->menu[$rows-1]['level'];
for(
$i=0;$i<$rows;$i++){
$select.=$this->Path_Count($this->menu[$i]['level']-1).$this->menu[$i]['title'].'</br>';
}
return
$select;
}
publicfunction
Menu_Select(){ //下拉菜单
$select='<selectname="parent_id">';
$select.='<optionvalue="0"selected="selected">--根目录--</option>';
$rows=count($this->menu);
for(
$i=0;$i<$rows;$i++){
$select.='<optionvalue="'.$this->menu[$i]['path'].'">'.$this->Path_Count($this->menu[$i]['level']-1).$this->menu[$i]['title'].'</option>';
}
$select.='</select>';
return
$select;
}
publicfunction
Path_Cut($path,$all){//将PATH分解并获取到当前路径,级别,以及父ID
$all_length=count($all);
if(
$path==0){//如果是根目录的话
if(is_array($all)){//如果已经有N条记录
$cls['path']=$all[$all_length-1]['id']+1;//现在的路径则为表中最后一个记录的ID+1
}else{
$cls['path']=$path+1;//否则从1开始
}
$cls['level']=1;//根目录默认层级为一级
$cls['parent_id']=0;//父ID为0
}else{
$cls['path']=$path.','.($all[$all_length-1]['id']+1);//获取路径为父级路径+此条记录ID
$level_arr=split(',',$path);
$cls['level']=count($level_arr)+1;//获取当前分类级别
$cls['parent_id']=$level_arr[$cls['level']-2];//获取父ID
}
return
$cls;
}
}
?>

[CODE:]使用 结果如下:

?<?php
require_once(
QuiZ_Path.'../Classes/FileName_Set.php');
$link=newExecSQL(); #SQL操作
$value=newValue_Leach();#值过滤
$menu=newMenu_Class();#菜单生成
if($_POST['Submit']=='提交'){
$link->SetSQL("Select*From".Base::$Menu_Left."orderbyid");
$all=$link->Query_array();
$all_length=count($all);
$cls=$menu->Path_Cut($value->_Post('parent_id'),$all); #值分解成$cls['parent_id'],$cls['level'],$cls['path']
$link->SetSQL("InSertInto".Base::$Menu_Left."(parent_id,level,title,path)values(:parent_id,:level,:title,:path)");
$link->bindParam(":parent_id",$cls['parent_id']);
$link->bindParam(":level",$cls['level']);
$link->bindParam(":title",$value->_Post('title'));
$link->bindParam(":path",$cls['path']);
$link->Query_noreturn();
$link->Inf_right('','add.php');
}
$link->SetSQL("Select*From".Base::$Menu_Left."orderbypath");
$menu->Set_Array($link->Query_array());

$this->assign('menu',$menu->Menu_Output());#使用菜单

Smarty->assign('menu_select',$menu->Menu_Select());#使用下拉菜单
$Smarty->display('add.tpl');
?>

SELECTMENU

刚开始考虑的时候,确实迷糊了.不过想清楚了就变得简单了,嘿嘿

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics