Ik ben bezig met een hierarchische menu structuur voor een soort webshop. Alle categorieën moeten dus worden getoond als menu met daaronder weer submenu's etc etc.
2 tabellen:
table Categorie:
table Hierarchie:
Volgens de 'The Adjacency List Model' op sitepoint.
Nou is het me al gelukt om de hele tree te outputten met indent en al, dmv deze functie:
Werkt prima, maar ik wil de hele tree in 1x outputten, zodat JSCookMenu het snapt (voor menu weergave, wordt ook gebruikt door oa mambo: klik).
Urls/items moeten zo aangeleverd worden:
De layout is uiteraard geen probleem, maar om precies op het goede moment de '[' en de ']' te outputten heb ik moeite. Heb van alles geprobeerd, maar krijg het niet voor elkaar. Ik zit te denken dat het misschien mogelijk is als je weet hoeveel nodes er nog onder zitten, zodat je rekening kan houden met het outputten van [ en ], maar weet het niet zeker. Kreeg de functie ook niet gebakken die weer het aantal nodes eronder zou moeten uitrekenen. Aantal nodes erboven is me gelukt:
Maar zoiets maken voor aantal nodes eronder is volgens mij niet mogelijk... Ik hoop dat iemand mij op weg kan helpen.
2 tabellen:
table Categorie:
parentcat_id | childcat_id |
0 | 1 |
1 | 2 |
1 | 3 |
2 | 4 |
3 | 5 |
table Hierarchie:
categorie_id | naam |
1 | hoofdcategorie |
2 | categorie1 |
3 | categorie2 |
4 | subcategorie1 |
5 | subcategorie2 |
Volgens de 'The Adjacency List Model' op sitepoint.
Nou is het me al gelukt om de hele tree te outputten met indent en al, dmv deze functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function showMenu($parentcat, $level) { $sql = "SELECT h.*, c.naam FROM Hierarchie AS h LEFT JOIN Categorieen AS c ON c.categorie_id = h.childcat_id WHERE h.parentcat_id = '".$parentcat."' "; $res = mysql_query($sql) or die(mysql_error()); $tel = mysql_num_rows($res); while( $row = mysql_fetch_assoc($res) ) { echo str_repeat("--", $level)." ".$row['naam']."<br>"; showMenu($row['childcat_id'], $level+1); } } |
Werkt prima, maar ik wil de hele tree in 1x outputten, zodat JSCookMenu het snapt (voor menu weergave, wordt ook gebruikt door oa mambo: klik).
Urls/items moeten zo aangeleverd worden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <script type="text/javascript"><!-- var myMenu = [ ['icon', 'title', 'url', 'target', 'description'], // a menu item ['icon', 'title', 'url', 'target', 'description'], // a menu item _cmSplit, ['icon', 'title', 'url', 'target', 'description', // a folder item ['icon', 'title', 'url', 'target', 'description'], // a menu item _cmSplit, ['icon', 'title', 'url', 'target', 'description'], // a menu item ['icon', 'title', 'url', 'target', 'description', // a folder item ['icon', 'title', 'url', 'target', 'description'], // a menu item ['icon', 'title', 'url', 'target', 'description'] // a menu item ] ] ]; --></script> |
De layout is uiteraard geen probleem, maar om precies op het goede moment de '[' en de ']' te outputten heb ik moeite. Heb van alles geprobeerd, maar krijg het niet voor elkaar. Ik zit te denken dat het misschien mogelijk is als je weet hoeveel nodes er nog onder zitten, zodat je rekening kan houden met het outputten van [ en ], maar weet het niet zeker. Kreeg de functie ook niet gebakken die weer het aantal nodes eronder zou moeten uitrekenen. Aantal nodes erboven is me gelukt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| function nodes_above($childcat, $counter=0) { //Haal parent id op behorende bij de meegegeven child $res = mysql_query("SELECT h.parentcat_id FROM Hierarchie AS h WHERE childcat_id='".$childcat."' ") or die(mysql_error()); $row = mysql_fetch_assoc($res); //Als parent id niet 0 is, dan zijn we nog niet aan het einde van de boom if ($row['parentcat_id'] != 0) { $counter = nodes_above($row['parentcat_id'], $counter+1); } return $counter; } |
Maar zoiets maken voor aantal nodes eronder is volgens mij niet mogelijk... Ik hoop dat iemand mij op weg kan helpen.