解决方案 »
- HTML下拉选择如何以POST方法传递多个变量值给PHP?
- 点击做框架链接,右侧显示新浪rss xml文件,怎样修改显示背景色?
- cmd 下运行 php文件,在线等
- 请教一sql语句
- a!=''和isset(a)有何区别?
- 今天用zend加秘了一个文件,传到买的服务器上时,一切正常,可是在本机上就不行了
- 忘掉window.alert(...), 使用ReDialog吧!--欢迎下载与批评!(php)
- 急用,希望大虾不吝赐教。我只能给这么多分,如解决问题,我会再开帖子答谢的。
- PHP连接Oracle问题?
- 发图文的时候,同时也向推特跟Facebook转发
- PHP上传文件失败问题!求人给解答!急啊!在线等答案!
- 问题很简单,但是我怎么也调不通哦~~帮帮忙~~~~
利用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中.