Vraag & Antwoord

Webprogrammeren & scripting

Treeview met PHP

35 antwoorden
  • Mensen, Ik wil graag een treeview menu maken m.b.v. PHP, nu heb ik daar wat over gevonden maar ik kom er niet helemaal uit en zou graag willen weten of er iemand bereid is om een voorbeeld te geven. http://www.mysql.com/doc/en/SHOW.html Dit is de website die ik gevonden heb maar er staan niet echt voorbeelden bij voor gebruik. Ik heb de volgende tabel aangemaakt: [code:1:8bc14aaff4] +--+----+----+----------------------+ |id|menu|subs| name | +--+----+----+----------------------+ |1 | 1 | 0 | Hoofdpagina | |2 | 2 | 0 | Veilingagenda | |3 | 3 | 0 | Volgorde van Verkoop | |4 | 4 | 0 | Catalogus | |5 | 4 | 1 | Bekijken | |6 | 4 | 2 | Zoeken | |7 | 4 | 3 | Bestellen | |8 | 5 | 0 | Foto's | |9 | 5 | 1 | Vooruitblik | |10| 5 | 2 | Terugblik | |11| 6 | 0 | Informatie | |12| 6 | 1 | Veilingen | |13| 6 | 2 | Taxaties | |14| 6 | 3 | Tarieven | |15| 7 | 0 | Contact Info | +--+----+----+----------------------+ [/code:1:8bc14aaff4] De bedoeling is dus dat wanneer je menu 4 opent 4.1 - 4.2 - 4.3 ook openen. Zou iemand mij kunnen helpen om een start te maken? Alvast bedankt Marcel
  • Even uit de losse pols:[code:1:26bfd7b43c]SELECT * FROM dbtable WHERE menu=$menunr ORDER BY subs ASC;[/code:1:26bfd7b43c]Maar ik weet niet precies of dit is wat je bedoelt, aangezien ik dit niet echt een treeview vind. Daarnaast snap ik niet precies wat je nou met SHOW DATABASES wilt, dus misschien is wat extra toelichting handig. - Bas
  • Bedankt bas, Wat vind je er geen treeview aan ?? Ik had dit zelf ook al voor elkaar gekregen, echter vraag ik me af of dit wel snel genoeg is, ik had in een post op dit forum iets gelezen over die website. Ik had verwacht dat je met SHOW delen van een tabel in een keer kon laten zien ofzo maar ik snap het doel er niet helemaal van omdat er geen enkel voorbeeld bij te vinden is. http://forum.computertotaal.nl/phpBB/viewtopic.php?t=47811&highlight=treeview
  • [quote:3405407b16="xanuex"]Wat vind je er geen treeview aan ??[/quote:3405407b16]Bij een treeview denk ik persoonlijk altijd meer aan een parent-child relatie, waarbij je dus in één tabel een tree kunt opbouwen met een van tevoren onbepaald aantal niveau's. Kan je ook leuk recursie op loslaten of opbouwen uit nodes, maar dat even terzijde. In jouw geval heb je alleen een hoofdlaag (4.0) en een sublaag (4.1, 4.2, etc). Maar goed, als ik er even over nadenk is het wel zeker een vorm van een tree, alleen is hij vrij moeilijk uit te breiden.[quote:3405407b16="xanuex"]Ik had dit zelf ook al voor elkaar gekregen, echter vraag ik me af of dit wel snel genoeg is, ...[/quote:3405407b16]Ik denk dat dit één van de snelste manieren is, aangezien je alleen die informatie ophaalt die je ook werkelijk nodig hebt. Het SHOW commando kende ik nog niet, maar als ik er even vluchtig naar kijk dan lijkt het me een vrij gecompliceerde aanpak en is het wellicht overkill, maar misschien dat anderen daar een andere mening over hebben. - Bas
  • Het SHOW commando is vrij nutteloos in deze aangezien je gegevens uit een table wil halen en daarvoor is nu eenmaal de SELECT uitgevonden. SHOW gebruik je om gegevens over de database te krijgen of de objecten daarin (tables, users, columns, enz.).
  • Ik zou het heel fijn vinden als je een klein voorbeeld zou kunnen plaatsen van een tabel (2 tabellen in dit geval ??) met daarbij een stuk code. Dus het parent-child effect. Nu ik er overnadenk heb je idd gelijk dat deze tabel moeilijk uit te breiden is dus vandaar dat ik graag zou willen weten hoe het beter kan. Ik heb het nu op de volgende manier: [code:1:5f248c7b70]<?php include('config.inc.php'); ?> <html> <body> <table cellpadding="0" cellspacing="0" style="border-collapse: collapse" width="171"> <tr> <td width="171" height="20" background="images/menu/spacer.gif"></td> </tr> <?php $sql1 = mysql_query("SELECT * FROM menu WHERE subs=0 OR menu=$menu ORDER BY menu,subs ASC") or die(mysql_error()); while ($res1 = mysql_fetch_assoc($sql1)) { ?> <tr> <td width="171" height="20"><a href="menu.php?menu=<?php print $res1['menu'];?>"> <img border="0" src="images/menu/nederlands/<?php print $res1['name'];?>.gif"></a> </td> </tr> <?php } ?> <tr> <td width="171" height="20" background="images/menu/spacer.gif"></td> </tr> </table> </body> </html> [/code:1:5f248c7b70]mijn indruk van de parent-child.... [code:1:5f248c7b70] +--+----+----------------------+ |id|menu| name | +--+----+----------------------+ | 1| 1 | Hoofdpagina | | 2| 2 | Veilingagenda | | 3| 3 | Volgorde van Verkoop | | 4| 4 | Catalogus | | 5| 5 | Foto's | | 6| 6 | Informatie | | 7| 7 | Contact Info | +--+----+----------------------+ +--+----+----+----------------------+ |id|menu|subs| name | +--+----+----+----------------------+ | 1| 4 | 1 | Bekijken | | 2| 4 | 2 | Zoeken | | 3| 4 | 3 | Bestellen | | 4| 5 | 1 | Vooruitblik | | 5| 5 | 2 | Terugblik | | 6| 6 | 1 | Veilingen | | 7| 6 | 2 | Taxaties | | 8| 6 | 3 | Tarieven | +--+----+----+----------------------+ [/code:1:5f248c7b70]kloppen die tabellen zo ? volgens mij is die onderste nog niet goed want zo kan je nog niet lekker uitbreiden volgens mij ? alvast bedankt
  • Dat doe ik vanavond wel, heb nu even andere verplichtingen... - Bas
  • oke, alvast bedankt je mag me er ook over mailen.
  • Bas, Ik zou het heel fijn vinden als je een klein voorbeeld zou kunnen plaatsen van een eHRM systeem (25 tabellen in mijn geval) met daarbij een stuk code. Je mag me er ook over mailen. :wink: :wink:
  • Hier een opzetje voor parent-child [code:1:3b946b54eb] +----+----+------------------------------+ |id |volg|parent | name | +----+----+-------+----------------------+ | 101| 1 | 0 | Hoofdpagina | | 102| 2 | 0 | Veilingagenda | | 103| 3 | 0 | Volgorde van Verkoop | | 104| 4 | 0 | Catalogus | | 105| 5 | 0 | Foto's | | 106| 6 | 0 | Informatie | | 107| 7 | 0 | Contact Info | | 108| 1 | 104 | Bekijken | | 109| 2 | 104 | Zoeken | | 110| 1 | 109 | Snel | | 111| 2 | 111 | Langzaam | | 112| 3 | 104 | Bestellen | | 113| 1 | 105 | Vooruitblik | | 114| 2 | 105 | Terugblik | | 115| 1 | 106 | Veilingen | | 116| 2 | 106 | Taxaties | | 117| 3 | 106 | Tarieven | | 118| 1 | 117 | LaagSeizoen | | 119| 2 | 117 | HoogSeizoen | | 120| 3 | 117 | Voor Leden | | 121| 1 | 120 | Speciale leden | | 122| 2 | 120 | Hele speciale leden | | 123| 3 | 120 | Super speciale leden | +----+----+-------+----------------------+ Resulteert in een volgend menu * Hoofdpagina * Veilingagenda * Volgorde * Catalogus | * Bekijken | * Zoeken | * Snel | * Langzaam | * Bestellen * Fotos | * Vooruitblik | * Terugblik * Informatie | * Veilingen | * Taxaties | * Tarieven | * Laagseizoen | * Hoogseizoen | * Voor leden | * Speciale leden | * Hele speciale leden | * Super speciale leden * Contact informatie [/code:1:3b946b54eb] ID is een automatisch gegeneerd nummer, maar kan uiteraard ook door jezelf bepaald worden. Volg bepaald de volgorde van weergave, wat je met 'order by' in je query kunt bepalen parent bevat het ID van het hoger gelegen menu. Met een opzet als deze kun je dus een onbeperkt aantal lagen in je menu hebben. 'select * from menus where parent = $idvanbovengelegenmenu order by volg': levert je iedere keer alle childs op van een menu item. Door door zo'n query te loopen (en iedere keer een lager gelegen nummer mee te geven) kun je je volledige menu bouwen, maar dit wordt stap 2 denk ik zo :)
  • Je titel was er zo dichtbij :). Kijk eens op http://www.treeview.net/, daar heb ik ook de code voor een treeview vandaan, en het werkt geweldig!
  • Jammer dat op treeview.net JavaScript/DHTML geboden wordt en de PHP-versie voor een dirlist gemaakt is. Dit terwijl xanues zijn post begint met "Ik wil graag een treeview menu maken m.b.v. [b:ff7074baa0]PHP[/b:ff7074baa0]"
  • Ik zie dat Financial al de tabel heeft gemaakt, maar als je geduld hebt zal ik morgen of overmorgen even een recursieve functie plaatsen om de tree te doorlopen, aangezien ik dat een bijzonder elegante oplossing vind. - Bas
  • Een totaal andere insteek is een methode die o.a. wordt beschreven in het boek [i:89149df5b4]SQL for smarties[/i:89149df5b4] van [i:89149df5b4]Joe Celko[/i:89149df5b4].([url=http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html]voorbeeldje hiervan op internet[/url]).
  • Bedankt Financial, Ik geloof dat ik het verschil snap, ik wacht die van Bas ook nog even af om te kijken wat het verschil precies is tussen parent-child en recursief. Heel erg bedankt. Groeten Marcel
  • [quote:92cec25246="xanuex"]ik wacht die van Bas ook nog even af om te kijken wat het verschil precies is tussen parent-child en recursief.[/quote:92cec25246]Parent-child is de relatie tussen twee nodes (NL: knopen) waarmee je dus een hele tree kan opbouwen, terwijl een recursieve functie een manier van programmeren is die zich onder andere bijzonder goed leent om door trees heen te lopen. Dus gebruik mijn code om door de tabel van Financial heen te lopen en je hebt een werkende tree. Uiteraard kan je de code aanpassen naar eigen inzien, ik heb met veel commentaar de werking proberen duidelijk te maken.[code:1:92cec25246]<?php /* * Gebruikte testtabel: * * CREATE TABLE 'treetable' ( * 'id' SMALLINT(6) NOT NULL AUTO_INCREMENT PRIMARY KEY, * 'volg' SMALLINT(6) NOT NULL, * 'parent' SMALLINT(6) NOT NULL, * 'name' VARCHAR(25) NOT NULL * ); */ /* * Constanten declareren voor de database. */ $dbhost = "localhost"; $dbuser = "JanKlaassen"; $dbpw = "kAtR1Jn"; $dbname = "poppenkast"; /* * Functie declareren en implementeren. */ // Recursieve functie function getTree($parent = 0){ // Begin van de lijst $result = "<ul>\n"; // SQL samenstellen op basis van parent $sql = "SELECT * FROM treetable WHERE parent=".$parent." ORDER BY volg ASC;"; // Query maken in DB $query = mysql_query($sql); // Als er resultaten zijn... while($node = mysql_fetch_array($query)){ // ... deze retourneren en recursief childs opvragen $result .= "<li>".$node["name"]."</li>\n".getTree($node["id"]); } // Eind van de lijst $result .= "</ul>\n"; // Indien geen resultaten ook geen lijst if($result == "<ul>\n</ul>\n") $result = ""; // Retourneer resultaat return $result; } /* * Start van de code. */ // "Permanente" verbinding met DB host mysql_pconnect($dbhost, $dbuser, $dbpw) or die("pconnect failed"); // DB selecteren mysql_select_db($dbname) or die ("select_db failed"); // Tree opvragen $tree = getTree(); // Tree tonen echo $tree; ?>[/code:1:92cec25246]Heel veel succes ermee, de code is getest en werkt maar mocht je vragen hebben dan hoor ik het wel. - Bas
  • Voor het testen heb ik hieronder maar even de MySQL-dump van de tabel van Financial geplaatst, is misschien wel zo prettig om te testen.[code:1:bcf1c2e943] # phpMyAdmin MySQL-Dump # version 2.2.2 # http://phpwizard.net/phpMyAdmin/ # http://phpmyadmin.sourceforge.net/ (download page) # # Host: localhost # Generatie Tijd: Mar 23, 2003 at 02:05 AM # Server versie: 3.23.56 # PHP Versie: 4.1.2 # Database : `JanKlaassen` # -------------------------------------------------------- # # Tabel structuur voor tabel `treetable` # CREATE TABLE treetable ( id smallint(6) NOT NULL auto_increment, volg smallint(6) NOT NULL default '0', parent smallint(6) NOT NULL default '0', name varchar(25) NOT NULL default '', PRIMARY KEY (id) ) TYPE=MyISAM; # # Gegevens worden uitgevoerd voor tabel `treetable` # INSERT INTO treetable VALUES (101, 1, 0, 'Hoofdpagina'); INSERT INTO treetable VALUES (102, 2, 0, 'Veilingagenda'); INSERT INTO treetable VALUES (103, 3, 0, 'Volgorde van Verkoop'); INSERT INTO treetable VALUES (104, 4, 0, 'Catalogus'); INSERT INTO treetable VALUES (105, 5, 0, 'Foto\'s'); INSERT INTO treetable VALUES (106, 6, 0, 'Informatie'); INSERT INTO treetable VALUES (107, 7, 0, 'Contact Info'); INSERT INTO treetable VALUES (108, 1, 104, 'Bekijken'); INSERT INTO treetable VALUES (109, 2, 104, 'Zoeken'); INSERT INTO treetable VALUES (110, 1, 109, 'Snel'); INSERT INTO treetable VALUES (111, 2, 109, 'Langzaam'); INSERT INTO treetable VALUES (112, 3, 104, 'Bestellen'); INSERT INTO treetable VALUES (113, 1, 105, 'Vooruitblik'); INSERT INTO treetable VALUES (114, 2, 105, 'Terugblik'); INSERT INTO treetable VALUES (115, 1, 106, 'Veilingen'); INSERT INTO treetable VALUES (116, 2, 106, 'Taxaties'); INSERT INTO treetable VALUES (117, 3, 106, 'Tarieven'); INSERT INTO treetable VALUES (118, 1, 117, 'Laagseizoen'); INSERT INTO treetable VALUES (119, 2, 117, 'Hoogseizoen'); INSERT INTO treetable VALUES (120, 3, 117, 'Voor Leden'); INSERT INTO treetable VALUES (121, 1, 120, 'Speciale Leden'); INSERT INTO treetable VALUES (122, 2, 120, 'Hele Speciale Leden'); INSERT INTO treetable VALUES (123, 3, 120, 'Super Speciale Leden');[/code:1:bcf1c2e943]Ps. De originele tabel van Financial bevatte een record waar id en parent hetzelfde waren, waardoor de recursieve functie in een oneindige loop geraakte, let daar dus op of bouw een beveiliging in. Daarnaast kan je natuurlijk ook grotere kringen maken die ook zullen leiden tot een oneindige loop, dus enige oplettendheid is geboden. - Bas
  • Bas enorm bedankt voor al je uitleg en inzet, ik zal morgen proberen om deze code eens door te spitten. Ook Financial natuurlijk bedankt. Groeten Marcel
  • Xcuus voor de typo :) Al geeft dit wel weer extra inzicht in deze nieuwe materie. Xanuex succes !
  • Ik heb het script gedraaid en dat werkt prima (zoals vermeld :wink: ) Echter heb ik nog wat problemen, ik wil er namelijk een "uitschuif" menu van maken i.p.v. de tekst onder elkaar, nu had ik dat met mijn voorbeeld al wel voor elkaar zie: [url=http://notarishuis.xanuex.nl/menu/menu.php?menu=1]Oude menu[/url] (klik op catalogus bijvoorbeeld) Maar omdat dit menu niet goed is uit te breiden naar meerdere niveau's en omdat die recursieve functie moeilijk maar toch zéér overzichtelijk is wilde ik toch deze gaan gebruiken alleen loop ik dus nu tegen het probleem op dat ik dat "uitschuiven" weer moet inbouwen. Nu heb ik een poging gedaan deze in te bouwen ook heb ik het script wat ingekort maar het werkt nog niet, [u:44f888e187]ik heb ook geen idee of dit wel de juiste manier is[/u:44f888e187] dus ik zou graag wat tips willen hebben over het juiste gebruik van de functie zonder 'vertragend' resultaat op de website (dus niet 100x overbodig de query doorlopen). mijn aanpassing: [code:1:44f888e187] <?php include('../config.inc.php'); /* * Functie declareren en implementeren. */ // Recursieve functie function getTree($parent = 0){ // Begin van de lijst $result = "<ul>\n"; // SQL samenstellen op basis van parent $sql = mysql_query("SELECT * FROM treetable WHERE parent=".$parent." ORDER BY volg ASC;"); // Als er resultaten zijn... while($node = mysql_fetch_array($sql)){ // ... deze retourneren en recursief childs opvragen $result .= "<li>"."<a href=\"?menu_id=$node[id]\">".$node["name"]."</a>"; // ======== mijn aanpassing voor uitschuif menu ======== \\ if($menu_id == $parent) { $result .= "</li>\n".getTree($node["id"]); } } // Eind van de lijst $result .= "</ul>\n"; // Indien geen resultaten ook geen lijst if($result == "<ul>\n</ul>\n") $result = ""; // Retourneer resultaat return $result; } /* * Start van de code. */ // Tree opvragen $tree = getTree(); // Tree tonen echo $tree; ?> [/code:1:44f888e187] voorbeeld: [url=http://notarishuis.xanuex.nl/menu/treemenu.php]Nieuwe menu[/url] Ik blijf er wel mee bezig dus het kan zijn dat hij het soms niet doet ! [edit] Volgens mij ben ik totaal verkeerd bezig en moet ik nog een query gebruiken om de child-gegevens te kunnen tonen, is dit ook mogelijk m.b.v. de query die in het script staat ? [/edit]

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.