IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Plugins, Aides d'Action and Cie [ZF 1.9]


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Par défaut Plugins, Aides d'Action and Cie
    Bonjour à tous,

    Références :
    http://julien-pauli.developpez.com/t...s/?page=page_2
    http://www.kitpages.fr/zf_helper_plugin.php
    http://akrabat.com/zend-framework-tutorial/
    http://akrabat.com/zend-auth-tutorial/


    Débutant en Php, j'appuie mes développements sur la logique du Zend F et, entre autres, les références ci-dessus.
    Comme nombre sites, je souhaite un module de connexion, d'authentification. En revanche, je ne souhaite pas une page dédiée à la connexion mais plutôt un formulaire situé dans un cadre au-dessus de mon menu gauche, par exemple.

    Cette authentification doit être accessible depuis plusieurs formulaires et donc le code se doit d'être centralisé et non redondant dans chacune des pages.
    Après mes diverses lectures sur les Plu-gins, Aides de Vue ou Aides de Controller, voici ce que je suis arrivé à pondre et dont je ne suis pas satisfait bien que cela fonctionne.

    ...\application\Bootstrap.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    .../...
     
            protected function _initViewHelpers()
        {
                    .../...
            $view->addHelperPath(APPLICATION_PATH . '/views/helpers');
                    .../...
            $view->user = Zend_Auth::getInstance()->getIdentity();        
        }
     
        .../...
    ...\application\controllers\IndexController.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
     
    class IndexController extends Zend_Controller_Action
    {
        function preDispatch()
        {
                if ($this->view->monlogin($this)) {
                    $this->_redirect();
                }
        }
     
        public function indexAction()
        {
                $this->view->title = "Accueil";                                                        //à dispo pour la vue si souhaite afficher un titre : mettre la page en cours
                $this->view->headTitle($this->view->title, 'PREPEND');        //rajoute le titre dans onglet et barre de titre de la page
                                                                                                                                        //concatène au titre du site défini dans le bootstrap : $view->headTitle
        }
     
     
    }
    ...\application\controllers\AidenavigationController.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
     
    class AidenavigationController extends Zend_Controller_Action
    {
            function preDispatch()
            {
                if ($this->view->monlogin($this)) {
                    $this->_redirect();
                }
            }
     
        public function indexAction()
        {
            $this->view->title = "Aide à la Navigation";                            
                    $this->view->headTitle($this->view->title, 'PREPEND');        
        }
    }
    ...\application\views\helpers\MonLogin.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <?php
    class Zend_View_Helper_Monlogin
    {
     
        public $thisencours;
     
        function monlogin($thisindex)
        {
     
            $auth = Zend_Auth::getInstance();
            if (!$auth->hasIdentity()) {
                    $this->thisencours = $thisindex;
                    return $this->loginAction();
     
            } 
     
        }
     
        public function loginAction()
        {
                    $form = new Form_Login();
                    $form->submit->setLabel('Connexion');
                    $this->thisencours->view->form = $form;
     
                    if ($this->thisencours->getRequest()->isPost()) {
     
                            $formData = $this->thisencours->getRequest()->getPost();
     
                            if ($form->isValid($formData)) {
     
                                    $id = (int)$form->getValue('id');            
                                    $username = $form->getValue('username');
                                    $password = $form->getValue('password');
     
                                    if (empty($username)) {
     
                                            $this->thisencours->view->message = 'Renseigner un nom d\'utilisateur.';
     
                                    } else {
     
                                        $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter());
                                        $authAdapter->setTableName('users')
                                                                ->setIdentityColumn('username')
                                                                ->setCredentialColumn('password')
                                                                ->setCredentialTreatment("MD5(CONCAT(?,id))")
                                                                ->setIdentity($username)
                                                                ->setCredential($password);
     
                                        // Authentication 
                                        $auth = Zend_Auth::getInstance();
                                        $result = $auth->authenticate($authAdapter);
     
                                        if ($result->isValid()) {
                                                // REUSSITE : on mémorise session ouverte et on se balade sur le site
                                                $data = $authAdapter->getResultRowObject(null, 'password');
                                                $auth->getStorage()->write($data);
                                                return true;
                                        } else {
                                                // ECHEC: on recommence
                                                $this->thisencours->view->message = 'Login Incorrect.';
                                        }
                                    }
                            } else {
                                $this->thisencours->view->message = 'Renseigner un nom d\'utilisateur.';
                            }
                    }
        }
    }
    Qu'est ce qui ne me va pas ?

    1 - la désagréable sensation d'avoir créé un hybride, mélange de Aides d'Action, Plugin... fruit sans doute de ma mauvaise compréhension de ces outils.
    Il me semble que je devrais créer un Plugin mais comment, vu la question n° 2 ?

    2 - Voyez ce "public $thisencours" et le passage en paramètre de $this à ma fonction monlogin() : je suis persuadé que l'on peut faire sans mais je n'y arrive pas et c'est là que j'implore votre aide et votre pardon pour mon ignorance.

    3 - redondance du preDispatch dans chaque page : alors qu'un vrai plugin devrait être initié je pense dans le Bootstrap, si encore je savais identifié le $this du point 2.

    Voilà pour aujourd'hui l'épine du pied que je vous confie. Merci d'avance.

  2. #2
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    Salut,

    J'ai pas tout compris à ton code mais c pas grave

    Déjà je pense pas que ce soit une bonne idée d'envoyer dans toute tes vues l'identité de l'utilisateur. Tu devrais la récupérer au besoin.

    En fait tu devrais créer un controlleur 'loginController' qui gère l'authentification.
    Ensuite dans ce controlleur tu crée une action 'blockauthAction' qui va afficher le block de connexion/ou connecté de la façon suivante :

    Tu récupère l'instance de Zend_Auth
    Si l'utilisateur n'est pas identifié tu affiche le formulaire grace à un template genre 'formlogin.phtml'
    Si l'utilisateur est identifié tu affiche un autre template genre 'bienvenue.phtml'

    Pour finir, dans ton layout tu place ceci à l'endroit que tu veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?php echo $this->action('blockauth','login') ?>

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Par défaut
    Bonjour et merci Manuscle pour ta contribution,

    je vais voir dans la pratique si j'arrive à assimiler ta proposition.

    Quant à la clarté de mon code, il est quasi la retranscription des sources citées en référence si ce n'est sa présentation sous forme de helper avec le param $this.

    Si quelque chose n'est pas clair, précise moi de quoi il s'agit que je puisse corriger le tir, cela aidera peut être les visiteurs à me répondre.

    Merci encore.

  4. #4
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    Bon, j'avoue, j'ai pas tout lu!

    Mais ce qui me saute aux yeux, c'est le fait que tu utilise une aide de vue pour réaliser un action qui consiste à logguer l'utilisateur en lui passant l'instance de ton controleur.

    C'est pas du tout le but d'une aide de vue, par contre ça peut être le but d'une aide d'action mais je suis pas fan.

    Voici comment je procède :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    class LoginController extends Zend_Controller_Action
    {
    // Formulaire de login ou affichage du welcome message
    public function blockauthAction()
    {
            $auth = Zend_Auth::getInstance();
     
            if ($auth->hasIdentity()) {
                // Identité = fenetre utilisateur
                $this->view->user = $auth->getIdentity();
                $this->renderScript('login/welcome.phtml');
            } else {
                // pas d'identité = formulaire
                $this->renderScript('login/loginForm.phtml');
            }
    }
     
    // L'utilisateur vient de poster le formulaire
    // L'action du formulaire doit être /login/login
    public function loginAction()
    {
    $login = $this->_request->getPost('login');
    $pass = $this->_request->getPost('pass');
    /** 
    Ensuite authentification... soit à l'aide d'une aide d'action ou directement dans le controlleur
    **/
    }
     
    // L'utilisateur à cliqué sur le lien /login/logout
    // Il se déconnecte
    public function logoutAction()
    {
            Zend_Session::destroy();
            $this->_redirect('/');
    }
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Par défaut
    Encore merci Manuscle,

    Cela s'annonce bien à un détail près, probablement du à mon interprétation. Comment t'expliquer simplement le soucis qu'il reste.

    Sur la base de tes conseils, voici ce que j'ai mis en place :

    Dans mon layout.phtml tout d'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        
        <body>            
            <?php include 'logo.tpl'; ?>
            <div id="cadre_global">
                    <div id="colonne_gauche">
                        <?php echo $this->action('authentification','login') ?>
                        <?php include 'menu.tpl'; ?>
                    </div><br />      <!-- Fin colonne_gauche  -->
    
                    <div id="colonne_milieu">        <!-- ICI on balance la vue en cours, exemple index.phtml-->
    
                       <?php include 'logininfo.tpl'; ?>
    
                        <?php echo $this->layout()->content; ?>
    
                    </div>      <!-- Fin colonne_milieu -->
                    
                    <?php include 'piedpage.tpl'; ?>
            </div>        <!-- Fin cadre_global -->
        </body>
    </html>
    j'ai ajouté la ligne comme ton 1er mail le soulignait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $this->action('authentification','login') ?>
    Ensuite j'ai rajouté un LoginController avec les actions authentificationAction et loginAction.

    Voici mon authentificationAction() qui diffère du tien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function authentificationAction()
    {
            $auth = Zend_Auth::getInstance();
            if (!$auth->hasIdentity()) {
                    $this->loginAction();
            } 
            $this->renderScript('identification.tpl');
     
    }
    et voici donc le identification.tpl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?php if(!$this->user) : ?>
                        <div id="identification">
                                <h3>Identification</h3>
                                <?php echo $this->form ;?>
                        </div>        <!-- Fin identification -->
                    <?php else: ?>
     
                        <div id="identification">
                            <h3>Identification</h3>
                            <!--
                            <p>Bonjour <php echo $this->escape($this->user->real_name);?>,</p> <php echo $this->form ;?>
                            -->
                            <p>Bonjour <?php echo $this->escape($this->user->real_name);?>,</p> 
                            <a href="<?php echo $this->html(myHTTP_ROOT).'index/logout';?>">
                                <input type="text" name="deconnect" class="bouton" readonly="readonly" value="Déconnexion"></input>
                            </a>
     
                        </div>        <!-- Fin identification -->
     
                    <?php endif; ?>
    dans lequel je gère le fait d'être ou non connecté. Jusque là tout va bien, quoique je pense t'avoir perdu dans cette lecture monotone.

    Le soucis qu'il me reste c'est que dans le loginAction, si les infos sont incorrectes (absence Login et/ou Mdp), je renseigne une variable $message que je ne veux pas afficher dans le bloc d'authentification mais au-dessus de la partie contenu par le biais du logininfo.tpl que tu vois en vert dans mon layout.phtml.

    Le soucis c'est que je ne vois pas ladite variable.

    Je sais que c'est hyper chaud de se fader le code des autres ce qui rend les explications délicates. Si je ne t'ai pas perdu, je te remercie d'avance.

    Dans tous las cas, j'ai bien avancé, merci encore.

  6. #6
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    En fait pour l'affichage de messages tu peux utiliser FlashMessenger fournit par Zend Framework, qui te permet d'afficher de façon générale, n'importe quel message à un endroit précis de ta page

    Regarde la doc :
    http://framework.zend.com/manual/1.1...onhelpers.html

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Par défaut
    Une fois de plus merci Manuscle,

    je vais mettre ce post en résolu dans la mesure où tu as solutionné mon + gros soucis.

    Pour FlashMessenge, il va probablement falloir que je relise mieux la doc, en l'état je reste bloqué pour pouvoir adresser correctement la variable message, mais bon, cela provient surement de mon aversion de la doc zend, que pour ma part, je trouve indigeste.

    Un grand merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [débutant] problème création tableau (pointeurs and Cie)
    Par olivier1209 dans le forum Débuter
    Réponses: 13
    Dernier message: 08/03/2009, 15h54
  2. Réponses: 1
    Dernier message: 02/08/2008, 19h21
  3. Réponses: 1
    Dernier message: 19/12/2007, 12h55
  4. [plugin]aide au développement d'un plugin XML
    Par Bb_TiTi dans le forum Eclipse Platform
    Réponses: 7
    Dernier message: 06/07/2006, 10h28
  5. dlls & lib and cie
    Par Merfolk dans le forum C++Builder
    Réponses: 10
    Dernier message: 30/06/2004, 17h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo