25. december 2003 - 21:48Der er
16 kommentarer og 1 løsning
Dynamisk menu
Hej Eksperter,
jeg har et problem, har oprettet en tabel i access hvor jeg har gemt alle mine sider, nu er det så sådan engang at jeg gerne vil have nogle hovedsider som har undersider og som igen har undersider eks.:
Hovedside --Underside ---Underside til underside ---Underside2 til underside ----Underside til underside2 --Underside2 --Underside3 Hovedside2 --Underside Hovedside3 Hovedside4
Min test tabel ser sådan ud
id|titel|text|submenu
Submenu bruges til at gemme id'et på de sider som skal være undersider til den valgte side.
Mit problem er bare at jeg mener at jeg have lavet en rutine der gør arbejdet, for lige nu sidder jeg fast i flg. kode:
<!-- #INCLUDE FILE="../../dbconn.asp" --> <% strSQL = "SELECT * From Test1" set rs = conn.execute(strSQL)
while not rs.eof or rs.bof
if len(rs("submenu")) <> "" then response.Write("+" & rs("Titel") & "<br>") menuArr = split(rs("Submenu"),",")
' her skal udarbejdes noget script der k'rer for each menu in menuArr mnuSQL = "SELECT Id, Titel, submenu from Test1 where id=" & menu set menuRS = conn.execute(mnuSQL) response.Write("--" & menuRS("Titel") & "<br>") if menuRS("Submenu") <> "" then submenuArr = split(menuRs("Submenu"),",") for each subMenu in submenuArr subSQL = "SELECT Id, Titel, submenu from Test1 where id=" & subMenu set subRs = conn.execute(subSQL) response.Write("---" & subRs("Titel") & "<br>") next
Sub WriteRecursiveTree(ByVal iParent, ByVal iLevel, ByVal aOpened) Dim sSQL, oRS Set oRS = Server.CreateObject("Adodb.RecordSet") sSQL = "SELECT * FROM topic WHERE parent_id = " & iParent Do While Not oRS.EOF Response.write Replace(Space(3 * iLevel)," "," ") & oRS("topic_name") & "<br>" If IsElementOfArray(oRS("topic_id"), aOpened) Then WriteRecursiveTree oRS("topic_id"), iLevel + 1, aOpened End If Loop oRS.Close Set oRS = Nothing
End Sub
Function IsElementOfArray(var,arr) Dim element IsElementOfArray = False If Not IsArray(arr) Then Exit Function
If IsArray(arr) Then For Each element In arr If var = element Then IsElementOfArray = True Exit For End If Next End If End Function
function FindParents(ByVal FirstNode) Dim iResult Dim iLast Dim iCurrent
set rs = Conn.Execute("SELECT * FROM test1 WHERE topicID = " & FirstNode) iCurrent = rs("topicID") Do While not rs("topicParent") = 0 iResult = rs("topicParent") & "/" & iResult 'use / for to make it look "better" ? iLast = rs("topicParent") set rs = Conn.Execute("SELECT * FROM test1 WHERE topicID = " & iLast) Loop
FindParents = iResult & iCurrent
end function
aOpened = Split(Request("path"),"/") ' note that this will create an array of strings, not of integers. ' when you compare them with id's from a database, you'll have to ' convert these Strings to Long, or convert the ID from the database to String ' because a String is never equal to a Long
WriteRecursiveTree 0, 0, aOpened
Sub WriteRecursiveTree(ByVal iParent, ByVal iLevel, ByVal aOpened) Dim sSQL, oRS Set oRS = Server.CreateObject("Adodb.RecordSet") sSQL = "SELECT * FROM test1 WHERE topicParent = " & iParent oRS.Open sSQL, Conn, 1, 1 Do While Not oRS.EOF Response.write "<a href=""?path=" & FindParents(oRS("topicID")) & """>" & Replace(Space(3 * iLevel)," "," ") & oRS("topicName") & "</a><br>" If IsElementOfArray(Cstr(oRS("topicID")), aOpened) Then WriteRecursiveTree oRS("topicID"), iLevel + 1, aOpened End If oRS.MoveNext Loop oRS.Close Set oRS = Nothing
End Sub
Function IsElementOfArray(var,arr) Dim element IsElementOfArray = False If Not IsArray(arr) Then Exit Function
If IsArray(arr) Then For Each element In arr If var = element Then IsElementOfArray = True Exit For End If Next End If End Function
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.