Beste PRGers,
Momenteel ben ik een inhouse-tool aan het maken, welke als GUI een webpaginaatje heeft. Ik gebruik CodeIgniter als MVC-platform en had voorheen een model gemaakt welkte het menu genereerde uit statische PHP-code; naast het feit dat het ontzettend veel werk is om het menu te onderhouden, werkt het ook nog eens lastig om het netjes te verwerken.
Nu kwam ik laatst weer de blog van Crisp tegen: Crisp's blog: Formatting a multi-level menu using only one query. Zijn aanpak is retesimpel qua code en ook nog eens overzichtelijke datalaag (MySQL).
Ik heb de volgende MySQL table aangemaakt:
Echter kan ik nu niet een parent_id van 0 aangeven zoals de tutorial aangeeft. Op dat moment krijg ik de volgende MySQL-foutmelding:
Ik begrijp wat er staat, maar mij lijkt het het netste om wel een foreign key te gebruiken om te verwijzen naar het parent_id.
Omdat ik nu het root-menu-item een parent_id van NULL geef, dan valt de opbouw van het array in het water; Immers schrijft
het $menuItem->id weg op index $this->_menuData['parents'][NULL][]
Daarbij komt nog dat
onherroepelijk faalt voor een root-object, omdat $parentId 0 niet bestaat (waar de code wel vanuit gaat).
Naar mijn menig heb ik 3 mogelijke oplossingen;
Alvast bedankt!
Matis
Momenteel ben ik een inhouse-tool aan het maken, welke als GUI een webpaginaatje heeft. Ik gebruik CodeIgniter als MVC-platform en had voorheen een model gemaakt welkte het menu genereerde uit statische PHP-code; naast het feit dat het ontzettend veel werk is om het menu te onderhouden, werkt het ook nog eens lastig om het netjes te verwerken.
Nu kwam ik laatst weer de blog van Crisp tegen: Crisp's blog: Formatting a multi-level menu using only one query. Zijn aanpak is retesimpel qua code en ook nog eens overzichtelijke datalaag (MySQL).
Ik heb de volgende MySQL table aangemaakt:
SQL:
1
2
3
4
5
6
7
8
9
10
11
| delimiter $$ CREATE TABLE `menus` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(10) unsigned DEFAULT NULL, `name` varchar(255) NOT NULL, `url` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `fk_menus_parent_id` (`parent_id`), CONSTRAINT `fk_menus_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `menus` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8$$ |
Echter kan ik nu niet een parent_id van 0 aangeven zoals de tutorial aangeeft. Op dat moment krijg ik de volgende MySQL-foutmelding:
ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (`ci_showcase`.`menus`, CONSTRAINT `fk_menus_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `menus` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) SQL Statement: UPDATE `ci_showcase`.`menus` SET `parent_id`=0 WHERE `id`='5'
Ik begrijp wat er staat, maar mij lijkt het het netste om wel een foreign key te gebruiken om te verwijzen naar het parent_id.
Omdat ik nu het root-menu-item een parent_id van NULL geef, dan valt de opbouw van het array in het water; Immers schrijft
PHP:
1
| $this->_menuData['parents'][$menuItem->parent_id][] = $menuItem->id; |
het $menuItem->id weg op index $this->_menuData['parents'][NULL][]
Daarbij komt nog dat
PHP:
1
| if (isset($this->_menuData['parents'][$parentId])) |
onherroepelijk faalt voor een root-object, omdat $parentId 0 niet bestaat (waar de code wel vanuit gaat).
Naar mijn menig heb ik 3 mogelijke oplossingen;
- Ik pas de FK aan in MySQL zodat hij parent_id 0 slikt
- Ik wijzig de voorbeeldcode zodat NULL toch bruikbaar wordt
- Ik maak een root-root-object (met parent_id = NULL) aan en gebruik zijn id als parent_id voor de opbouw van het menu
Alvast bedankt!
Matis
If money talks then I'm a mime
If time is money then I'm out of time