Avatar billede g1mzee Nybegynder
12. oktober 2008 - 20:25 Der er 10 kommentarer

dynamisk side. med selvskrevet menu

ja, ved ikke helt om overskriften passer til. men, ja. vidste ikke lige hvad jeg ellers skulle skrivee :D
Det det hele går ud på, er at jeg har fået som opgave at lave en side, hvor brugeren selv kan lave sin menu, selv kan lave sine undermenuer og alt det. Men hvordan det helt præcis skal laves, det er jeg ikke helt med på, altså programmeringssiden.
Kunne forstille mig at meget skal lagers i en database hvis jeg ikke er helt forkert på den.
- men er det egentlig ikke nogenlunde det man kalder et CMS system? ..
Nogen guides til hvordan man kan komme igang, med at komme ind i den tankegang der skal bruges.. eksempler som der ikke er langt ude i skoven og forstår? :p.


Håber i ved hvad jeg mener, eller kan se det :D

//Schu!
Avatar billede mcardle Nybegynder
13. oktober 2008 - 02:18 #1
Du kunne jo tænke på denne her måde.:

Du har din øverste menu (parent), dem kan du have lige så mange af du vil. Under menuerne, har vi undermenuerne kalder vi children. Så en struktur kunne se sådan her ud.:

Hjem (parent)
Galleri (parent)
  -Familie (Child)
  -Venner (Child)
    -HF (Children)
    -Folkeskole (Children)
Kontakt (parent)

Jeg ved ikke helt hvor mange niveauer du skal bruge i din menu, men du kan jo lave 3, som vist ovenfor.

Din databasestruktur kunne så se sådan her ud:
tabel: menu
felter: id(unikt id), navn(siger sig selv), link(linket til den side du gerne vil ind på), h_index(hvilken rækkefølge menupunkterne skal udskrives i), children( hvilket children dette menupunkt har), type(enum('parent','child','children').

Når du har lavet dette kan du bare lave 3 løkker inde i hinanden, således:

<?php

$getParents = mysql_query("SELECT * FROM menu WHERE type='parent' ORDER BY h_index ASC") or die(mysql_error());
while($showParents = mysql_fetch_assoc($getParents)){

  echo "<a href='$showParents[link]' title='$showParent[navn]'>$showParent[navn]</a>";
  $getChilds = mysql_query("SELECT * FROM menu WHERE type='child' ORDER BY h_index ASC") or die(mysql_error());
  while($showChilds = mysql_fetch_assoc($getChilds)){
   
    echo "<a href='$showChilds[link]' title='$showChilds[navn]'>$showChilds[navn]</a>";
    $getChildren = mysql_query("SELECT * FROM menu WHERE type='child' ORDER BY h_index ASC") or die(mysql_error());
    while($showChildren = mysql_fetch_assoc($getChildren)){

      echo "<a href='$showChildren[link]' title='$showChildren[navn]'>$showChildren[navn]</a>";

    }

}

Der er sikkert en fejl eller to, har ikke lige haft den inde i et program, har skrevet det direkte her i browseren, men vi håber på det bedste :o)

Det skulle i store træk være det.

//mcardle
Avatar billede mcardle Nybegynder
13. oktober 2008 - 02:22 #2
Hov, du skal nok lige have nogle if'er udenom de 2 inderste mysql udtræk.

Noget:

if($showParent["children"] = "yes"){
  // $getChilds bla, bla...
}

og så skal children bare indeholde yes eller no som enum.
Avatar billede g1mzee Nybegynder
13. oktober 2008 - 12:05 #3
det ser faktisk ud som noget jeg havde tænkt mig.. :p .. men 1 ting jeg undre mig lidt over det er den der type(enum('parent','child','children')..
kan det hele samles i 1 table?
Avatar billede mcardle Nybegynder
13. oktober 2008 - 14:11 #4
Ja, det kan det godt...

Enum er en datatype, som man kan lave bestemte valgmuligheder med. Du skal bare skrive det sådan her 'valg1','valg2',osv... med single pings.

//mcardle
Avatar billede pidgeot Nybegynder
13. oktober 2008 - 14:57 #5
Ikke nok med at det kan samles i en tabel, det SKAL det. Dog ikke på den måde...

Den model virker nemlig på ingen måde gennemtænkt. Den er unormaliseret (en attribut der indeholder X børn - det duer ikke), kræver mange queries, og så ser det ikke ud til at der reelt bliver fundet de rigtige børn. Den følger ikke "0, 1, mange"-reglen: den tillader et meget fast antal niveauer, i stedet for et vilkårligt antal.

Den minder om en adjacency list("parent-model", hvor du har et id, en parent-attribut, evt. en sortering, og så data (navn og link), men den sætter som nævnt en begrænsning i antallet af niveauer, og ser ud til nemt at kunne skabe flere problemer end den løser.

Parent-modellen er en smule bedre (og nok den de fleste ville tænke på hvis du bad dem om at lave en tabel for et hierarki), men begge har problemet med at de kræver mange queries for at opbygge et komplet træ.

Nested set-modellen er en langt mere fleksibel måde at udtrykke et hierarki, og du skal bruge langt færre queries til mange normale ting. http://dev.mysql.com/tech-resources/articles/hierarchical-data.html forklarer hvordan det virker og bruges.
Avatar billede mcardle Nybegynder
13. oktober 2008 - 15:08 #6
Jeg ville også selv bruge pidgeot eksempel, men ville ikke lave en for indviklet eksempel. Det er jo klart mest praktisk, hvis / når du skal udvide din menu senere.

//mcardle
Avatar billede pidgeot Nybegynder
13. oktober 2008 - 15:15 #7
Nested sets er ikke specielt indviklede, men det tager måske lidt længere tid at finde ud af *hvorfor* det fungerer. Stort set alt man skal bruge står dog i artiklen, så det er bare med at sætte sig ned og læse lidt...

Skulle du dog af en eller anden grund vælge ikke at benytte nested sets (hvilket du dog klart bør gøre), så gør i det mindste dig selv den tjeneste at benytte parent-modellen.
Avatar billede g1mzee Nybegynder
13. oktober 2008 - 17:46 #8
det vil jeg da kigge på, forklarer de også hvordan man gør når man skal indsætte det?
Avatar billede pidgeot Nybegynder
13. oktober 2008 - 18:09 #9
Hvis du mener indsætte (og for den sags skyld slette) menupunkter, så ja.

Hvis du mener hvordan man får PHP til at vise det, nej. De giver dog en SQL-sætning til at hive hele træet ud, inkl. dybde. De oplysninger kan du så bruge til at lave noget PHP-kode ud fra.
Avatar billede g1mzee Nybegynder
13. oktober 2008 - 22:07 #10
det er da noget helt nyt kode i mysql som jeg ikke har set før :D..
men, ja... man lærer vel noget nyt hele tiden..
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