Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous et à toutes,
voila je débute et découvre ZF2 et je souhaiter mettre en place un systeme ou le menu du site change selon l'utilisateur qui est connecté, voici ce que j'ai fais :
tous d'abord je crée une session : (fichier module.php)
[lang=php] public function getServiceConfig() { return array( 'factories' => array( 'session' => function ($sm) { $config = $sm->get('config'); $sessionConfig = new SessionConfig(); $sessionConfig->setOptions($config['session']); $session = new SessionManager($sessionConfig); $session->start(); $container = new Container('appsession'); $container->layout = 'layout'; return $container; }, ), ); }
et j'ajoute dans ce mêe fichier la fonction suivante :
[lang=php] public function init(ModuleManager $moduleManager) { $sharedEvents = $moduleManager->getEventManager()->getSharedManager(); $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) { $session = $e->getApplication()->getServiceManager()->get('session'); // This event will only be fired when an ActionController under the MyModule namespace is dispatched. $controller = $e->getTarget(); $controller->layout('layout/' . $session->layout); }, 100); }
ensuite je crée les 2 menus voici ce que j'ai fais :
dans vendor\ZFPerso\Navigation\Service\ je crée le fichier suivant :
[lang=php] namespace ZFPerso\Navigation\Service; use Zend\Navigation\Service\DefaultNavigationFactory; class secondNavigationFactorie extends DefaultNavigationFactory { protected function getName() { return 'second'; } }
ensuite je le déclare dans le autoload_classmap.php puis je l'intègre dans la fabrique :
[lang=php] 'service_manager' => array( 'factories' => array( 'Navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory', 'secondNavigation' => 'ZFPerso\Navigation\Service\secondNavigationFactorie', ), ),
voila et évidement j'ai 2 layout différents avec chacun leur menu.
Donc j'aurais voulu avoir l'avis d'utilisateurs plus expérimentés que moi pour savoir si pour afficher un menu différent selon l'utilisateur j'avais utilisée la bonne méthode
PS : bien sur si vous avez le temps car chacun à sa vie
merci d'avance
Hors ligne
Salut déjà un petit truc. Tu peux créer une classe de factory plutôt que mettre la session dans le fichier Module.php comme ça tu peux la déclarer en une seule ligne dans le fichier module.config.php
shishi a écrit:
vendor\ZFPerso\Navigation\Service\ je crée le fichier suivant
Ca tu n'es pas obligé de le mettre dans le dossier vendor tu peux faire un module que tu intègres à ton application qui va servir à gérer les menus par exemple ou le faire dans le module principale de ton application et gérer les différences dans chaque module qui le concerne.
Ensuite j'ai pas trop utilisé le composant navigation mais de mémoire il faut utiliser celui de Spiffy qui est l'officiel mais n'était pas prêt à temps pour l'intégrer au ZF2. Donc il est fort probable qu'il y soit dans le ZF3, le maitriser peut donc être un plus.
Personnellement pour les menus, comme je n'utilises pas le composant navigation j'ai une aide de vue qui va prendre un template différent suivant le membre . Je me prend moins la tête que toi mais encore une fois j'utilise pas les mêmes composants donc ...
Sinon ta solution me parait pas complètement bête
Hors ligne
Déjà merci pour ton retour pour ce qui est de l'aide de vue je ne pense pas assez maitriser ZF2 pour la crée, Je vais regarder du coté du composant de Spiffy.
Et merci pour tes encouragement car j'avoue il y a pas beaucoup d'info sur le net pour l'instant et comme je débute je connais pas les fonction que l'on peux utilisées ou autre.
Hors ligne
une petite question si tu as le temps bien sur est ce que tu utilise flashmessenger?
car je voudrais l'utiliser pour afficher un message lorsque l'utilisateur post un formulaire (soit une erreur ou un succes) le souci c'est que en local tous fonctionne et sur le serveur de prod les messages s'affichent si je reste dans loginAction ( action du formulaire) mais si après je redirige (en cas de succès) vers AccountAction les messages ne s'affichent plus.
tu aurais une idée?
Hors ligne
C'est pas compliqué à faire une aide de vue, ça doit être expliqué dans la doc "View Helpers".
Pour le flashMessenger il faut faire un redirect dans ton contrôleur pour que ça soit affiché puisque c'est affiché à la prochaine requête donc si tu retournes simplement la vue c'est toujours la même requête. Faut aussi penser à l'afficher partout donc l'idéal encore une fois c'est de faire une aide de vue que tu mets dans ton layout ou alors l'appeler directement depuis le layout ou encore la méthode crade dupliquer le code sur toutes tes vues :p.
Pour tes exemples sans code ni connaissance de l'application c'est du chinois :p.
Hors ligne
Pour l'aide de vue j'ai déjà regarder mais j'avais pas penser à en faire une pour ca.
esxuse moi pour le code je vais te le donner et je fais bien un redirect après pour l'afficher
fichier indexController
[lang=php] public function loginAction() { $form = new loginForm(); $request = $this->getRequest(); if ($request->isPost()) { $loginData = $request->getPost(); $form->setData($loginData); if ($form->isValid()) { $loginData = $form->getData(); /*ici tous mes controle*/ if (succes) { $this->plugin('flashmessenger')->addSuccessMessage(utf8_encode('identification réussie.')); return $this->plugin('redirect')->toRoute('user-account'); } } $this->plugin('messenger')->addErrorMessage(utf8_encode('identifiant ou mot de passe incorrecte.')); return $this->plugin('redirect')->toRoute('user-login'); } return array( 'form' => $form, ); } public function accountAction() { return array(); }
ensuite dans ma fabrique fichier module.config
[lang=php] 'controller_plugins' => array( 'invokables' => array( 'messenger' => 'Zend\Mvc\Controller\Plugin\FlashMessenger', ) ),
et dans ma vue
[lang=php] echo $this->flashMessenger()->render('error');
j'espère qu'il manque rien et je vais voir pour le mettre dans le layout car il existe déjà une aide de vue pour flashmessenger
Hors ligne
Salut alors dans un des cas tu fais un success et l'autre error donc faut que tu penses bien à afficher le bon dans ta vue. Je pense que le problème vient de là.
Ensuite tu n'as pas besoin de déclarer le flasessenger dans tes fichiers de configuration il y est deja par defaut dans le ZF2. Ensuite pour utiliser tes plugins dans les controleurs tu n'es pas obligé d'appeler "plugin" mais tu peux directement faire : $this->flashMessenger() ou $this->redirect().
Hors ligne
Bonjour,
encore une foi merci de me répondre, alors j'avais bien penser à afficher le bon dans a vue, j'ai modifié mon code selon ce que tu m'avais dis ce qui me donne :
- j'ai enlever la déclaration du plugin dans module.config.php
ensuite dans mon indexController.php
[lang=php] public function loginAction() { $form = new loginForm(); $request = $this->getRequest(); if ($request->isPost()) { $loginData = $request->getPost(); $form->setData($loginData); if ($form->isValid()) { $loginData = $form->getData(); /*ici tous mes controles*/ if ($succes) { $this->flashmessenger()->addSuccessMessage(utf8_encode('identification réussie.')); return $this->redirect()->toRoute('user-account'); } } $this->flashmessenger()->addErrorMessage(utf8_encode('identifiant ou mot de passe incorrecte.')); return $this->redirect()->toRoute('user-login'); } return array( 'form' => $form, ); } public function accountAction() { return array('message' => $this->flashMessenger()->getMessagesFromNamespace('success')); }
ensuite dans ma vue user-account :
[lang=php] echo $this->flashMessenger()->render('success'); foreach ($this->message as $mes){ echo $mes; }
Voila et sur mon xampp local tout fonctionne j'ai bien 2 foi le message qui s'affiche lorsque je suis sur la vue user-accout mais sur le serveur de prod rien ne s'affiche
Hors ligne
Alors là aucune idée, déjà tu peux virer le utf8_encode ça sert à rien .
Essaies d'afficher les erreurs pour voir ce qu'il te dit.
Hors ligne
Bonjour, en faite j'ai vu le responsable réseaux et c'était juste un problème sur le serveur de prod mais tout est rentré dans l'ordre et tout fonctionne à merveille (merci encore).
Par contre j'ai essayer de faire quelque chose pour afficher le layout en fonction du membre : j'arrive à créer une aide de vue qui prend un paramètre et selon ce paramètre ça modifie le layout.
ensuite je suis tombé sur cette "discussion" : Discussion
j'ai donc voulu m'en inspirer voici ce que j'ai fais :
création d'un controller abstrait :
[lang=php] abstract class MenuController extends AbstractController { protected $membre; public function __construct() { $this->getEventManager()->attach('Dispatch',array($this,'onDispatch'),10); } public function onDispatch(MvcEvent $e) { $this->layout()->membre = 'test'; }
et dans mon layout je récupère bien "test" en faisant
[lang=php] echo $this->membre;
le souci c'est que je ne récupère plus le contenu de ma vue (formulaire et variables), cela doit être un détail mais je ne vos pas.
quelqu'un pourrait-il m'aiguiller sur mon erreur car j'aimerais bien comprendre merci d'avance
Réponse :
j'ai trouver la solution que voici :
voici le fichier MenuController
[lang=php] class MenuController extends AbstractActionController { protected $_membre; public function dispatch(Request $request, Response $response = null) { // attach a post dispatch event $this->getEventManager()->attach(MvcEvent::EVENT_DISPATCH, array($this, 'postDispatch'), -100); return parent::dispatch($request, $response); } public function postDispatch(MvcEvent $e) { $this->layout()->membre = 'test'; } }
et la je récupère bien la variable membre dans mon layout ainsi que toute ma vue.
Dernière modification par shishi (06-05-2013 13:23:02)
Hors ligne
Pages: 1