Avatar billede mini-me Nybegynder
25. december 2003 - 21:48 Der 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
                       
                    end if
            next
    end if 
       
    rs.movenext
    wend
   
    set rs = nothing
    conn.close
   
%>
Avatar billede fixxxer Nybegynder
25. december 2003 - 21:51 #1
kik lidt på den her

<%
WriteRecursiveTree 0, 0, Array(1,2,3)

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)," ","&nbsp;") & 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

%>
Avatar billede mini-me Nybegynder
25. december 2003 - 21:54 #2
Det skal lige uddybes lidt mere...
Avatar billede fixxxer Nybegynder
25. december 2003 - 21:55 #3
hvis du sender mig databasen kan jeg lave dig et fungerende eksempel
Avatar billede fixxxer Nybegynder
25. december 2003 - 21:55 #4
fixxxer@easysoft-studios.dk
Avatar billede netro Nybegynder
25. december 2003 - 21:58 #5
Avatar billede mini-me Nybegynder
25. december 2003 - 22:02 #6
Jeg sender det lige...
Avatar billede mini-me Nybegynder
25. december 2003 - 22:03 #7
er sendt
Avatar billede fixxxer Nybegynder
25. december 2003 - 22:04 #8
kikker på det så har du et eksempel om 10-15 minutters tid
Avatar billede fixxxer Nybegynder
25. december 2003 - 22:07 #9
kan jeg få dig til at smide den i en zip fil, mit outlook synes mdb-filer er for farlige :)
Avatar billede mini-me Nybegynder
25. december 2003 - 22:08 #10
hehe okay ;-)
Avatar billede fixxxer Nybegynder
25. december 2003 - 22:26 #11
jeg har snydt lidt og omdøbt navnene på dine kolloner i databasen

de hedder nu (med typebeskrivelsen i []):

topicid    [AUTO]  førhen  id
topicName  [TEKST] førhen  titel
topicText  [NOTAT] førhen  text
topicParent [TAL]  førhen  submenu


så vil kode se sådan ud:


<%
dim Conn

function OpenConn( DBName )

Set Conn = Server.CreateObject("ADODB.Connection")
ODBCpath = left(request.servervariables("PATH_TRANSLATED"), instrrev(request.servervariables("PATH_TRANSLATED"), "\"))
Conn.Open "DBQ=" & ODBCpath & DBName & ";DefaultDir=" & ODBCpath & ";Driver={Microsoft Access Driver (*.mdb)}"

end function

OpenConn("test.mdb")

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)," ","&nbsp;") & 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

%>
Avatar billede mini-me Nybegynder
25. december 2003 - 22:52 #12
det duer ikke, hvis jeg konventere min submenu til tal, kan jeg ikke bruge "," til at seperer siderne længere...
Avatar billede mini-me Nybegynder
25. december 2003 - 22:54 #13
Netro: du havde fat i noget af det rigtige...!
Avatar billede mini-me Nybegynder
25. december 2003 - 23:06 #14
Nogen der har nogle forslag?
Avatar billede netro Nybegynder
25. december 2003 - 23:17 #15
Ja, det var et eksempel, jeg lavede på et tidspunkt. Og det egner sig jo fint til netop menuer.

Der er lidt vejledning omkring rekursive funktioner her:
http://www.html.dk/scripts/asp/00015/
Avatar billede fixxxer Nybegynder
26. december 2003 - 01:00 #16
mini-me >> sådan virker mit eks. desværre ikke
Avatar billede mini-me Nybegynder
04. januar 2004 - 21:17 #17
lukker fandt ingen l'sning
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester