Avatar billede mranders Nybegynder
21. marts 2004 - 19:06 Der 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
Avatar billede mranders Nybegynder
21. marts 2004 - 19:26 #1
det skal selvfølgelig også være sådan at hvis et link har en undermenu skal det ikke være et link, men gøre sådan at undermenuen vises

ligesom på http://www.danmon.dk/ bare med undermenuer

håber nogen har npgle ideer
Avatar billede nute Nybegynder
21. marts 2004 - 21:33 #2
din database kan laves meget simpel:

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")

dit eksempel vil så se sådan ud i en database:

1 - 1 link - http://www.link.com - -1
2 - 1.1 link - http://www.link.com - 1
3 - 1.2 link - http://www.link.com - 1
4 - 1.2.1 link - http://www.link.com - 3
5 - 1.2.2 link - http://www.link.com - 3
6 - 1.3 link - http://www.link.com - 1
7 - 2 link - http://www.link.com - -1

osv ...
Avatar billede Slettet bruger
21. marts 2004 - 22:25 #3
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)
Avatar billede nute Nybegynder
21. marts 2004 - 22:46 #4
kvadratrodenaf1 >> ehh ... poster du ikke lige det samme som jeg har skrevet ??
Avatar billede mranders Nybegynder
21. marts 2004 - 22:51 #5
ok det er smart, men hvordan får ejg det så skrevet ud i den rigtige rækkefølge?
Avatar billede Slettet bruger
21. marts 2004 - 22:51 #6
øhh.. jo.. jeg kunne ikke helt forstå, hvordan du havde lavet det.. troede der stod - (minus) 3.. men jo.. så er det det samme.. heh :D..
Avatar billede nute Nybegynder
21. marts 2004 - 23:04 #7
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"

/nute
Avatar billede mranders Nybegynder
21. marts 2004 - 23:20 #8
det er klart, men er det ikke kun den første submenu?
der skulle jo faktisk kunne være uendelig submenuer til submenuerne
Avatar billede Slettet bruger
21. marts 2004 - 23:37 #9
du kunne gøre det med en funktion - jeg ved ikke, om man kan smide recordsets ind i arrays, men det må man kunne gøre.. noget i retning af:

funktion menu($id){

  SELECT * FROM dintabel WHERE parentid = $id

  while($data[$id] = mysql_fetch_assoc($sql)){

    echo $data[$id]['link'];

    menu($data[$id]['parentid']);
  }
}










}
Avatar billede nute Nybegynder
22. marts 2004 - 00:23 #10
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:

http://xperimentum.com/xperten/solutions/asp/menu/index.asp

koden til den, kan du finde her:

http://xperimentum.com/xperten/solutions/asp/menu/kode.txt

/nute
Avatar billede mranders Nybegynder
22. marts 2004 - 00:59 #11
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
Avatar billede nute Nybegynder
22. marts 2004 - 01:03 #12
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
Avatar billede 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..
Avatar billede nute Nybegynder
22. marts 2004 - 16:35 #14
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]
Avatar billede 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.

  rs.movenext
  loop

end function

menu(1) 'funktionen sættes i gang..
Avatar billede nute Nybegynder
22. marts 2004 - 16:57 #16
mon ikke det så ville være smartere at bruge getRows(), som nettop gør det samme som du gør her:

http://activedeveloper.dk/artikler/default.asp?articleid=176

men jeg ser ikke helt pointen med at lægge menu-strukturen ud i en array. Hvad ville du opnå med det ?

/nute
Avatar billede 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
Avatar billede nute Nybegynder
22. marts 2004 - 17:12 #18
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
Avatar billede 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:

1 (rod)
1 (mellemmenu)
  1 (mellemmenu)
  1 (mellemmenu)
    1 (undermenu)
    2 (undermenu)
    3 (undermenu)

her mangler der resten af menuen.. f.eks. kunne man forestille sig, at menuen vil se sålede ud:


1 (rod)
1 (mellemmenu)
  1 (mellemmenu)
  1 (mellemmenu)
    1 (undermenu)
    2 (undermenu)
    3 (undermenu)
  2 (mellemmenu)
    1 (undermenu)
    2 (undermenu)
    3 (undermenu)
  3 (mellemmenu)
    1 (undermenu)
    2 (undermenu)
    3 (undermenu)
  2 (mellemmenu)
  1 (mellemmenu)
    1 (undermenu)
    2 (undermenu)
    3 (undermenu)
  2 (mellemmenu)
    1 (undermenu)
    2 (undermenu)
    3 (undermenu)
  3 (mellemmenu)
    1 (undermenu)
    2 (undermenu)
    3 (undermenu)

osv..
Avatar billede nute Nybegynder
22. marts 2004 - 17:42 #20
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
Avatar billede 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...
Avatar billede 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..
Avatar billede nute Nybegynder
22. marts 2004 - 17:51 #23
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

:o]

/nute
Avatar billede nute Nybegynder
22. marts 2004 - 17:51 #24
fino :-)
Avatar billede Slettet bruger
22. marts 2004 - 18:29 #25
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..
Avatar billede nute Nybegynder
22. marts 2004 - 18:34 #26
ah ... så er den bare misforstået :-) men det gør jo intet ... vi er dybest set enige, så vi lader den ligge :)
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

IT-JOB