ASP 无限级分类实现

2018-09-06 12:52

阅读:490

  ASP递归无限级分类函数
复制代码 代码如下:
<%
函数:getCatagory
功能:获得分类列表
参数:cat_arr -> 分类数组(Rscordset:id:分类编号,pid:上级分类,classname:分类名称,childs:子分类)
按此输出些sql语句,用getRows获取得到的数据
cat_pid -> 上级分类编号
cat_childs -> 下级分类编号
cat_select -> 选择的分类
cat_dir -> 分类级别
返回:返回分类列表(Option)

dim conn,cmd,rs,cat_arr

conn.Open Provider=Microsoft.Jet.OLEDB.4.0; Data Source= & Server.MapPath(db1.mdb)
cmd.ActiveConnection = conn
cmd.CommandText = Select * from cate order by id desc
Set rs = cmd.Execute
cat_arr = rs.GetRows()
Set rs = Nothing
Set cmd = Nothing
Set conn = Nothing

getCatagory cat_arr,0,,,,{$cat.dir}├─<a href=?id={$cat.id} title=分类级别:{$cat.dir} 分类编号:{$cat.id} 分类上级编号:{$cat.pid} 分类名称: 分类子分类:{$cat.childs}>{$cat.name} </a><br />&vbcrlf

function getCatagory(byval cat_arr,byval cat_pid,byval cat_childs,byval cat_select,byval cat_dir,byval format)
dim i,tmp
if isArray(cat_arr) then
for i=0 to ubound(cat_arr,2)
if cat_arr(1,i) = cat_pid and instr(, & cat_childs & ,,, & cat_arr(0,i) & ,) = 0 then
tmp = format
if instr(tmp,{$cat.dir})>0 then tmp = replace(tmp,{$cat.dir},cat_dir)
if instr(tmp,{$cat.id})>0 then tmp = replace(tmp,{$cat.id},cat_arr(0,i))
if instr(tmp,{$cat.pid})>0 then tmp = replace(tmp,{$cat.pid},cat_arr(1,i))
if instr(tmp,{$cat.name})>0 then tmp = replace(tmp,{$cat.name},cat_arr(2,i))
if instr(tmp,{$cat.childs})>0 then tmp = replace(tmp,{$cat.childs},cat_arr(3,i))
response.write tmp
call getCatagory(cat_arr,cat_arr(0,i),cat_childs,cat_select,cat_dir & │,format)
end if
next
end if
end function
%>

转载的一个递归函数,比较典型的应用,没有特别算法,目前我们一般常见的无限级分类函数均大同小异。简单整理了一下,包括示例打包getCatagory.rar

*大类1
└二级小类1
└三级小类1
└四级小类1
└五级小类1
*大类2
└二级小类2
*大类3

数据库说明:数据库db.mdb,classTable表的结构:classid类别ID(自动增长) parentid 父级ID 默认为0 (0代表最高级) classname类别名,classdepth是为了记录类别的级数 ———————————————-
classid classname parentid classdepth
———————————————-

主要代码:

复制代码 代码如下:
//先取出最高级(parentid=0)的分类

<%
conn.open Provider=Microsoft.Jet.Oledb.4.0;data source=&server.MapPath(db.mdb)
set rs1=server.createobject(adodb.recordset)
sql1=select * from Classtable where parentid=0 order by classid
rs1.open sql1,conn,1,1
if rs1.eof or rs1.bof then
response.write还没分类!
else
while not rs1.eof
id1=rs1(classid)
name1=rs1(classname)

response.write *<a href=class.asp?id=&id1&&name=&name1&‘>&name1&</a><br>
parentid1=rs1(parentid)
call reclass(id1)
rs1.movenext
wend
end if
rs1.close
set rs1=nothing


sub reclass(id)
‘递归调用函数,生成一个类别代码
set rs=server.createobject(adodb.recordset)
sql=select * from classtable where parentid=&id
rs.open sql,conn,1,1
i=1
while not rs.eof
id0=rs(classid)
classname0=rs(classname)
parentid0=rs(parentid)
classdepth0=rs(classdepth)
brstr=
for j=1 to classdepth0
brstr= &brstr
next
response.write(brstr&└<a href=class.asp?id=&id0&&name=&classname0&‘>&classname0&</a><br>)
call reclass(id0)

rs.movenext
i=i+1
wend
rs.close
set rs=nothing
end sub

if request(a)=add then
call add
end if
if request(name)<> then
%>
<table width=80% align=center cellpadding=0″ cellspacing=0″>
<form action=class.asp?a=add&id=<%=request(id)%> method=post>
<tr>
<td> </td>
<td>在<font color=#FF0000″><%=request(name)%></font>添加小类</td>
</tr>
<tr>
<td>类别名:</td>
<td><input name=classname type=text id=classname></td>
</tr>
<tr>
<td> </td>
<td><input type=submit name=Submit value=提交></td>
</tr>
</form>
</table>
<%end if
sub add 添加类别
id=request(id)
classname=request(classname)
set rs=server.createobject(adodb.recordset)
rs.open select parentid,classdepth from classtable where classid=&id,conn,1,1
parentid=rs(0)
classdepth=rs(1)+1
rs.close
set rs=nothing
sql=INSERT INTO classtable (classname,parentid,classdepth) values (&classname&‘,&id&,&classdepth&)
conn.execute sql
response.Write<script>alert(添加成功!);location.href=class.asp;</script>
end sub
%>


评论


亲,登录后才可以留言!