SQL = "SELECT * FROM aa_menu ORDER BY id" Set rs = Conn.Execute(SQL)
menu_target = "MAIN"
do while not rs.EOF Response.Write "<a href=""?id=" & rs("id") & """>" & rs("menunavn") & "</a>" Response.Write "<br>"
if Int("0" & menuID) = Int(rs("id")) then 'Udskriver submenuer til den valgte menu Set subrs = Conn.Execute("SELECT * FROM aa_submenu WHERE menuID = " & rs("id")) do while not subrs.EOF Response.Write " - <a href=""?id=" & rs("id") & "&sid=" & subrs("id") & """>" & subrs("submenunavn") & "</a>" Response.Write "<br>" if Int("0" & submenuID) = Int(subrs("id")) then 'Udskriver links til den valgte menu og submenu Set linksrs = Conn.Execute("SELECT * FROM aa_link WHERE submenuID = " & rs("id")) do while not linksrs.EOF Response.Write " -- <a href=" & linksrs("linket") & " target=" & linksrs("target") & """>" & linksrs("linknavn") & "</a>" Response.Write "<br>" linksrs.Movenext loop end if subrs.Movenext loop
'Udskriver links til den valgte menu som ikke har en submenu Set subrs = Conn.Execute("SELECT * FROM aa_link WHERE menuID = " & rs("id")) do while not subrs.EOF Response.Write " -- <a href=" & subrs("linket") & " target=" & subrs("target") & """>" & subrs("linknavn") & "</a>" Response.Write "<br>" subrs.Movenext loop
end if
rs.Movenext loop
Conn.Close Set Conn = nothing %>
Har nu brugt dage på at finde en løsning og har fundet ud af det nok skal være en rekursiv funktion der skal bruges. Er der evt. nogen der skulle have et ex. på dette ?
Rekursion lyder som en løsning der vil fungere, men en hierarkisk menu er lidt kompleks at udtrække fra en relationel database og dermed også tids- og resursekrævende for serveren (der skal bruges mange opslag i databasen for at få det til at fungere). Jeg vil umiddelbart foreslå en optimering (via caching i en separat tabel).
Hvor ofte ændrer menuen sig?
Er det muligt for dig at regenerere cachen når menuen ændrer sig?
Hvis du cacher den kan du sørge for at menupunkterne ligger i den rækkefølge de skal genereres i, så du kan nøjes med at lave et "fladt udtræk" af cachetabellen og blot iterere igennem alle de udtrukne punkter. Til dette skal du bruge en eller anden indikator for orden og niveau. Jeg forestiller mig et felt som angiver dette med bogstaver, f.eks.
a aa ab aba abb ac b ba bb c ca caa cab
menupunkternes rækkefølge kan dermed ordnes med en simpel order by og niveauet kan aflæses i længden af feltet.
Du skal som nævnt have mulighed for at opdatere cachen når menuen ændrer sig og til dette slipper du ikke for at bruge en masse resurser - men det er forhåbentlig kun få gange i forhold til hvor ofte menuen skal vises :-)
Et andet godt alternativ til caching er naturligvis XML evt. i kombination med XSLT, men det er givetvis for stor en mundfuld at kaste så mange "nye" teknikker ind i denne opgave :-)
Hvis ikke så sig endelig til, så må vi se om vi kan finde en teknisk løsning på det! :-)
På den anden side, hvis du nu bare, for hvert menupunkt, beskrev strukturen ("forfædrestien") med den foreslående metode i stedet for kun at angive den umiddelbare forælder, kunne du spare cachingen og bare lave udtrækket som foreslået direkte på menuen.
Dette vil naturligvis kræve, at du på det tidspunkt hvor du opretter menupunktet kender
* forældernodens "forfædresti" * ved hvilken placering menupunktet skal have i menuen
men hvis du har styr på det, når menupunktet gemmes, så burde udtrækket være ligetil... :-)
Du er nok nød til at uddybe lidt, for med XML kan du vedligeholde strukturen i din menu og praktisk talt lave menuen i XML, så det kan vel ikke give nogle problemer...
Mht. hvilke felter du har i databasen, så er jeg klar over at du har de felter du skal bruge for at beskrive strukturen, det jeg foreslår er blot udvidelse af datagrundlaget med henblik på en optimering af hvordan du genererer menuen (det er klart hurtigere at lavet ét gennemløb af ét udtræk end at lave adskillige udtræk i rekursion. Det var derfor jeg foreslog at du introducerede et felt du kunne sortere efter og som gav information om både struktur og sekvens (med mindre feltet order et en global orden for alle menupunkter, for så kan du vel bare sortere efter det).
Har lavet et ekstra felt nu, der hedder zorder som definerer rækkefølgen på menupunkterne på den respektive level. Skulle dette hjælpe og i så fald hvordan ?
Faldt over denne artikel, men det ser noget rodet ud :)
Lukker og slukker , prøver noget array ting istedet , men tak for hjælpen :)
Synes godt om
Ny brugerNybegynder
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.