[ZF2] Plusieurs menus de navigation dans ZF2
Zend Framework 2 offre un système de rendu de menu très pratique. Une fois la configuration de votre menu faite, le rendu se fait en une ligne de code et le lien de la page courante se voit attribuer la classe ‘active’ automatiquement. Le problème de ce composant est au niveau de la documentation. En effet, celle-ci n’explique pas clairement comment il est possible d’utiliser plusieurs menus sur notre site. Voici comment faire:
Architecture
Ci contre l’architecture globale de la plupart de mes sites réalisés avec zf2.
Voici une petite description des dossiers pour vous aider à comprendre :
- /config : permet la configuration de l’application via des fichiers php
- /data : contient les données de l’application comme les fichiers de traduction par exemple
- /module : contient les différents modules de l’application
- /module/admin : dossier dédié à l’administration de mon site
- /module/application : dossier dédié au front-office de mon site
- /module/common : dossier dédié aux parties communes de mes différents sites. Il initialise et configure par exemple la traduction des messages d’erreur et le système d’ACL
- /vendor : contient les bibliothèques de l’application et les modules récupérés sur internet
La navigation dans Zf2
Dans Zend Framework 2, il existe un composant tout prêt pour créer vos menus. Si vous ne connaissez pas le composant, je vous invite à lire le quick strat de la doc ici.
Il suffit donc de déclarer les différentes pages du menu dans le fichier de configuration ‘module.config.php’ et ensuite de rendre le menu via l’aide de vue ‘navigation’.
1 |
<?php echo $this->navigation('default')->menu(); ?> |
Plusieurs menus sur le même site
C’est bien beau ça, mais moi je veux plusieurs menus différents sur mon site.
Ne vous inquiétez pas, nous allons voir comment faire.
Comme vous avez pu le voir dans la structure de mon application, je préfère définir la navigation dans un fichier extérieur. La partie navigation de mon fichier ‘module.config.php’ devient alors
1 2 3 4 5 6 7 |
/* .... */ 'navigation' => include(__DIR__.'/navigation.php'), /* .... */ |
Personnellement, j’utilise un menu pour l’administration et un menu pour la partie front office (j’imagine que c’est à peu près le cas pour tout le monde). Je configure le menu de chaque module dans le dossier de configuration de celui-ci.
Le fichier /module/Admin/config/navigation.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?php return array( 'admin' => array( array( 'label' => 'Accueil', 'module' => 'Admin', 'controller' => 'index', 'action' => 'index', 'class' => 'nav-header', 'pages' => array( array( 'label' => 'Accueil', 'title' => 'Accueil', 'module' => 'Admin', 'controller' => 'index', 'action' => 'index', ), array( 'label' => 'Gérer les actualitées', 'title' => 'Actualité', 'module' => 'Admin', 'controller' => 'news', 'action' => 'index', ), ), ), array( 'label' => 'Gestion', 'module' => 'Admin', 'controller' => 'gestion', 'action' => 'changerpasse', 'class' => 'nav-header', 'pages' => array( array( 'label' => 'Gestion utilisateurs', 'module' => 'Admin', 'controller' => 'useradmin', 'action' => 'index', ), ), ), ) /**/ ) ?> |
Le fichier /module/Application/config/navigation.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php return array( 'application' => array( array( 'label' => 'Accueil', 'route' => 'accueil', ), array( 'label' => 'Actualités', 'route' => 'actualites', ), array( 'label' => 'Contact & accès', 'route' => 'contact', ), ), ) ?> |
Maintenant que nos menus sont définis et seront chargés automatiquement par zf2, il faut pouvoir désigner lequel sera affiché. Pour cela, nous allons créer une classe qui va dire à zend navigation quel menu afficher. Cette classe doit étendre ‘Zend\Navigation\Service\DefaultNavigationFactory’ et implémenter ‘getName()’ qui doit retourné le nom du menu à afficher.
Par exemple, pour afficher mon menu nommé ‘admin’, je crée la classe suivante :
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace Pw\Navigation\Service;//PW est ma petite bibliothèque perso de fonctions/classes utilent class AdminNavigationFactory extends \Zend\Navigation\Service\DefaultNavigationFactory { protected function getName() { return 'admin'; } } ?> |
Pour que zend puisse l’appeler via le service manager, il ne faut pas oublier de la déclarer dans les factories de module.config.php (celui que vous voulez, personnellement, je les déclare dans mon module commun pour pouvoir les réutiliser).
module.config.php
1 2 3 4 5 |
'service_manager' => array( 'factories' => array( 'Admin_navigation' => 'Pw\Navigation\Service\AdminNavigationFactory', ), ), |
Et voilà, c’est terminé, vous n’avez plus qu’à afficher votre super-menu comme ceci :
1 |
<?php echo $this->navigation('Admin_navigation')->menu();?> |
Zend Framework va automatiquement instancier ‘AdminNavigationFactory’ , récupérer le nom du menu via la méthode ‘getName()’ et rendre le menu qui porte ce nom.
PS : Pensez à inclure les divers fichiers dont vous avez besoin ou utilisez l’auto-loader de zf2.