dropdown-menu med db

Tags:    php mysqli

<< < 12 > >>
Hej
Jeg er igang med at udbygge menuen til en hjemmeside, men er stødt ind i et problem med multilevel-menuer, baseret på <ul><li><ul><li></li></ul></li></ul>. Lige nu har jeg søgt en del rundt her på siden og har også fundet lidt forskelligt, men det har blot være forslag til en begyndende opbygning med et while-loop inde i et while-loop. Det har jeg ikke rigtig fået til at lykkedes, og spørger nu igen.
Lige nu ser mit script til hovedmenuen således ud:
Fold kodeboks ind/udPHP kode 

Min menu er lidt mere kompleks end blot noget simpelt, da den skal tjekke om min nuværende placering(page_id) er tilsvarende til at et bestemt menupunkt og derved sætte denne som current_page_item. Det vigtigste er at få lagt multilevel-menuen ind i mit script og så kan jeg senere få "grå hår" over hvordan jeg kan detektere parent og derved sætte class current_parent_item på hovedmenuen.



Indlæg senest redigeret d. 26.01.2013 23:11 af Bruger #17072
11 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
Fordi koden ikke er længere er skalerbar, og det kan ende i flere forskellige resource mæssige problemer. Database arbejde skal være afsluttet uden for enhver løkke.

Men kig på den løsning jeg har skrevet her: http://www.udvikleren.dk/forum/35319/udskrive-menu-fra-mysql-med-children/#msg168131



Indlæg senest redigeret d. 27.01.2013 09:45 af Bruger #10216
hvorfor laver du ikke bare 2 whiles. 1 som henter alle som er sat som "parent" og en som tjekker om der er "childs" til den parent.





Jeg fandt netop Michaels løsning, mens jeg søgte svar, men forstår ikke rigtigt hvorfor det skal gøres sådan som du gør det, når det burde kunne gøres nemmere.
Jeg har allerede prøvet at lave en while inde i en while, men eftersom jeg skal tjekke på om jeg er placeret på en bestemt side, så skal jeg jo både have en while i min if og i min else inde i den første while.
Når jeg har indsat en ekstra while, så ser min kode således ud:
Fold kodeboks ind/udPHP kode 

Dog giver dette intet resultat. Men det har med stor sandsynlighed noget med at gøre med at jeg ikke afslutter min første forbindelse, inden jeg starter den næste.



Indlæg senest redigeret d. 27.01.2013 10:23 af Bruger #17072
Hvad er det præcist du mener kan gøres nemmere? 4 linjer kode der bygger et multi-dimensionalt array er vel så enkelt som det kan være.

At udføre et SQL statement til databasen pr. menupunkt er et problem.
Lad os antage at du har 10 menupunkter, med hver 10 underpunkter, med hver endnu et underpunkt. Du skal checke om hvert menupunkt har underpunkter. For at generere den fulde menu-struktur skal du udføre et kald til databasen pr. menupunkt til min. to niveauers dybde. Det giver: 10 * 10 = 100 gange.

Den løsning der henvises til, kan du generere den fulde struktur med 1 kald til databasen.

Du vil ikke kunne undgå rekursivitet.

Der findes en tredje løsning: Modified Preorder Tree Traversal. I teorien meget simpel, i praksis noget mere vanskelig. Virker formidabelt til rigtig store træer: http://www.sitepoint.com/hierarchical-data-database-2/



Så har jeg haft tid til at forsøge mig med Michaels kode, og er stødt ind i et lille problem under oprettelse af mit array. Da jeg jo henter det hele på en gang, så skal jeg jo også bruge et loop til at udskrive data med. Dog kan jeg ikke få lov at placere et while-loop inde i mit array.
Lige nu har jeg lavet følgende kode:
Fold kodeboks ind/udPHP kode 

Hvordan løser jeg dette problem?



Indlæg senest redigeret d. 04.02.2013 09:50 af Bruger #17072
Selvfølgelig kan du ikke placere et loop inde i en array constructor.

Løsningen er at pushe data in i arrayet.
Fold kodeboks ind/udKode 


http://php.net/manual/en/function.array-push.php



Indlæg senest redigeret d. 04.02.2013 10:48 af Bruger #10216
Ok. Så langt så godt.
Nu har jeg fået bygget det hele op, som du viste i dit link fra tidligere, og det hele ser nu således ud:
Fold kodeboks ind/udPHP kode 

Jeg får følgende output i min menu:
Fold kodeboks ind/udHTML kode 

Den omtalte linje 29 er i den indsatte linje 23



Indlæg senest redigeret d. 04.02.2013 11:58 af Bruger #17072
Nu må du jo også gerne arbejdet lidt for det selv. :)

Et "undefined index" på linje. 23/29, burde du nok kunne rette selv. ;)

En ledetråd: du kan løse det med isset();



Jo, men jeg kan ikke lige se hvor den henter "children" henne. Det er der problemet er, da det jo er den værdi i mit array, som den brokker sig over.



Kan du ikke se hvor koden gør brug af indekset "children". Jeg går ud fra at du ved at "Undefined index", betyder at der mangler indeks i et associativt array.

Kigger du på ln. 23/29 finder du reference til indekset "children" to steder. Det ene sted skal du erstatte med isset($item['children']) && $item['children']

Nedestående konstruktion er en forkortet udgave af if,else.:

$variable === $value ? $true : $false;

Samme kontruktion kunne også skrives som:

if($variable === $value) { $true } else { $false}



<< < 12 > >>
t