欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP 无限级分类实现

程序员文章站 2023-01-24 22:47:55
asp递归无限级分类函数 复制代码 代码如下: <% '函数:getcatagory '功能:获得分类列表 '参数:cat_arr -> 分类数组(rscord...

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
set conn = server.createobject("adodb.connection")
set cmd = server.createobject("adodb.command")

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.name} 分类子分类:{$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)的分类

<%
set conn=server.createobject("adodb.connection")
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
%>