Avatar billede gnukki Nybegynder
06. januar 2007 - 17:27 Der er 19 kommentarer og
1 løsning

Træ menu

Hej eksperter,

Jeg har fundet et java-script der laver en træ menu. Denne genereres ved at tilføje de enkelte elementer på denne måde:

        d.add(0,-1,'Mit firma');
    d.add(1,0,'Forside','index.php?id=1');
    d.add(2,0,'Produkter','index.php?id=2');
    d.add(3,0,'Kontakt','index.php?id=3');
    d.add(4,2,'Produkt 1','index.php?id=4');

API:    id
        pid - Reference til parent
        name
        url


Jeg har en database-tabel med følgende opbygning:

id | navn | parent | rank

Det er meningen at jeg skal have lavet noget php-kode, som indsætter indholdet af databasen som menuelementer. De skal rangeres efter "rank", hvor 1 er øverst.

Håber der er nogen der har et forslag :-)
Avatar billede intenz Novice
06. januar 2007 - 17:43 #1
d.add(0,-1,'Mit firma');
<?
$res = mysql_query("select * from TABEL order by rank asc");
while ($row = mysql_fetch_assoc($res)) {
print "d.add($row[id],0,'$row[navn]','index.php?id=$row[id]');";
}
?>

Jeg kan ikke helt lure hvad det andet tal gør, men hvis det også skal hentes ud af databasen, skal det sættes ind på samme måde.
Avatar billede gnukki Nybegynder
06. januar 2007 - 18:00 #2
Det første antal er et id for hvert element, det har ikke noget med databasen at gøre, men er bare et tal, der skal stige én for hvert element.
Avatar billede gnukki Nybegynder
06. januar 2007 - 18:02 #3
Der skal jo også tages hensyn til om der er tale om hovedelement eller et underelement. Det er det det andet tal bruges til, står der 2 vil elementet vises som underpunkt til element 2.
Avatar billede hberg Nybegynder
07. januar 2007 - 00:55 #4
Du vil altså have dine elementer ud på denne måde:

Forside
  Produkter
    Produkt 1
  Kontakt

Korrekt forstået?

Jeg ved ikke lige hvorhenne du vil have "Mit firma", men den følger ikke API'en som du skriver den.

Den letteste måde at få sådan et output er at designe en rekursiv funktion, der tager den nuværende indrykningsdybde som argument.
Avatar billede aeroone Nybegynder
07. januar 2007 - 07:36 #5
i=0;
i++;
d.add(0,-1,'Mit firma');

$res = mysql_query("select * from TABEL order by rank asc");
while ($row = mysql_fetch_assoc($res)) {
print "d.add($i,$row[pid],'$row[navn]','index.php?id=$row[id]');";
i++;
}
Avatar billede gnukki Nybegynder
07. januar 2007 - 21:13 #6
hberg-->

"Mit Firma" er bare base, og har ikke noget med menuen at gøre, opbygningen vil altså se således ud:

Mit fima
Forside
Produkter
  Produkt 1
Kontakt


aeroone -->
pid er jo en funktion i menuen og ikke et felt i databasen, pid referere altså til id i menuen og ikke databasen.
Avatar billede gnukki Nybegynder
07. januar 2007 - 21:14 #7
Træet blev lige vist forkert, det skal se således ud:

Mit fima
-Forside
-Produkter
--Produkt 1
-Kontakt
Avatar billede aeroone Nybegynder
08. januar 2007 - 06:55 #8
Ok, men så bare skift $row[pid] med $row[parent]
Avatar billede gnukki Nybegynder
08. januar 2007 - 08:53 #9
Det vil jo ikke virke. id i menuen er ikke den samme som id i databsen. id i menuen stiger jo med én for hvert element, det er det du med din kode sætter til i. pid skal så referere til id for menuen.
Avatar billede aeroone Nybegynder
08. januar 2007 - 12:52 #10
Ok du har ret :-)

Hvad så med det her

d.add(0,-1,'Mit firma');

$res = mysql_query("select * from TABEL order by rank asc");
while ($row = mysql_fetch_assoc($res)) {
print "d.add($row[rank],$row[parent],'$row[navn]','index.php?id=$row[id]');";
i++;
}

Hvis din rank i db'en er 1,2,3,4 osv
Avatar billede gnukki Nybegynder
08. januar 2007 - 12:58 #11
Ja okay, men for at holde styr på underpunkterne har de deres egen rank, så den starter forfra når parent er andet end 0. Det vil altså sige at rank for "Produkt 1" er 1.
Avatar billede hberg Nybegynder
08. januar 2007 - 15:47 #12
Det bliver noget kønnere hvis man pakker tingene ind i et par funktioner, kode følger:

$indentation = 0;

/* find alle der har et bestemt parent id */
getChildren($id)
{
    return mysql_query("select * from TABEL where pid = $id order by rank asc");
}

displayChildren($id)
{
    global $indentation;
    children = getChildren($id);
    while ($row = mysql_fetch_assoc($children)) {
     
      /* print indrykningen (kan være spaces eller andre tegn) */
      for($i=0; i < $indentation; i++) {
          echo "&nbsp;";
      }

      /* print navnet */
      echo "$row['name']";

      /* øg indrykningen og foretag det rekursive kald */
      $indentation++;
      displayChildren($row["id"]);
      $indentation--;

    }
}

og for at starte det hele kalder du bare:

displayChildren(0);
Avatar billede aeroone Nybegynder
08. januar 2007 - 19:17 #13
Det er jo ikke nødvendigt at under punkter har sin egen rank, eftersom at du sortere på 'rank' eks. rank=11 er større end rank=9, og hvis opbygningen af menuen sker på danne måde

    d.add(1,0,'Forside','index.php?id=1');
    d.add(2,0,'Produkter','index.php?id=2');
    d.add(3,0,'Kontakt','index.php?id=3');
    d.add(4,2,'Produkt 1','index.php?id=4');
så bruger du jo rank til at sætte hvilket undenpunkt der kommer først eks

    d.add(1,0,'Forside','index.php?id=1');
    d.add(2,0,'Produkter','index.php?id=2');
    d.add(3,0,'Kontakt','index.php?id=3');
    d.add(4,2,'Produkt 1','index.php?id=4');
    d.add(5,2,'Produkt 2','index.php?id=5');
    d.add(6,2,'Produkt 3','index.php?id=6');
    d.add(7,2,'Produkt 4','index.php?id=7');

eller hva ??
Avatar billede gnukki Nybegynder
09. januar 2007 - 10:52 #14
aeroone -->

Hvis vi så siger at vi har ét rank-system til alle siderne. Hvis vi så skal indsætte en ny side midt i det hele, hvordan gøre det?
Avatar billede aeroone Nybegynder
09. januar 2007 - 16:53 #15
Godt spørgsmål, men det kan du vel heller ikke sqlvom at underpunkterne har sit eget rank eks

    d.add(1,0,'Forside','index.php?id=1');
    HVIS DU NU VIL HAVE ET NYT PUNKT HER    2,0       
    d.add(2,0,'Produkter','index.php?id=2'); 3,0
    d.add(3,0,'Kontakt','index.php?id=3');  4,0
    d.add(4,2,'Produkt 1','index.php?id=4'); 5,3
    d.add(5,2,'Produkt 2','index.php?id=5'); 6,3
    d.add(6,2,'Produkt 3','index.php?id=6'); 7,3
    d.add(7,2,'Produkt 4','index.php?id=7'); 8,3

Skal du jo ændre rank for produkter, kontakt, samt parent for hvert underpunkt under disse 2
Avatar billede gnukki Nybegynder
09. januar 2007 - 17:33 #16
Nej kan godt se problemet. Har du et forslag til en anden opbygning af menuen, så den kan tilpasses på denne måde?
Avatar billede aeroone Nybegynder
10. januar 2007 - 15:37 #17
Kan du gi' mig javascript koden til menuen, så skal jeg se om ikke jeg kan lave et system der passer til strukturen
Avatar billede gnukki Nybegynder
10. januar 2007 - 16:13 #18
Avatar billede gnukki Nybegynder
19. januar 2007 - 19:43 #19
aeroone --> Jeg finder ud af det, men tak for hjælpen. Smid et svar, så får du dine point..:D
Avatar billede gnukki Nybegynder
13. august 2007 - 09:04 #20
Siden aeroone ikke har ville tage imod pointene synes jeg det er på tide at lukke dette spørgsmål.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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