26. september 2005 - 13:55Der er
56 kommentarer og 2 løsninger
Udskrivning af menu i flere niveauer
Hej,
jeg er ved at lave et site, hvor der bruges en dropdown menu i javascript. Menustrukturen, skal dog udskrives via PHP, og det kniber lidt med at gennemskue det...
Strukturen ser sådan her ud: var MENU_ITEMS =[ ["Collection", "", ["Female", "index.php?vgid=1"], ["Male", "index.php?vgid=3"] ], ["About us", "", ["Profile", "index.php?vgid=3"] ] ];
Denne stump vil outputte en struktur a la dette: Collection -> Female (linker til index.php?vgid=1) -> Male (linker til index.php?vgid=2) About us -> Profile (linker til index.php?vgid=1)
Den databasestruktur, der tages udgangspunkt i ser (i simplificeret form) sådan her ud: vgid (INT) vgnavn (VARCHAR) parent_id (INT)
Jeg udskriver på nuværende tidspunkt til en tekstfil, som jeg så includer. Det går fint nok, men det er det med at udskrive strukturen i den rigtige orden det kniber med.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
altså: 1) forespørgsel 1 der henter hovedgrupper while løkke der udskriver results 2) inde i whileløkken hentes underliggende varegrupper, where parent_id = id fra forespørgsel 1 ny while løkke, der udskriver undergrupper } }
Den er jeg med på. Men hvordan får jeg skrevet det til filen? Er det bare en hulens masse fopen.....?
Er du så langt at du har fået menuen ind i et multiarray således i php: $aMENU_ITEMS = array( "Collection" => array ( "Female"=> "index.php?vgid=1", "Male" => "index.php?vgid=3" ), "About us" => array( "Profile" => "index.php?vgid=3" ) );
Hej Horsmark - blev lige pludselig nødt til at smutte igår. Sorry...
Jeg har prøvet følgende: // Laver menuudskrift i korrekte struktur $aCollections = array(); //Hent hovedmenuer $sql = "SELECT * FROM varegrupper WHERE parent_id = '' ORDER BY id ASC"; $result = mysql_fetch_result($sql) or die( mysql_error() ); while($row = mysql_fetch_array($result)){ $aCollections[] = $row; } //Tilføj undermenupunkter foreach( $aCollections as $aCollection ){ $sql = "SELECT * FROM varegrupper WHERE parent_id = ".$aCollection['id']." ORDER BY id ASC"; $result = mysql_fetch_result($sql) or die( mysql_error() ); while($row = mysql_fetch_array($result)){ $aCollection[] = $row; } } print_r($aCollections);
Og får følgende fejl: Fatal error: Call to undefined function: mysql_fetch_result() in C:\Hjemmesider\test\admin\db_update.php on line 20
Linie 20 er første linie med $result = ...
Jeg kan ikke lige se, hvad der skulle være galt...
Så skal jeg bare have skrevet det til min fil... Jeg har forsøgt med: $text = print_r($aCollections); if(is_writeable($filnavn)) { fwrite($file, $text); } else { echo $filnavn.' er ikke writeable'; }
Jeg rettede lige mysql_fetch_result til mysql_query ;-)
Når jeg udskriver arrayet ser det fint nok ud, men desværre producerer den stadig kun et indhold i min fil på 1 - hvordan kan det være? Er dette normalt ikke rigtigt nok? if(is_writeable($filnavn)) { fwrite($file, $text); } else { echo $filnavn.' er ikke writeable'; }
hmm yes arrays er en supernødvendig ting at få styr på :-) Så du bør nok læse lidt om det og prøve dig frem. Måske dette er et overkill og superforvirrende lige nu.
Det er jo præcist sådan dit javascript array (eller rettere map) også ser ud:
Eksempel 2: var MENU_ITEMS =[ ["Collection", "", ["Female", "index.php?vgid=1"], ["Male", "index.php?vgid=3"] ], ["About us", "", ["Profile", "index.php?vgid=3"] ] ];
For hver gang der er "[" start og "]" som slut er dette et array ergo bruges den samme teknik til i javascript at bygge din menu.
Det jeg ville vise dig var at du i php er nødt til at opbygge denne arraystruktur ligeså for at holde sammen på din menu.
Når dette lykkedes er du klar til at gå skridtet videre nemmerlig med rekursive lykker hvor du så kan have uanede menupunkter efter hinanden. I dette tilfælde er det hovedmenu4 der er interessant :-)
Summasummarum: 1. Du bygger et php menu array og tilføjer parents og childs ved db opslag. 2. Du har nu et php menu array som i eksempel 1 3. Du bygger noget kode der bygger en streng indeholdende den samme mnu struktur blot som javascript (eksempel 2) 4. Du skriver javascriptstrukturen i en menufil 5. Du drikker en masse bajer og får en ordentligt skrald f.... 6. Efter en laaang pause går du ud på nettet og søger efter php tree menu og kigger i koden efter funktioner der looper igennem et array og bygger træstrukturen REKURSIVT dvs at funktionen kalder sig selv igen og igen indtil der ikke er flere menupunkter...
Håber dette er til at forstå - kan selv huske for 1½ år siden da jeg selv skulle til at fatte det... Jeg kan kun sige - Du vil ALDRIG fortryde det - når du først kan overskue det !
Tak for det - godt og illustrativt eksempel! Super!!
I punkt 1 nævner du "childs" - hvad er det?
Jeg har længe villet lære det, men når man går i stå tilpas mange gange, så mister man efterhånden modet. Nu har jeg en "opskrift" at gå efter, og det er virkelig i orden!!!
parent = forælder og child = barn til en forælder, dvs at et "forældre" menupunkt kan have mange "børne" submenupunkter se på det som et stamtræ :-) forældres forældre og børn børn :-)
Fuck ja - godt man ikke skulle programmere det, hvad. Eller er det lige så "nemt" som det du har prøvet at lave til mig. Det kunne det vel for så vidt godt blive...
Nå - men du må jo hellere få dine points :-) Tak for det!
$sql = " SELECT * FROM mintabel ORDER BY par_id, seq_id"; $result = mysql_query($sql) or die( mysql_error() ); while( $row = mysql_fetch_array($result) ){ $aTreeNodes[] = $row; }
generateTree(0); function generateTree($node_id = null, $tab = null) { global $aTreeNodes; // Eftersom Arrayet $aTreeNodes er global bliver ponteren ikke nulstillet derfor tager vi lige en kopi $aTree = $aTreeNodes; is_null($tab) ? $tab = 0 : $tab++; foreach ( $aTree as $aNode ){ if ($aNode['par_id'] == $node_id) { for($t = 0; $t < $tab; $t++){ print " "; } print $aNode['name']."<br>"; generateTree($aNode['id'], $tab); } } }
Hmmm... Jeg får stadig den samme fejl. Kan jo godt se, at det virker på din hp - kan det være min server, der ikke er sat ordentlig op til det, eller hvad? Så kan jeg jo blive ved med at teste løs i uendeligheder:-)
Ja, et gammelt site, som jeg kun bruger til at teste :-) Det site jeg arbejder på, ligger ikke på nettet. Jeg udvikler på min egen server (på min computer), og lægger det op på det aktuelle webhotel senere.
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.