//提取一级菜单 $sql="select a.*,b.BAS_URL from bas_menu_type a left join bas_menu b on a.MENU_ID=b.BAS_ID left join bas_admin_permission c on a.MENU_ID=c.MENU_ID where a.PARENT_ID='0' and (c.ADMIN_ID=".$_SESSION['iAdmin_Id']." or a.BAS_ID in (select PARENT_ID from bas_menu_type where PARENT_ID=a.BAS_ID)) order by a.BAS_ID"; $result=$db->query($sql); //如果一级菜单存在则开始菜单的显示 if($db->num_rows($result)>0) ShowTreeMenu($result,$layer); function ShowTreeMenu($result,$layer) { global $db,$permission_list; //取得需要显示的菜单的项目数 $numrows=$db->num_rows($result); //开始显示菜单,每个子菜单都用一个表格来表示 for($rows=0;$rows<$numrows;$rows++) { //将当前菜单项目的内容导入数组 $menu=$db->fetch_array($result); //提取菜单项目的子菜单记录集 $sql="select a.*,b.BAS_URL from bas_menu_type a left join bas_menu b on a.MENU_ID=b.BAS_ID left join bas_admin_permission c on a.MENU_ID=c.MENU_ID where a.PARENT_ID = '".$menu["BAS_ID"]."' and (c.ADMIN_ID=".$_SESSION['iAdmin_Id']." or a.BAS_ID in (select PARENT_ID from bas_menu_type where PARENT_ID=a.BAS_ID)) order by a.BAS_ID"; $result_sub=$db->query($sql); //如果该菜单项目没有子菜单 只显示菜单名 $str=""; if($db->num_rows($result_sub)>0) {
var faisunMenu_openedfolderimage_src="/sysadm/menutree/openedfolder.gif"; var faisunMenu_closedfolderimage_src="/sysadm/menutree/closedfolder.gif"; var faisunMenu_menufileimage_src="/sysadm/menutree/menufile.gif";var faisunMenu_treetext=new Array(); var faisunMenu_treeurl=new Array(); var faisunMenu_treeurltarget=new Array();var faisunMenu_treeNum=0;document.write("<style type='text/css'>.blockhide{display:none;} .blockmove{overflow: hidden;height:1px;display:block;} .blockshow{overflow: visible; display:block;} .hideme{overflow: visible;display:none;} .showme{overflow: visible;display:block;} .faisunMenu td{font-size:12px;} </style>");window.document.body.onselectstart=new Function("return false");function outinit(itemNo,dir,blockheight){ //缩小一个div的高度 var subfiles=document.getElementById("item"+itemNo); if(blockheight==0){ subfiles.className="blockshow"; subfiles.style.height=''; blockheight=parseInt(subfiles.offsetHeight); if(dir>0) subfiles.className="blockmove"; } var outinspeed=blockheight/10; var nowheight=parseInt(subfiles.offsetHeight)+outinspeed*dir; if(nowheight<=0){ subfiles.className="blockhide"; return; }else{ subfiles.className="blockmove"; } if(nowheight>=blockheight && dir>0){ subfiles.className="blockshow"; subfiles.style.height=''; return; } subfiles.style.height=nowheight; subfiles.scrollTop=blockheight; parentsresize(subfiles); setTimeout("outinit("+itemNo+","+dir+","+blockheight+")",15); }function parentsresize(obj){ //缩小父类div的高度 do{ if(obj.className=="faisunMenu"){ break; } if(obj.className=="blockshow"){ obj.style.height=""; } }while(obj=obj.parentElement); }function showhideit(itemNo){ var showfolder=document.images["openedfolderimage"+itemNo]; var hidefolder=document.images["closedfolderimage"+itemNo]; var subfiles=document.getElementById("item"+itemNo); if(subfiles.className=="blockmove") {return;} if(showfolder.className=="hideme") { hidefolder.className="hideme"; showfolder.className="showme"; outinit(itemNo,1,0); } else { showfolder.className="hideme"; hidefolder.className="showme"; outinit(itemNo,-1,0); } }function addtree(text,url,target){ faisunMenu_treetext.push(text); faisunMenu_treeurl.push(url?url:""); faisunMenu_treeurltarget.push(target?target:"mainframe"); }function getsubnum(text){ //算出前面有几个"-"号 var newtext=text.replace(/^-*/,""); return text.length-newtext.length; } function createtree(){ faisunMenu_treeNum++; var treestatus=new Array(); var treeendlayer=new Array(); var openedlayer=new Array(); var next_subnum=0; for(i=faisunMenu_treetext.length-1;i>=0;i--){ //从后面分析起,是否有为结束位置或有子树枝 var subnum=getsubnum(faisunMenu_treetext[i]); treestatus[i]=0; if(subnum<next_subnum){ //有子目录 treeendlayer[next_subnum]=0; treestatus[i]+=1; } if(!treeendlayer[subnum]){ //结束位置 treeendlayer[subnum]=1; treestatus[i]+=2; } //显然地,既有子目录又是结束位置时 treestatus[i]=3; next_subnum=subnum; }
var echo="<div class='faisunMenu'>"; for(i=0;i<faisunMenu_treetext.length;i++){ if(!faisunMenu_treetext[i]) continue; var subnum=getsubnum(faisunMenu_treetext[i]); var newtext=faisunMenu_treetext[i].replace(/^-*\*?/,"");
就我知道有三種方案: 1. 遞歸方法,數據表採用如下:id pid name,方法如樓上所說,不過可以將數據一次性讀出再進行遞歸,減少數據庫操作.2. 樹的遍歷方法,數據表採用如下:id left right name,每一個結點用左和右來標識.3. 不知道叫什麼,數據表採用如下:id name sortby,其中將一個結點的所有父結點保存在sortby中.
利用ASP读取数据库数据,生成XML文件,然后用JS调入XML数据生成树型菜单
$layer=1; //用来跟踪当前菜单的级数
//提取一级菜单
$sql="select a.*,b.BAS_URL
from bas_menu_type a left join bas_menu b on a.MENU_ID=b.BAS_ID
left join bas_admin_permission c on a.MENU_ID=c.MENU_ID
where a.PARENT_ID='0'
and (c.ADMIN_ID=".$_SESSION['iAdmin_Id']." or a.BAS_ID in (select PARENT_ID from bas_menu_type where PARENT_ID=a.BAS_ID)) order by a.BAS_ID"; $result=$db->query($sql);
//如果一级菜单存在则开始菜单的显示
if($db->num_rows($result)>0)
ShowTreeMenu($result,$layer);
function ShowTreeMenu($result,$layer)
{
global $db,$permission_list;
//取得需要显示的菜单的项目数
$numrows=$db->num_rows($result);
//开始显示菜单,每个子菜单都用一个表格来表示
for($rows=0;$rows<$numrows;$rows++)
{
//将当前菜单项目的内容导入数组
$menu=$db->fetch_array($result);
//提取菜单项目的子菜单记录集
$sql="select a.*,b.BAS_URL
from bas_menu_type a left join bas_menu b on a.MENU_ID=b.BAS_ID
left join bas_admin_permission c on a.MENU_ID=c.MENU_ID
where a.PARENT_ID = '".$menu["BAS_ID"]."'
and (c.ADMIN_ID=".$_SESSION['iAdmin_Id']." or a.BAS_ID in (select PARENT_ID from bas_menu_type where PARENT_ID=a.BAS_ID)) order by a.BAS_ID";
$result_sub=$db->query($sql);
//如果该菜单项目没有子菜单 只显示菜单名
$str="";
if($db->num_rows($result_sub)>0)
{
for($i=1;$i<=$layer;$i++)
$str.="-";
if($layer==1)
{
$str.="*";
}
if($menu["BAS_URL"]==NULL)
{
?>
addtree('<?php echo $str.$menu["BAS_NAME"]; ?>');
<?php
}
}
else
{
for($j=1;$j<=$layer;$j++)
$str.="-";
if($menu["BAS_URL"]!=NULL)
{
?>
addtree('<?php echo $str.$menu["BAS_NAME"]; ?>','<?php echo $menu["BAS_URL"];?>?Moudle_Id=<?php echo $menu["MENU_ID"];?>&Parent_Id=<?php echo $menu["PARENT_ID"];?>','mainFrame');
<?php
}
else
{
?>
addtree('<?php echo $str.$menu["BAS_NAME"]; ?>');
<?
}
}
//如果该菜单项目有子菜单,则显示子菜单
if($db->num_rows($result_sub)>0)
{
$layer++;
ShowTreeMenu($result_sub,$layer);
//子菜单处理完成,返回到递归的上一层,将级数减1
$layer--;
}
//继续显示下一个菜单项目
}//endfor;
$db->free_result($result_sub);
}//endfunction
$db->free_result($result);
?>
addtree('-*系统帮助','#','_self');
addtree('-查看首页','../index.html','');
addtree('-安全退出','sys/logout.php','mainFrame');
createtree();
//详细参数请查看 menutree/menutree.js
</script>
var faisunMenu_closedfolderimage_src="/sysadm/menutree/closedfolder.gif";
var faisunMenu_menufileimage_src="/sysadm/menutree/menufile.gif";var faisunMenu_treetext=new Array();
var faisunMenu_treeurl=new Array();
var faisunMenu_treeurltarget=new Array();var faisunMenu_treeNum=0;document.write("<style type='text/css'>.blockhide{display:none;} .blockmove{overflow: hidden;height:1px;display:block;} .blockshow{overflow: visible; display:block;} .hideme{overflow: visible;display:none;} .showme{overflow: visible;display:block;} .faisunMenu td{font-size:12px;} </style>");window.document.body.onselectstart=new Function("return false");function outinit(itemNo,dir,blockheight){ //缩小一个div的高度
var subfiles=document.getElementById("item"+itemNo);
if(blockheight==0){
subfiles.className="blockshow";
subfiles.style.height='';
blockheight=parseInt(subfiles.offsetHeight);
if(dir>0) subfiles.className="blockmove";
}
var outinspeed=blockheight/10;
var nowheight=parseInt(subfiles.offsetHeight)+outinspeed*dir;
if(nowheight<=0){
subfiles.className="blockhide";
return;
}else{
subfiles.className="blockmove";
}
if(nowheight>=blockheight && dir>0){
subfiles.className="blockshow";
subfiles.style.height='';
return;
}
subfiles.style.height=nowheight;
subfiles.scrollTop=blockheight;
parentsresize(subfiles);
setTimeout("outinit("+itemNo+","+dir+","+blockheight+")",15);
}function parentsresize(obj){ //缩小父类div的高度
do{
if(obj.className=="faisunMenu"){
break;
}
if(obj.className=="blockshow"){
obj.style.height="";
}
}while(obj=obj.parentElement);
}function showhideit(itemNo){
var showfolder=document.images["openedfolderimage"+itemNo];
var hidefolder=document.images["closedfolderimage"+itemNo];
var subfiles=document.getElementById("item"+itemNo);
if(subfiles.className=="blockmove") {return;} if(showfolder.className=="hideme") {
hidefolder.className="hideme";
showfolder.className="showme";
outinit(itemNo,1,0);
}
else {
showfolder.className="hideme";
hidefolder.className="showme";
outinit(itemNo,-1,0);
}
}function addtree(text,url,target){
faisunMenu_treetext.push(text);
faisunMenu_treeurl.push(url?url:"");
faisunMenu_treeurltarget.push(target?target:"mainframe");
}function getsubnum(text){ //算出前面有几个"-"号
var newtext=text.replace(/^-*/,"");
return text.length-newtext.length;
}
function createtree(){ faisunMenu_treeNum++;
var treestatus=new Array();
var treeendlayer=new Array();
var openedlayer=new Array(); var next_subnum=0;
for(i=faisunMenu_treetext.length-1;i>=0;i--){ //从后面分析起,是否有为结束位置或有子树枝
var subnum=getsubnum(faisunMenu_treetext[i]);
treestatus[i]=0;
if(subnum<next_subnum){ //有子目录
treeendlayer[next_subnum]=0;
treestatus[i]+=1;
}
if(!treeendlayer[subnum]){ //结束位置
treeendlayer[subnum]=1;
treestatus[i]+=2;
}
//显然地,既有子目录又是结束位置时 treestatus[i]=3;
next_subnum=subnum;
}
var echo="<div class='faisunMenu'>";
for(i=0;i<faisunMenu_treetext.length;i++){
if(!faisunMenu_treetext[i]) continue;
var subnum=getsubnum(faisunMenu_treetext[i]);
var newtext=faisunMenu_treetext[i].replace(/^-*\*?/,"");
if(treestatus[i]==1||treestatus[i]==3){
var havechild=1;
}else{
var havechild=0;
} if(treestatus[i]==2||treestatus[i]==3){
openedlayer[subnum]=0;
var barstatus=2;
}else{
openedlayer[subnum]=1;
var barstatus=1;
} var showme=faisunMenu_treetext[i].match(/^-*\*/);
var openfold=(i==faisunMenu_treetext.length-1?0:faisunMenu_treetext[i+1].match(/^-*\*/));
var li=i-1;
if(i>0&&(treestatus[li]==1||treestatus[li]==3)){
echo += "<div id='item"+faisunMenu_treeNum+li+"' class='"+(showme?"blockshow":"blockhide")+"'>";
}
echo += "<table border='0' cellspacing='0' cellpadding='0' "+(subnum==0?"height=25":"")+"><tr>\n";
for(j=1;j<subnum;j++){
echo += "<td width='20' valign=bottom><img src='/sysadm/menutree/"+(openedlayer[j]?"bar3.gif":"spacer.gif")+"' width='20' height='20'></td>\n";
}
if(subnum>0){
echo += "<td width='20' valign=bottom><img src='/sysadm/menutree/bar"+barstatus+".gif' width='20' height='20'></td>";
}
var clicktoshowhide=(havechild?" onclick='showhideit("+faisunMenu_treeNum+""+i+")' style='cursor:pointer;' ":"");
echo += "<td width='22' valign=bottom "+clicktoshowhide+"><img name='openedfolderimage"+faisunMenu_treeNum+""+i+"' src='"+(havechild?faisunMenu_openedfolderimage_src:faisunMenu_menufileimage_src)+"' class='"+(openfold?"showme":"hideme")+"' width='20' height='20'><img name='closedfolderimage"+faisunMenu_treeNum+""+i+"' src='"+(havechild?faisunMenu_closedfolderimage_src:faisunMenu_menufileimage_src)+"' class='"+(openfold?"hideme":"showme")+"' width='20' height='20'></td>";
echo += "<td nowrap valign=bottom><a onmousedown='return false;' "+clicktoshowhide+" "+(faisunMenu_treeurl[i]?"href='"+faisunMenu_treeurl[i]+"'":"name='#'")+" target='"+faisunMenu_treeurltarget[i]+"'>"+newtext+"</a></td></tr></table>\n\n"; if(barstatus==2&&!havechild){
for(j=subnum;j>=0;j--){
if(!openedlayer[j]) echo += "</div>";else break;
}
}
}
echo += "</div>";
document.write(echo); //清空列表以接受下一个菜单
faisunMenu_treetext=new Array();
faisunMenu_treeurl=new Array();
faisunMenu_treeurltarget=new Array();}
/************************* /例:
addtree("标题一","title1.htm");
addtree("-子目录一","sunmenu1.htm");
addtree("-子目录二","sunmenu1.htm");
createtree();.可以建立多个目录树,重复上面的代码即可..addtree()三个参数:
(1) 显示的文本,有几个"-"号表位于几层,"-"号后紧跟"*"号表该层默认展开
(2) URL;
(3) target,URL的打开目标窗口,默认"forummainframe"
createtree();生成一个目录树,可以生成多个/ ************************/
1. 遞歸方法,數據表採用如下:id pid name,方法如樓上所說,不過可以將數據一次性讀出再進行遞歸,減少數據庫操作.2. 樹的遍歷方法,數據表採用如下:id left right name,每一個結點用左和右來標識.3. 不知道叫什麼,數據表採用如下:id name sortby,其中將一個結點的所有父結點保存在sortby中.