Avatar billede thomasrba Nybegynder
16. januar 2004 - 15:33 Der er 12 kommentarer

Generere menu ud fra MySQL - hjææælp!

Jeg har en DB med sideindhold, som bliver hentet ind i en html skabelon. (f.eks: index.php?siteid=5)

Problemet er nu at jeg gerne vil have en menu :)

Et endnu større problem er at jeg gerne vil have menuen med uendelige undermenuer. Eks:

Forside
Menupunkt1
Menupunkt2
-Undermenupunkt1 (under 2)
  -Underundermenupunkt1 (under undermenu 1)
Menupunkt3
-Undermenupunkt1 (under 3)


Min db er oprette således:

intid|sortering|menu_under|menu_navn|indhold
1|0|0|Forside|indhold på siden
2|1|0|Menupunkt1|Indhold under Menupunkt1
3|2|0|Menupunkt2|Indhold under Menupunkt2
4|3|3|Undermenupunkt1|Indhold under Undermenupunkt1
5|4|4|Underundermenupunkt1|Indhold under Underundermenupunkt1
6|5|0|Menupunkt3|Indhold under Menupunkt3
7|6|6|Undermenupunkt1|Indhold under Undermenupunkt1
osv..

Og det bliver endnu sjovere når jeg nu kun vil have foldet det menupunkt ud, som siteid er lig med. Så når man f.eks klikker på Menupunkt2 skal alle undermenuer flappes ud og siden skal vises.

Og for det ikke skal være løgn, vil jeg gerne have at man online kan flytte siderne op og ned fra menu til menu...

Nogen som har et godt bud på hvordan jeg løser dette?

Mvh Thomas
Avatar billede thomasrba Nybegynder
16. januar 2004 - 15:36 #1
Jeg glemte at man også online skal kunne styre sorteringen på menuerne..
Avatar billede delphimann Nybegynder
16. januar 2004 - 16:09 #2
Teori:

Table
Navn, under, over,

Navn = under/hovedkat
under = ja eller nej
over = ja / nej

du tager navn og siger select * from table where navn = "navn" AND under = 'ja'
svar kommer i $row1
Så kommer den med navn og under kat
så siger du select * from table where over = '$row1[$navn]' and under = 'ja'
svar kommer i $row2
echo "$row1[$navn] -> $row2[navn]";

også dan kan du lave alle de underkategorier du vil da de altid har en over kategori!

Håber du forstår
Avatar billede thomasrba Nybegynder
16. januar 2004 - 16:20 #3
Jeg forstår ikke hvor det du har skrevet kommer ind i min table.
Kan du forklare nærmere hvad du mener?

Mvh Thomas
Avatar billede coderdk Praktikant
16. januar 2004 - 22:15 #4
Du skal lave en rekursiv funktion...

Lav en tabel med følgende kolonner: id (autonumber), navn, link, parent (int default 0)
Du vil nu altid skulle have de menupunkter ud der har parent 0 - det er roden.

SELECT * FROM menu WHERE parent = 0

Giver dig roden. I det loop du laver når du skal skrive dem ud skal du checke om dens  ID er siteid...
f.eks.:

$qh = mysql_query($connection,$sql);
while ($row = mysql_fetch_assoc($qh))
{
  echo "<a href='$row[link]'>$row[navn]</a><br>";
  if ($row['id'] == $_GET['siteid'])
  {
    $level = 0;
    foldUd($row['id']);
  }
}

Fold ud er en funktion som denne:

function foldUd($id)
{
  global $level;
  $level++;
  $sql = "SELECT * FROM menu WHERE parentid = $id";
  $qh = mysql_query($qh,$sql);
  while ($row = mysql_fetch_assoc($qh))
  {
    echo str_repeat('..',$level);
    echo "<a href='$row[link]'>$row[navn]</a><br>";
    foldUd($row['id']);
}
  @mysql_free_result($qh);
}

Det er ikke testet, så der skal muligvis rettes noget ;)
Nu har du idéen, så kan du tilpasse selv ;)
Avatar billede tefcke Nybegynder
18. januar 2004 - 00:42 #5
Mums, kald til databasen midt i en while løkke.

Antag lige at der er en bruger som ændrer data i databasen mens en anden bruger er midt i den while løkke :D
Avatar billede thomasrba Nybegynder
25. januar 2004 - 14:55 #6
@coderdk
Det girver følgende resultat hvis jeg trykker på 2:
1
2
..4
....5
......6
........7
..........8
3

Hvis man klikker på et af underlinksne, så folder det hele sig ind igen, og der er også forkert.

Det skulle have givet dette:
1
2
    5
        6
            7
    4
    8
3

Fatter ikke at det skal være så svært at lave et tree;)

Mvh ThomasB
Avatar billede coderdk Praktikant
25. januar 2004 - 15:04 #7
Prøv lige i funktionen foldUd, lige efter den kalder sig selv med foldUd($row['id']); at skrive: --$level;
Avatar billede thomasrba Nybegynder
25. januar 2004 - 15:48 #8
@coderdk
Det virker også fint nok, bortset fra at den så henter ALLE undermenuer frem i valgte kategori(også underundermenuer) - den skal kun hente menuen frem lige under.
Desuden sker der det at den folder alle menuer ind, når man klikker på en undermenu.

Jeg tror snart at jeg smider det hele i skraldespanden og opgiver ;)

Mvh ThomasB
Avatar billede coderdk Praktikant
25. januar 2004 - 15:51 #9
Erh, ja, det troede jeg også var meningen - Er du sikker på at du ikke bare vil have sådan en standard javascript/dhtml tree menu: http://google.com/search?q=javascript+tree+menu

:)
Avatar billede thomasrba Nybegynder
25. januar 2004 - 17:29 #10
Hvis jeg bruger et javatree (eller DHTML), vil jeg have følgende problemer:
1. Siden vil ikke være totalt platformsuafhængig
2. Tree'et vil være klappet sammen, efter man klikker på et at linksne i menuen og siden vises.
3. Hvis man linker til en af siderne udefra så vil menuen også være klappet sammen.

Nu giver jeg snart op..
Mvh Thomas
Avatar billede coderdk Praktikant
25. januar 2004 - 18:56 #11
Hmmm

1. Jo, hvis du bruger et javascript/DHTML script der bruger DOM - som alle nyere browsere skal/burde understøtte
2. Kommer an på hvordan man implementerer det, dit script kan jo kigge på en $_GET variabel som den så sætter i javascriptet for at vise hvad der er slået ud?
3. Se 2. ;)
Avatar billede coderdk Praktikant
18. december 2004 - 14:50 #12
Tid til at lukke? ;)
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

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