Avatar billede kimlarsen1978 Nybegynder
20. august 2003 - 12:07 Der er 6 kommentarer og
1 løsning

Menu-træ

Hej
Jeg vil gerne lave et dynamisk menu-træ. Det skal være sådan at når man klikker på et hovedmenupunkt, så kommer undermenuerne frem hængende under hovedmenuen.

Jeg bruger numre til at definerer hvilke menupunkter der hører under hvilke andre menupunkter. Problemet er at det kode, jeg har lavet ikke er dynamisk, det kan fx kun gå ned i 3 niveauer. Hvis man så laver et undermenupunkt til et menupunkt på 3 niveau vælter det.

Jeg vil gerne have at koden tager højde for x antal niveauer.

Min tabel kunne fx. se sådan her ud:
--------------------------------
Nummer          Menupunkt          Note

1000            Tøj                0
1001            Bukser              1000
1002            Rester              1001
1003            Børnebukser        1001
1004            Shorts              1002
2000            Biler              0
2001            Audi                2000
2002            A4                  2001
---------------------------------
Nummer er unik
Menupunkt er navnet på menuen
Note styrer hvilke menuer der er hænger sammen - 0 betyder det er en hovedmenu.

Så denne tabel giver i niveau 1:
---------
Tøj
Biler
---------
Niveau 2 (tøj)
---------
Tøj
  Bukser
  Rester
Biler
--------
Niveau 3 (tøj)
--------
Tøj
  Bukser
    Børnebukser
  Rester
Biler
--------
Niveau 4 (tøj)
--------
Tøj
  Bukser
    Børnebukser
      Shorts
  Rester
Biler
---------

Når der ikke er undermenuer til et punkt skal menupunktet linke til side produkt.asp i dette tilfælde "Shorts" og "Rester". Havde vi åbnet biler ville det være "A4" der linkede til produkt.asp

Jeg har for søgt at give en så præcis forklaring at problemet som jeg kan, og jeg håber der er en der kan løse det. Jeg har som sagt en løsning men den er ikke dynamisk - den bygger bare på en række if,then,else.

Jeg ser frem til en løsning :)
Takker
Avatar billede hyperactive Nybegynder
20. august 2003 - 12:08 #1
Avatar billede ldanielsen Nybegynder
20. august 2003 - 12:29 #2
Problemet er at få "tegnet" html'en, ikke?

Du vil nok anvende en for-løkke, der skriver html'en, og hvis du vil have mulighed for at have uendeligt antal niveauer, skal du bruge en rekursiv funktion (dvs. at den kalder sig selv). noget i stil med:

sub skrivMenu(argumenter)
for i = 0 to AntalIalt
  if nytniveau then
      call skrivMenu(argumenter)
  else
      Response.write menupunkter
  end if
next
end sub

problemet med vbscript er at det ikke er et stærkt sprog hvad angår scope. Det betyder at i bliver "genbrugt", så når funktionen kaldersig selv, og vender tilbage, så har i værdien fra sidste gennemløb med sig.

Du er nødt til at udskrive menuen i javascript, der på dette punkt er stærkere end vbscript. Jeg har selv gjort det clientside, og regner med at du ogs kan gøre det med serverside javascript.

Men det er ikke let; tungen lige i munden når du laver rekursive funktioner.

Har du noget som vi kan se?
Avatar billede kimlarsen1978 Nybegynder
20. august 2003 - 12:29 #3
Den algoritme åbner hele menuen på én gang.
Den skal ikke åbne undermenuerne før man klikker på menupunktet i niveauet ovenover. Altså man kan ikke se "Børnebukser" før man klikker på "Bukser"
Avatar billede kimlarsen1978 Nybegynder
20. august 2003 - 12:30 #4
Min kommentar var til HYPERACTIVE.DK
Avatar billede kimlarsen1978 Nybegynder
20. august 2003 - 12:33 #5
Idanielsen...
Ja, men det er noget rod. Denne meget lange kode får min menu ned i 3 niveauer.
--------------
viskategori = CStr(Replace(request.querystring("viskategori"), "'", "''"))
viskategori2 = CStr(Replace(request.querystring("viskategori2"), "'", "''"))

if viskategori <> "" then
viskategori = CStr(Replace(request.querystring("viskategori"), "'", "''"))
else
viskategori = 0
visikkehoved = 65
end if
'response.write viskategori2

'finder hovedkategorierne
set rskategori=db.execute("SELECT Notes1.Txt as notesTxt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& 0 &"' order by StockLocations1.Txt")

'finder underkategorier
set rskategori2=db.execute("SELECT Notes1.Txt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& viskategori &"' order by StockLocations1.Txt")

if not rskategori.eof then
while not rskategori.eof
%>
    <font face="verdana" size="2"><a href="default.asp?viskategori=<%= rskategori("StockLoc") %>" style="color: #000000" style="text-decoration:none;"><b><%= rskategori("Txt") %></b></a>
    <br>
    <%
    kl = CStr(viskategori)
    if rskategori("StockLoc") = kl AND visikkehoved <> 65 then
      if not rskategori2.eof then
      while not rskategori2.eof
        set rskategori3=db.execute("SELECT Notes1.Txt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& viskategori &"' order by StockLocations1.Txt")
        d = rskategori3("StockLoc")
        set rskategori32=db.execute("SELECT Notes1.Txt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& d &"' order by StockLocations1.Txt")
        if not rskategori3.eof AND not rskategori32.eof then
          while not rskategori3.eof
          %>
        <font face="verdana" size="2"><a href="default.asp?viskategori=<%= rskategori("StockLoc") %>&viskategori2=<%= rskategori3("StockLoc") %>" style="color: #000000" style="text-decoration:none;"><b>&nbsp;&nbsp;<%= rskategori3("Txt") %></b></a>
        <br>
        <%
            set rskategori4=db.execute("SELECT Notes1.Txt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& viskategori2 &"' order by StockLocations1.Txt")
            if not rskategori4.eof then
            while not rskategori4.eof
            viskat = rskategori4("StockLoc")
            %>
            <font face="verdana" size="2"><a href="produktoversigt.asp?viskategori=<%= rskategori("StockLoc") %>&kategori=<%=rskategori4("StockLoc")%>&viskategori2=<%= rskategori3("StockLoc") %>" style="color: #000000" style="text-decoration:none;">&nbsp;&nbsp;&nbsp;<%= rskategori4("Txt") %></a>
            <br
            <%
            rskategori4.movenext
            wend
              rskategori4.close
              set rskategori4 = Nothing
            end if
        rskategori3.movenext
          wend
          rskategori3.close
          set rskategori3 = Nothing
          rskategori32.close
          set rskategori32 = Nothing
        else
        'viskat = rskategori2("StockLoc")
        %>
        <font face="verdana" size="2"><a href="produktoversigt.asp?viskategori=<%=rskategori("StockLoc")%>&kategori=<%=rskategori2("StockLoc")%>" style="color: #000000" style="text-decoration:none;">&nbsp;&nbsp;&nbsp;<%= rskategori2("Txt") %></a>
        <br>
        <%
        end if
        rskategori2.movenext
        wend
        rskategori2.close
      set rskategori2 = Nothing
      end if
    end if
    %>
    <%
    rskategori.movenext
wend
end if

rskategori.close
set rskategori = Nothing
------------------
Avatar billede kimlarsen1978 Nybegynder
20. august 2003 - 12:35 #6
Princippet er at tage et recordset for hvert niveau og tømme det samtidig men man ser om der er underpunkter som i så fald gemmes i et nyr record set.

Meget ineffektivt og bestemt ikke dynamisk
Avatar billede kimlarsen1978 Nybegynder
26. august 2003 - 21:20 #7
Jeg lukker spørgsmålet, jeg har lavet "rode" kode så den kan gå ned i 4. neveau, det må række - ellers vender jeg tilbage :)
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