Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-05-2013 13:41:20

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Juste des conseils concernant les bonnes pratiues et mon code

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)

Code:

 [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 :

Code:

 [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 :

Code:

 [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 :

Code:

 [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

 

#2 04-05-2013 18:59:50

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Juste des conseils concernant les bonnes pratiues et mon code

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 smile. 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 smile

Hors ligne

 

#3 04-05-2013 19:12:28

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Juste des conseils concernant les bonnes pratiues et mon code

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

 

#4 04-05-2013 19:32:35

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Juste des conseils concernant les bonnes pratiues et mon code

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

 

#5 04-05-2013 19:41:46

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Juste des conseils concernant les bonnes pratiues et mon code

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

 

#6 04-05-2013 19:52:26

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Juste des conseils concernant les bonnes pratiues et mon code

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

Code:

 [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

Code:

 [lang=php]
'controller_plugins' => array(
        'invokables' => array(
            'messenger' => 'Zend\Mvc\Controller\Plugin\FlashMessenger',
        )
    ),

et dans ma vue

Code:

 [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

 

#7 05-05-2013 10:19:11

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Juste des conseils concernant les bonnes pratiues et mon code

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

 

#8 05-05-2013 12:28:37

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Juste des conseils concernant les bonnes pratiues et mon code

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

Code:

 [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 :

Code:

 [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

 

#9 05-05-2013 13:29:48

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Juste des conseils concernant les bonnes pratiues et mon code

Alors là aucune idée, déjà tu peux virer le utf8_encode ça sert à rien wink.

Essaies d'afficher les erreurs pour voir ce qu'il te dit.

Hors ligne

 

#10 06-05-2013 11:36:22

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Juste des conseils concernant les bonnes pratiues et mon code

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 :

Code:

 [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

Code:

[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

Code:

 [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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages