自己修改的动力无限分类修改代码

    技术2022-05-11  70

    自己修改的动力无限分类修改代码郁闷的是动力无限分类OrderID的排序问题好奇怪.改完了才发现,OrderID是按照RootID来排序的(即如果栏目的RootID相同,那么OrderID不论层次的一直递增.).这样子用一句seletc * from Class Order by RootID,OrderID就可以按照栏目一级一级的显示出来.

    '系统页面加载初始化参数设定

    ClassID=request("ClassID")if ClassID="" or not isnumeric(ClassID) then response.Write("<script>alert('传递参数错误!系统即将返回!');history.go(-1);</script>") response.End()end if

    '类别列表读取函数

    Function ShowClassFormOption(sChannelID,CurrentID,sClassDepth) dim rsClass,sqlClass,sTemp,tmpClassDepth,i,n dim arrShowLine(10)

     for i=0 to ubound(arrShowLine)  arrShowLine(i)=False next  sTemp="<option value=""0"""  if CurrentID=0 then sTemp=sTemp & " selected"">顶级类别</option>"

      sqlClass="Select ClassID,ClassName,ClassDepth,ChannelID,RootID,OrderID From SoftClass "  if sClassDepth>0 then  sqlClass=sqlClass & " where ClassDepth<"&sClassDepth&" order by ParentIDPath,OrderID" else  sqlClass=sqlClass & " order by ParentIDPath,OrderID" end if  set rsClass=conn.Execute(sqlClass)   if rsClass.bof and rsClass.bof then  ShowClassFormOption = sTemp & "<option value="""">添加顶级类别</option>"  rsClass.close   set rsClass=Nothing   Exit Function else  ClassRecord=rsClass.GetRows(-1)  '获取最后一行记录  '数据字段1,类别ID,ClassID  '数据字段2,类别名称,ClassName  '数据字段3,类别深度,ClassDepth  '数据字段4,类别ID,Class  rsClass.close  set rsClass=Nothing  End if    Dim sChecked, tempClassName  For i=0 to Ubound(ClassRecord,2)  tmpClassDepth=ClassRecord(2,i)  '数据字段3,类别深度,ClassDepth  if ClassRecord(3,i)>0 then   arrShowLine(tmpClassDepth)=True  else   arrShowLine(tmpClassDepth)=False  end if    sChecked = "" : tempClassName = ""  if ClassRecord(0,i)=CurrentID then sChecked = " selected"    if tmpClassDepth>0 then   for n=1 to tmpClassDepth    tempClassName = tempClassName & "  "     if n=tmpClassDepth then     if ClassRecord(3,i)>0 then      tempClassName = tempClassName & "├ "     else      tempClassName = tempClassName & "└ "     end if    else     if arrShowLine(n)=True then      tempClassName = tempClassName & "│"     else      tempClassName = tempClassName & " "     end if    end if   next  end if      tempClassName = tempClassName & ClassRecord(1,i)    sTemp=sTemp & "<option value=""" & ClassRecord(0,i) & """ "&sChecked&">" & tempClassName & "</option>" Next  ShowClassFormOption=sTemp ClassRecord=EmptyEnd Function

    if request("action")="EditSave" then

    ChannelID=cint(trim(Request.Form("ChannelID")))ParentClassID=trim(Request.Form("ParentID"))ClassName=trim(Request.Form("ClassName"))ClassFolderName=trim(Request.Form("ClassFolderName"))ClassMemo=trim(Request.Form("ClassMemo"))ClassKeyWords=trim(Request.Form("ClassKeyWords"))ClassDescription=trim(Request.Form("ClassDescription"))IsCreateFolder=trim(Request.Form("IsCreateFolder"))oldParentClassIDPath=trim(Request.Form("oldParentIDPath"))

    if ClassName="" Thenresponse.write("<script>alert('系统出错!请返回填写栏目类别名称');history.go(-1);</script>") response.End() end if

    if ClassFolderName="" Thenresponse.write("<script>alert('系统出错!请返回填写栏目类别目录文件夹');history.go(-1);</script>") response.End() end if

    if ClassMemo="" Thenresponse.write("<script>alert('系统出错!请返回填写栏目类别说明');history.go(-1);</script>") response.End() end if

    if ClassKeyWords="" Thenresponse.write("<script>alert('系统出错!请返回填写栏目类别搜索关键字');history.go(-1);</script>") response.End() end if

    if ClassDescription="" Thenresponse.write("<script>alert('系统出错!请返回填写栏目类别搜索描述词');history.go(-1);</script>") response.End() end if

    If IsValidWindowsFolderName(ClassFolderName)=False Then response.Write("<script language=javascript>alert('目录名格式不正确,按确定返回重新填写');history.back();</script>") response.End()end if

    ClassFolderName=Replace(PCase(ClassFolderName)," ","-")

    '查询网站频道项目 set rs=server.CreateObject("Adodb.recordset") sql="select * from SystemChannelList Where ChannelID="&ChannelID rs.open sql,conn,1,3 if rs.eof and rs.bof then rs.close set rs=nothing conn.close set conn=nothing response.write("<script>alert('无此数据,系统即将返回!');location.href='ClassList.asp';</script>") response.End()     else  ChannelName  =rs("ChannelName") ChannelFolderUrl=rs("ChannelFolderUrl") ChannelFolderPath=rs("ChannelFolderPath") end if  rs.close set rs=nothing

    '查询父类别ID是否改变

      set rsClass=server.CreateObject("Adodb.recordset")  sqlClass="select * from SoftClass where ClassID="&ClassID  rsClass.open sqlClass,conn,1,3  if rsClass.eof and rsClass.bof then  response.write("<script>alert('错误!未查询到对应类别!系统即将返回');location.href='ClassList.asp';</script>")   response.End()   else    if rsClass("ParentID")<>ParentClassID then   '更改了所属栏目,则要做一系列检查  if ParentClassID=rsClass("ClassID") then   response.write("<script>alert('所属栏目不能为自己!!系统即将返回');location.href='ClassList.asp';</script>")     response.End()     end if  '判断所指定的栏目是否为外部栏目或本栏目的下属栏目  if rsClass("ParentID")=0 then   if ParentClassID>0 then    set trs=conn.execute("select RootID From SoftClass where ClassID="&ParentClassID)    if trs.bof and trs.eof then    response.write("<script>alert('找不到移动到的栏目!系统即将返回');location.href='ClassList.asp';</script>")      response.End()    else    if rsClass("RootID")=trs(0) then    response.write("<script>alert('不能指定该栏目的下属栏目作为所属栏目!系统即将返回');location.href='ClassList.asp';</script>")      response.End()         end if    end if    trs.close    set trs=nothing   end if  else   set trs=conn.execute("select ClassID From SoftClass where ParentIDPath like '"&rsClass("ParentIDPath")&"," & rsClass("ClassID") & "%' and ClassID="&ParentClassID)   if not (trs.eof and trs.bof) then    response.write("<script>alert('不能指定该栏目的下属栏目作为所属栏目!系统即将返回');location.href='ClassList.asp';</script>")      response.End()   end if   trs.close   set trs=nothing  end if   end if '读取类别相关历史数据  if rsClass("ParentID")=0 then   oldParentID=rsClass("ClassID")  oldParentClassID=0 '判断以前是否是顶级栏目 else  oldParentID=rsClass("ParentID")  oldParentClassID=rsClass("ParentID") '判断以前是否是顶级栏目 end if oldClassDepth=rsClass("ClassDepth") oldChild=rsClass("Child") oldRootID=rsClass("RootID") oldParentIDPath=rsClass("ParentIDPath") oldPrevID=rsClass("PrevID") oldNextID=rsClass("NextID") oldOrderID=rsClass("OrderID") rsClass.close set rsClass=nothing   

    if ParentClassID=0 then '查询父类相关数据 ParentClassName=""  '父类名 ParentClassFolderName=""  '父类目录名 ClassFolderPath=ClassFolderName ClassLocalPath=ChannelFolderPath&"/"&ClassFolderPath ClassFolderUrl=ChannelFolderUrl&"/"&Replace(ClassFolderPath,"/","/")else'查询父类相关数据 set rs=server.CreateObject("Adodb.recordset") sql="select * from SoftClass where ClassID="&ParentClassID rs.open sql,conn,1,3 if rs.eof and rs.bof then response.write("<script>alert('未能查询到父类类别对应的数据!系统即将返回上一页');history.go(-1);</script>")  response.End() else  ParentClassID=rs("ClassID") ParentClassName=rs("ClassName")  '父类名 ParentClassFolderName=rs("ClassFolderName")  '父类目录名 ParentClassFolderPath=rs("ClassFolderPath")  '父类目录名 ParentClassFolderUrl=rs("ClassFolderUrl")  '父类访问路径 end if rs.close set rs=nothing

    '根据父类数据得到当前路径相关参数 ClassFolderPath=ParentClassFolderPath&"/"&ClassFolderName ClassLocalPath=ChannelFolderPath&"/"&ClassFolderPath ClassFolderUrl=ChannelFolderUrl&"/"&Replace(ClassFolderPath,"/","/") end if'创建对应的类别目录if IsCreateFolder=1 thenCreateFolder ClassLocalPath,IsCreateFolderend if 

      '假如更改了所属栏目  '则要更新其原来所属栏目信息,包括深度、父级ID、栏目数、排序等数据  if clng(oldParentID)<>ParentClassID and not (oldParentClassID=0 and ParentClassID=0) then   '不为一级目录且非原来父类(更改了所属栏目)   '更新原来同一父栏目的上一个栏目的NextID和下一个栏目的PrevID if oldPrevID>0 then  conn.execute "update SoftClass set NextID=" & oldNextID & " where ClassID=" & oldPrevID end if if oldNextID>0 then  conn.execute "update SoftClass set PrevID=" & oldPrevID & " where ClassID=" & oldNextID end if

     MaxRootID=conn.execute("select max(RootID) as List1 From SoftClass")("List1")'最后顶级分类记录 '如果原来不是一级分类改成一级分类   if oldParentClassID>0 and ParentClassID=0 then   '如果原来不是一级分类改成一级分类  '得到上一个一级分类栏目  sql="select ClassID,NextID,RootID,ClassDepth from SoftClass where RootID=" & MaxRootID & " and ClassDepth=0"  set rs=server.CreateObject("Adodb.recordset")  rs.open sql,conn,1,3  PrevID=rs(0)  '得到新顶级分类栏目的PrevID值  rs(1)=ClassID  '更新前一个顶级分类栏目的NextID值  rs.update  rs.close  set rs=nothing    ClassCount=conn.execute("select count(*) as List1 From SoftClass where ParentID=0")("List1")+1    '更新当前栏目数据  conn.execute("update SoftClass set ClassDepth=0,OrderID="&ClassCount&",RootID=0,ParentID=0,ParentIDPath='0',PrevID=" & PrevID & ",NextID=0 where ClassID="&ClassID)  '如果有下属栏目,则更新其下属栏目数据。  '下属栏目的排序不需考虑,只需更新下属栏目深度和一级排序ID(RootID)数据  if oldChild>0 then   i=0   tempParentIDPath=oldParentIDPath & ","   set rs=conn.execute("select * From SoftClass where ParentIDPath like '%"&tempParentIDPath & ClassID&"%'")   do while not rs.eof    i=i+1    mParentIDPath=replace(rs("ParentIDPath"),"0,"&ClassID)    conn.execute("update SoftClass set ClassDepth=ClassDepth-"&oldClassDepth&",RootID="&ClassID&",ParentIDPath='"&mParentIDPath&"' where ClassID="&rs("ClassID"))    rs.movenext   loop   rs.close   set rs=nothing  end if    '更新其原来所属栏目的栏目数,排序相当于剪枝而不需考虑  conn.execute("update SoftClass set child=child-1 where ClassID="&oldParentClassID)  '如果是将一个分栏目移动到其他分栏目下 elseif oldParentClassID>0 and ParentClassID>0 then    '如果是将一个分栏目移动到其他分栏目下        '获得新的父类栏目的相关信息    set trs=conn.execute("select * From SoftClass where ClassID="&ParentClassID)  if trs("Child")>0 then     '得到与本栏目同级的最后一个栏目的OrderID   set rsPrevOrderID=conn.execute("select Max(OrderID) From SoftClass where ParentID=" &ParentClassID)   PrevOrderID=rsPrevOrderID(0)   '得到与本栏目同级的最后一个栏目的ClassID   sql="select ClassID,NextID,ParentID,OrderID from SoftClass where ParentID=" & ParentClassID & " and OrderID=" & PrevOrderID   set rs=server.createobject("adodb.recordset")   rs.open sql,conn,1,3   PrevID=rs(0)    '得到新的PrevID   rs(1)=ClassID     '更新上一个栏目的NextID的值   rs.update   rs.close   set rs=nothing      '得到同属于一个父栏目但比本栏目级数大的子栏目的最大OrderID,如果比前一个值大,则改用这个值。   '最大的所属父类子栏目OrderID可能是自己   set rsPrevOrderID=conn.execute("select Max(OrderID) From SoftClass where ParentIDPath like '" & trs("ParentIDPath") & "," & ParentClassID & ",%'")   if (not(rsPrevOrderID.bof and rsPrevOrderID.eof)) then    if not IsNull(rsPrevOrderID(0))  then      if rsPrevOrderID(0)>PrevOrderID then      PrevOrderID=rsPrevOrderID(0)     end if    end if   end if  else  '移动到新的没有子栏目的栏目下   PrevID=0   PrevOrderID=trs("OrderID")  end if      '更新当前栏目数据  conn.execute("update SoftClass set ClassDepth="&trs("ClassDepth")&"+1,OrderID="&PrevOrderID&"+1,RootID="&trs("RootID")&",ParentID="&ParentClassID&",ParentIDPath='" & trs("ParentIDPath") & "," & ParentClassID & "',PrevID=" & PrevID & ",NextID=0 where ClassID="&ClassID)    '得到当前栏目的下属子栏目数  tempParentIDPath=oldParentIDPath & ","      '如果有子栏目则更新子栏目数据,深度为原来的相对深度加上当前所属栏目的深度  set rs=conn.execute("select * From SoftClass where ParentIDPath like '%"&tempParentIDPath&ClassID&"%' order by OrderID")  i=1  do while not rs.eof   i=i+1   ParentClassIDPath=trs("ParentIDPath") & "," & ParentClassID & "," & replace(rs("ParentIDPath"),tempParentIDPath,"")      conn.execute("update SoftClass set ClassDepth=ClassDepth-"&oldClassDepth&"+"&trs("ClassDepth")&"+1,OrderID="&PrevOrderID&"+"&i&",RootID="&trs("RootID")&",ParentIDPath='"&ParentClassIDPath&"' where ClassID="&rs("ClassID"))   rs.movenext  loop  rs.close  set rs=nothing  trs.close  set trs=nothing    '更新新的所属上级栏目的子栏目数  conn.execute("update SoftClass set child=child+1 where ClassID="&ParentClassID)    '更新原来所属上级栏目的子栏目数     conn.execute("update SoftClass set child=child-1 where ClassID="&oldParentClassID)  '更新原来父类下的同级栏目的排序  ClassCount=conn.execute("select count(*) as List1 From SoftClass where ParentIDPath like '%"&oldParentIDPath &"%'")("List1")  if not isnull(ClassCount) then  '在获得移动过来的栏目数后更新排序在指定栏目之后的栏目排序数据  conn.execute("update SoftClass set OrderID=OrderID-1 where ParentIDPath='" &tempParentIDPath&ClassID& "' and OrderID>" & oldOrderID)  end if      '如果原来是一级栏目改成其他栏目的下属栏目  else      '如果原来是一级栏目改成其他栏目的下属栏目  '得到移动的栏目总数  ClassCount=conn.execute("select count(*) as List1 From SoftClass where RootID="&oldRootID)("List1")    '获得目标栏目的相关信息(PrevID,PrevOrderID)   set trs=conn.execute("select * From SoftClass where ClassID="&ParentClassID)  if trs("Child")>0 then     '得到与本栏目同级的最后一个栏目的OrderID   set rsPrevOrderID=conn.execute("select Max(OrderID) From SoftClass where ParentID=" &ParentClassID )   PrevOrderID=rsPrevOrderID(0)   sql="select ClassID,NextID,ParentID,OrderID from SoftClass where ParentID=" &ParentClassID& " and OrderID=" & PrevOrderID   set rs=server.createobject("adodb.recordset")   rs.open sql,conn,1,3   PrevID=rs(0)   rs(1)=ClassID   rs.update   set rs=nothing      '得到同一父栏目但比本栏目级数大的子栏目的最大OrderID,如果比前一个值大,则改用这个值。   set rsPrevOrderID=conn.execute("select Max(OrderID) From SoftClass where ParentIDPath ='" & trs("ParentIDPath") & "," & ParentClassID & "'")   if (not(rsPrevOrderID.bof and rsPrevOrderID.eof)) then    if not IsNull(rsPrevOrderID(0))  then      if rsPrevOrderID(0)>PrevOrderID then      PrevOrderID=rsPrevOrderID(0)     end if    end if   end if  else   PrevID=0   PrevOrderID=0  end if   '在获得移动过来的栏目数后更新排序在指定栏目之后的栏目排序数据    conn.execute("update SoftClass set PrevID=" & PrevID & ",NextID=0 where ClassID=" & ClassID)  tempParentIDPath=trs("ClassIDPath")    set rs=conn.execute("select * From SoftClass where ParentID="&oldParentClassID&" order by OrderID")  i=0  do while not rs.eof   i=i+1   if rs("ParentID")=0 then        conn.execute("update SoftClass set ClassDepth=ClassDepth+"&trs("ClassDepth")&"+1,OrderID="&PrevOrderID&"+"&i&",RootID="&trs("ClassID")&",ParentIDPath='"&trs("ClassIDPath")&"',ParentID="&ParentClassID&" where ClassID="&rs("ClassID"))   else    tempParentIDPath=trs("ParentIDPath") & "," & ParentClassID & "," & replace(rs("ParentIDPath"),"0,","")        conn.execute("update SoftClass set ClassDepth=ClassDepth+"&trs("ClassDepth")&"+1,RootID="&trs("RootID")&",ParentIDPath='"&tempParentIDPath&"' where ClassID="&rs("ClassID"))   end if   rs.movenext  loop  rs.close  set rs=nothing  trs.close  set trs=nothing  '更新所指向的上级栏目栏目数    conn.execute("update SoftClass set child=child+1 where ClassID="&ParentClassID)    end ifend if

    end if'获取数据库参数

        '添加新数据并修改相关字段数值    UserIP = Request.ServerVariables("HTTP_X_FORWARDED_FOR")  If UserIP = "" Then UserIP = Request.ServerVariables("REMOTE_ADDR")    UserFrom=Cstr(Request.ServerVariables("HTTP_REFERER"))   CorrectSqlClassFolderName=replace(ClassFolderName,"'","''") CorrectSqlClassName=replace(ClassName,"'","''")     set rs=server.CreateObject("Adodb.recordset") sql="select * from SoftClass where ClassID="&ClassID rs.open sql,conn,3,3 if rs.eof and rs.bof then rs.close set rs=nothing conn.close set conn=nothing response.write("<script>alert('栏目类别数据不存在!系统即将返回');history.go(-1);</script>")  response.end else  rs("ChannelID")=ChannelID rs("ChannelName")=ChannelName rs("ChannelFolderPath")=ChannelFolderPath rs("ChannelFolderUrl")=ChannelFolderUrl  if ParentClassID=0 then rs("ParentName")=""   else rs("ParentName")=ParentClassName  end if   rs("ClassName")=ClassName  rs("ClassFolderName")=ClassFolderName rs("ClassFolderPath")=ClassFolderPath  rs("ClassLocalPath")=ClassLocalPath    rs("ClassMemo")=ClassMemo rs("ClassKeyWords")=ClassKeyWords rs("ClassDescription")=ClassDescription rs("IsCreateFolder")=IsCreateFolder

       rs("UpdateUser")=Session("ManagerUserName") rs("UpdateTime")=now() rs("UpdateIP")=UserIP rs("UpdateFrom")=UserFrom rs.update   end if rs.close set rs=nothing     conn.close set conn=nothing response.write("<script>alert('栏目类别"&ClassName&"修改完成!系统即将返回列表');location.href='ClassList.asp';</script>")  response.End()

    end if 


    最新回复(0)