21. marts 2004 - 19:06Der er
24 kommentarer og 2 løsninger
opbygning af menu
Jeg skal lave en databasestyret menu som skal have følgende opbygning:
1 link 1.1 link 1.2 link 1.2.1 link 1.2.2 link 1.3 link 2 link 2.1 link 2.2 link
osv.
mit problem er at man skal så mange undermenuer man vil og undermenuer til undermenuerne osv. Sådan man i teorien kunne få et link der hed 1.2.2.3.4.2.1.2 link. Jeg har ikke brug for en desideret kode, mere en ide til hvordan jeg skal opbygge min kode og database. Håber i forstår hvad jeg mener
id - unik id menuitem - Navnet på linket (fx. '1 link') menutarget - Selve linket (fx. http://www.etlink.com) parentid - hvilket menuitem dette menupunkt skal ligge under (-1 hvis det er et "rod menupunkt")
du kunne i datebasen referere til overmenuen for hver menu (og hvert menupunkt skal have unikt id):
1 (id 1, referenceid 0) 'refererer til id 0, som ikke eksistere (rodmenu) 1.1 (id 2, referenceid 1) 'refererer til id 1, som er den første rodmenu 1.1.1 (id 3, referenceid 2) 'osv 1.2 (id 4, referenceid 1) 1.2.1 (id 5, referenceid 4) 1.2.2 (id 6, referenceid 4) 2 (id 7, referenceid 0)
for at få alle 'rod punkter' ud, så laver du en SQL statement:
SELECT * FROM dintabel WHERE parentid = 0
for hvert punkt her, så kører du endnu en SQL, ála:
submenuSQL = "SELECT * FROM dintabel WHERE parentid = " & RS("id")
du kan også lægge en sorteringskolonne i din database, hvor sorteringen for hvert menupunkt kan stå. Denne kan du så bruge til at sortere dine menupunkter på:
submenuSQL = "SELECT * FROM dintabel WHERE parentid = " & RS("id") & " ORDER BY sortID"
kvadratrodenaf1 >> se lige på hvilken kategori du befinder dig i, inden du smider noget kode afsted ...
mranders >> Du skal til at skrive en rekursiv funktion. jeg har en gammel menu liggende, som du gerne på kigge på. Den er skrevet for rimelig lang tid siden, og kan helt sikkert optimeres betragtelig (et ønske jeg stadig ikke får startet på :-] ), men i princippet kan den nok gøre det du ønsker. Det er en kopi af windows explorer menuen. Du må gerne kigge på den her:
tak smid et svar nute, flot menu, lige det jeg søgte, men må indrømme at jeg tror det er lidt for svært til jeg kan finde ud af det. Men du har fortjent dine point alligevel
om ikke andet, så kan du nok måske bruge den til inspiration :-] Jeg ville nok ikke brugt den selv, uden at den modificeres en smule ... det er blandt annet nogle mellemrum jeg ikke helt forstår hvorfor er det, men som sagt ... jeg har jo hellere ikke kigget på koden i 100 år :-)
/nute
Synes godt om
Slettet bruger
22. marts 2004 - 16:23#13
heh.. plejer ellers altid at skrive asp i php-fora, men nu har jeg så præsteret at gøre det omvendt.. flot af mig.. eller noget :D..
kvadratrodenaf1 >> jow ... det gør jeg da også nogle gange, men sådan rent "brugervenlig" er det jo ikke. ikke for at sige noget ukorrekt om mranders, men det kunne jo være at den person der stiller spørgsmålet, er så ny i det han laver, at han ikke forstod en bjælde af php - hvis dette er tilfælde, så vil han/hun nok kun blive forvirret hvis der kommer noget php ind i tråden, og måske tænke "hmm ... kan man også gøre sådan i ASP" og lave mange underlige fejl ...
måske ...
;o]
Synes godt om
Slettet bruger
22. marts 2004 - 16:46#15
Det jeg mente er noget i retning af dette.. skal lige siges, at jeg ikke ved, om man kan køre det rs som array..
funktion menu(id)
sql = "SELECT * FROM dintabel WHERE parentid = " & id set rs(id) = conn.execute(sql) 'jeg er ikke helt sikker på, man kan skrive rs(id), men det skal forstås som et array..
do while not rs(id).eof
response.write rs(id)("link")
menu(rs("parentid")) 'Kalder det hele igen, men nu et trin længere oppe i forhold til roden. 'Når der ikke er flere undertrin, vil scriptet automatisk løbe ud.
men jeg ser ikke helt pointen med at lægge menu-strukturen ud i en array. Hvad ville du opnå med det ?
/nute
Synes godt om
Slettet bruger
22. marts 2004 - 17:01#17
det er for at variablen ikke bliver overkrevet.. hvis man kører med rs hele vejen igennem, vil man kun få de første menuer "overmenuer" og "undermenuerne"
man vil f.eks. kun få 1.1.1.1.1 1.1.1.1.2 1.1.1.1.3
i mit eksempel, som jeg har postet et link til, bruger jeg det samme recordset hele vejen igennem. VBScript kan åbenbart finde ud af at beholde objekterne ved rekursion.
forstår ikke helt hvad du mener med din lille matrix til sidst :-|
/nute
Synes godt om
Slettet bruger
22. marts 2004 - 17:37#19
i dit eksempel skal man definere et recordset for hvert trin:
SET RS = conn.execute("SELECT * FROM dintabel WHERE parentid = 0") SET subRS = conn.execute("SELECT * FROM dintabel WHERE parentid = " & RS("parentid")) SET subsubRS = conn.execute("SELECT * FROM dintabel WHERE parentid = " & subRS("parentid")) SET subsubsubRS = conn.execute("SELECT * FROM dintabel WHERE parentid = " & subsubRS("parentid"))
hvis man kunne gøre dette med et array i stedet, vil man kunne lave uendeligt mange submenuer, som mranders gerne vil have..
mht. til mit eksempel. recordsettet vil bliver overskrevet, hvis man ikke bruger forskellige navne til det, og man vil derfor opnå at man får en menu noget lign dette:
kvadratrodenaf1 >> forkert ;-) hvis du læser det jeg skriver til dig, og kigger i den (lidt for uoverskuelige) koden jeg har refereret til, så vil du meget hurtig kunne se at jeg gør følgende:
Sub getSubfolders( id ) Set subRS = Conn.Execute("SELECT * FROM folders WHERE parentID = " & levelArr( UBOUND(levelArr) ) & " ORDER BY ID ASC") if not( subRS.EOF or subRS.BOF ) then
i linie 16 genbruger jeg min RS ... form *hver* submenu. jeg har uendelig mange niveauer i min menu, og jeg bruger det samme RS for at skrive ud alle sammen, så der er ingen problemer med det.
/nute
Synes godt om
Slettet bruger
22. marts 2004 - 17:47#21
ok.. jeg har ikke læst artiklen igennem, jeg refererede bare til et af dine tidligere indlæg.. læser den igennem nu, så jeg kan se, hvad du mener.. men bare vi forstår hinanden :P...
Synes godt om
Slettet bruger
22. marts 2004 - 17:50#22
yessør.. nu tror jeg vi forstår hinanden - jeg forstår i hvert fald, hvad du mener :D..
hmm .... jeg tror nok ikke jeg har skrevet noget om at man er nødt til at oprette et RS for hver iteration ... så er det nok noget med at du har misforstået en dårlig formulering fra min side, og så er vi jo på røven begge to ;o]
jeg tror nok vi er enige ... bare på lidt forskellige måder
det var bare din kommentar 21/03-2004 23:04:27.. der skrev du noget med submenuSQL, men skal vi ikke bare lade det ligge?? vi har forstået hinanden :P..
ah ... så er den bare misforstået :-) men det gør jo intet ... vi er dybest set enige, så vi lader den ligge :)
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.