做企业网站时可能会碰到客户需要无限级产品分类,大体思路如下。
表category用来存分类
其中字段parentid是用来存放父分类的编号,字段category是分类名,字段order是用来排序的。
读数据的时候,先读出parentid为0的分类(也就是一级分类)进行循环,在循环语句中调用预先定义好的过程,过程中又有自身的循环,从而打到目的,主要代码如下:
程序代码
<table cellpadding="0" cellspacing="0" class="MainTable" style="width:750px;" align="center">
<tr><td class="header" colspan="3">产品分类管理</td></tr>
<tr>
<th style="width:42%;">类别名称</th>
<th style="width:42%;">英文类别名称</th>
<th style="width:16%;">操作选项</th>
</tr>
<%
set rs = server.CreateObject("adodb.recordset")
rs.open "select * from category where parentid=0 order by [order],id desc",conn,1,1
if rs.eof and rs.bof then
%>
<tr><td colspan="3" align="center">暂时没有产品类别</td></tr>
<%
else
do while not rs.eof
%>
<tr>
<td><%=rs("category")%></td>
<td><%=rs("category_en")%></td>
<td><a href="Category.asp?action=edit&id=<%=rs("id")%>">编辑</a> | <a href="inc/process.asp?item=category&action=del&id=<%=rs("id")%>">删除</a></td>
</tr>
<%
Response.Write getlist(rs("id"),0)
rs.movenext
loop
end if
rs.close
set rs = nothing
%>
</table>
调用函数
程序代码
--获取分类以表格形式列出------------------
Function getlist(parentid,k)
Dim Rss
Set Rss = Conn.Execute("select * from category where parentid="&parentid&" order by [order],id desc")
Do While Not Rss.EOF
getlist = getlist & "<tr><td>" & tmp(k) & Rss("category") &"</td><td>" & tmp(k) & Rss("category_en") &"</td><td><a href=Category.asp?action=edit&id=" & rss("id") & ">编辑</a> | <a href=inc/process.asp?item=category&action=del&id="&rs("id")&">删除</a></td></tr>"
getlist = getlist & getlist(Rss("Id"),k+1)
Rss.MoveNext
Loop
Rss.close
set Rss = nothing
End Function
每次输出分类时都与父分类在列方向相差一个空格
程序代码
--分类名之前添加空格----------------------
Private Function tmp(n)
Dim i
For i = 0 To n
tmp = tmp & " "
Next
End Function
搞定。