Ik heb een main menu bestaande uit 8 records. Van deze 8 records hebben er 3 ook sub items (submenu) Er is mij vaak verteld om volgens een structuur te werken waar zowel de main items als de sub items in dezelfde database tabel staan gebruikmakend van parent_id. Iets zoals dit:
Op zich klinkt het heel logisch maar ik heb geen idee hoe ik hier mee om moet gaan in mijn Model (query), View (Template) en Controller. Ik werk namelijk via het MVC principe. Kan iemand mij een stap op weg helpen.
Met twee slimmigheidjes los je dat in PHP op.
1) stop de menu items die bij elkaar horen in een array (doe print_r($menu) om te zien wat ik bedoel)
2) maak een recursive functie die zichzelf herhaaldelijke keren aanroept en zo het menu maakt
De MVC methode is enkel bedoeld om verantwoordelijkheden onder te verdelen waardoor je programma beter gestructureerd wordt.
Het renderen van de menu items zou ik niet in de view doen (als uitzondering op de rest) vanwege de complexe geneste structuur. In plaats daarvan zou je je eigen class moeten bouwen die meer opties biedt dan mijn voorbeeldje. Minimaal zou je in je data ook een css-class mee moeten kunnen geven en natuurlijk ook de link.
Maar je kunt ook nog denken aan een icon, een "active" menu-item en aan disabled menu items :-)
In je controller zou je dan iets kunnen doen als
<?php
$menu = new MyCustomMenu(); // je eigen class
$menu->initialize($this->page->get_menu());
Sorry voor een beetje late reactie. Afgelopen week in de lappemand gelegen (snip en snip verkouden). Even terugkomend op deze kwestie. Er zijn een aantal dingen die mij verwarren. Allereerst je hebt het over een complexe geneste structuur, maar zo complex is het eigenlijk toch niet. Er zijn twee levels. 1 met parent_id = NULL en 1 met parent_id = 2 dan wel 3. Ik heb jou methode proberen na te maken in de voor mij bekende werkwijze:
public function get_menu_items($lang)
{
$sql = "SELECT *
FROM menu
WHERE language_abbr = ?";
$items = $this->pdo->prepare($sql);
$items->execute(array($lang));
$menu_items = array();
foreach ($items as $item) {
if (!isset($menu_items[$item['parent_id']])) {
$menu_items[$item['parent_id']] = array();
}
$menu_items[$item['parent_id']][] = $item;
}
return $menu_items;
}
Dit geeft me in principe al de eerste laag (parent_id = NULL). Er is een andere reden waarom ik het een en ander wel graag in de View doe en wel om de reden dat de site Bootstrap based is dus ik ook nog wel wat classes etc kwijt moet (dropdown etc).
Ben alleen niet zeker hoe ik de tweede laag (sub menus) moet genereren