Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-12-2012 23:41:03

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Z.F 1.12 : Zend_Form dans toute mes pages

Bonjour,

Je voudrais pouvoir avoir un formulaire de login disponible dans chacune de mes pages.

Donc si l'utilisateur se trouve dans l'index ( indexController ) il peut ( mais n'est pas obligé ! ) se logger et est ramener sur la même page.

Si il se trouve dans une nouvelle ( nouvelleController ), il peut aussi se logger.

Je ne veux pas avoir à écrire une action Login dans chacun de mes controlleur ce qui serait de la mauvaise programmation et très redondant.

J'ai lu sur le web qu'il serait possible d'avoir une action commune par exemple LoginAction(), grâce à un BaseController, mais que c'était pas particulièrement recommandé.

Il semble que ce soit possible de le faire avec un actionHelper ou un controllerHelper mais j'ai de la difficulté à figurer comment.

Est-ce que vous auriez une petite piste de solution à me proposer ?

Actuellement, j'ai un simple démo quickstart pour faire une preuve de concepte.

J'ai mon indexController et mon nouvelleController.

En vous remerciant !

Hors ligne

 

#2 05-12-2012 07:54:30

us2rn4m2
Membre
Date d'inscription: 07-05-2011
Messages: 104

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Bonjour,

Voici une p'tite demo (ZF-1) avec 2 facons de faire (1dossier forms + 1 helper) :    zendDemoForm.zip (n'est plus disponible)

Dezipper dans le dossier "root"

Les urls:
http://localhost/zendDemoForm/public
http://localhost/zendDemoForm/public/Index
http://localhost/zendDemoForm/public/Index/page1
http://localhost/zendDemoForm/public/Index/page2

2 bouttons de type 'submit' apparaitront

Dernière modification par us2rn4m2 (06-12-2012 09:11:35)

Hors ligne

 

#3 05-12-2012 12:50:42

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Parfait, je l'essai au plus vite et je vous revient la dessus.

Merci smile

Hors ligne

 

#4 06-12-2012 00:12:54

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Ça ne fonctionne malheureusement pas comme solution, mais c'est gentil d'avoir essayé smile

Hors ligne

 

#5 06-12-2012 09:38:49

us2rn4m2
Membre
Date d'inscription: 07-05-2011
Messages: 104

Re: Z.F 1.12 : Zend_Form dans toute mes pages

C'est à dire 'ça fonctionne pas comme solution' ? Il se passe quoi ? Tu vois quoi ? Chez moi en local ca fonctionne, (j'viens de re-tester).

En tent compte de la citation ci dessous, j'ai pour ma part trouvé ton message un peu confus. La demo tient compte uniquement de celle ci.

Renko a écrit:

Je voudrais pouvoir avoir un formulaire de login disponible dans chacune de mes pages

Souhaites tu 'etre diriger vers un formulaire de login depuis chacunes de tes pages et etre ensuite rediriger apres t'etre logger' ?

Dernière modification par us2rn4m2 (06-12-2012 10:31:08)

Hors ligne

 

#6 06-12-2012 13:02:24

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

J'ai du mal exprimer mon besoin.

Actuellement grâce à votre méthode, j'ai réussit à faire un démo de ce que je recherche.

C'est à dire d'avoir un formulaire qui permet de se logger ou de reconnaître que l'on est logger et ce partout ou je l'appel.

Sauf que mon modèle ce heurte a d'autres réalités, comme celle d'avoir d'autres formulaires présent dans la même page... À ce moment la, la validation du formulaire ne fonctionne plus convenablement parce que l'on applique la validation sans pouvoir spécifier.

Finalement, un login c'est une chose, faire la même chose avec un logout s'en est une autre.

Ce que je pense être la solution, ce serait que tout mes controlleur héritent d'action commune

LoginAction
LogoutActin
CommentaireAction
etc..

Je ne suis même pas certain que ça ferait ce que je veux et je ne suis pas certain de comment le faire.

Ce qui est dommage dans mon histoire c'est que tout ce que je veux faire : ACL, gestion des template, gestion des droits, ajout, suppression, modification etc.. Tout marche ! Mon projet reste coincé parce que je n'arrive pas à gèrer correctement mes formulaires

1 - de Login et logOut
2 - d'ajout de commentaire.

Parce qu'ils peuvent être partout dans tout mes controlleurs.

Je suis certain que la solution est simple, et pourtant j'ai par courut la documentation 1.12 de Zend des dizaines de fois.... On dirait que je suis le seul au monde a vouloir faire une telle chose avec Zend.

Hors ligne

 

#7 06-12-2012 23:39:29

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

J'ai poster le modèle de la ou je suis rendu.

http://www.filedropper.com/test-loginfo … ntaireform

Techniquement l'authentification fonctionne, mais je ne peux pas avoir plusieur formulaire avec mon formulaire d'authentification. Tout comme je ne voit pas comment faire en sorte que quand je suis authentifier, c'est une option de logout sur le même principe ( qui garde la page en cours ).

Hors ligne

 

#8 07-12-2012 13:45:01

us2rn4m2
Membre
Date d'inscription: 07-05-2011
Messages: 104

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Bon j'ai telecharger ton zip.

Ce que j'ai dis

us2rn4m2 a écrit:

Voici une p'tite demo (ZF-1) avec 2 facons de faire (1dossier forms + 1 helper)

Si je dis qu'il y a 2 facons de faire ça veut dire que tu peux selon ta convenance utiliser soi l'une, soi l'autre  mais pas l'une imbriquée dans l'autre !!!

Code:

[lang=php] class Zend_View_Helper_FormCommentaire extends Zend_View_Helper_Form 
{   

    public function formCommentaire() 
    {
          // Qu'est ce que ca vient faire ici !! C'est pas ce qu'il ya dans l'exemple    
              $form = new Application_Form_Commentaire(); 
                ....... code 

}

class Zend_View_Helper_FormLogin extends Zend_View_Helper_Form 
{   

    public function formLogin() 
    {    
            // La aussi ca n'a rien a faire là !!
        $form = new Application_Form_Login(); 
        $auth = Zend_Auth::getInstance();
        ..... code
       }

Regarde bien ce que j'ai fait dans la demo !

Dernière modification par us2rn4m2 (07-12-2012 14:02:39)

Hors ligne

 

#9 07-12-2012 14:17:42

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Il y a une réelle différence entre faire apparaître un bouton et gèrer le login / logout d'un formulaire.

Votre exemple me démontre comment je peux faire apparaître un élèment visuel partout.... C'est bien ça fonctionne ! Sauf que je ne vois pas comment je peux faire l'appel à ma validation de formulaire grâce à cet exemple....

Mon problème n'est pas de faire apparaître mon formulaire partout, sa j'arrive à le faire. Mais de gèrer de partout le traitement POST du formulaire à partir de n'importe quel controlleur....

Ce ne serait pas un Controller_Helper qui m'aiderait à faire sa ?

Hors ligne

 

#10 07-12-2012 17:35:34

us2rn4m2
Membre
Date d'inscription: 07-05-2011
Messages: 104

Re: Z.F 1.12 : Zend_Form dans toute mes pages

OK,

Avec ce que j'ai fait tu peux sur n'importe quelle page avoir:

- plusieurs formulaires
- et traiter la validation du formulaire qui a été posté sans interférer avec celle des autres

Pour cela j'ai rajouté:
- dans Bootstrap.php : modifier, et rajouter des instructions
- dans le dossier library : créer un dossier X/Controller/Plugin
- dans le dossier X/Controller/Plugin : créer un plugin FormValidation.php
- dans IndexController: rajouter une action page 1 (URL -> http://localhost/renko/public/Index/page1)

Pour le login, logout c'est toi qui vois

Voila, j'ai fait avec ce que je sais faire, y'a peut etre mieux, avec des helpers ou je ne sais trop quoi d'autre, mais en tout cas la demo elle marche !

Téléchargement: renkodemoform.zip

Est ce que ca correspond, ou du moins en partie, à ce que tu veux ?

Dernière modification par us2rn4m2 (08-12-2012 07:43:09)

Hors ligne

 

#11 07-12-2012 18:41:23

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Bonjour,
Je vais regarder sa avec grand intéressant en arrivant a la maison ce soir.

Dans tout les cas, je vous remercie INFINIMENT ! C'est vraiment sympa d'avoir de l'aide, j'ai ouvert quelque sujet ici et ailleurs et souvent des centaines de vues, sans réponse ou dès que quelque chose, avoir réponse du genre : " Débrouille toi ! "

Un gros gros merci smile

Hors ligne

 

#12 07-12-2012 23:29:04

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Wow ! Ça fonctionne très bien.

J'aurais une dernière question.

Ça veux dire que je ne passerais plus par des controlleurs ? Je ne s'aurais pas comment différencier si ce que j,envoie à un ajout, une modification , une suppression etc..

Je devrais donc coder un gigantesque switchcase pour tout les traitements possibles ?

Exemple :

Code:

        if(isset($form)) {
            if($request->isPost() && $form->isValid($request->getPost())) {                
                switch($request->getPost('submit')) { // (la clé) submit renvoie le nom du formulaire qui a ete poste
                    case 'Connect':
                        // Toute ma validation d'authentification.
                    case 'Commentaire':
                        // Toute ma validation d'ajout ou de modification ou de retrait de commentaire
                }
            }            
        }

tk, ça me démontre que c'est possible de faire ça, c'est super smile Tu fais ma journée !!!

Hors ligne

 

#13 08-12-2012 07:19:11

us2rn4m2
Membre
Date d'inscription: 07-05-2011
Messages: 104

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Au fait il existe aussi la methode setAction() http://framework.zend.com/manual/1.12/f … start.html

Non, tu n'as pas besoin de coder un gigantesque switch. Il sert juste à recuperer l'instance form en cours.
(Attention l'exemple de code que tu me présentes n'est pas bon)

Le switch (que j'ai un peu retouché)

Code:

[lang=php]
        if($request->isPost()) {
            $post = $request->getPost();
            
            switch($post['submit']) { 
                case 'Connect':
                    $form = $formLogin;
                    break;
                case 'Commentaire':
                    $form = $formCommentaire;
                    break;
                default:
                    return;
            }
        }

Un fois qu'on a l'instance on teste sa validité (c'est pas possible de le faire avant !) et ensuite on cherche a savoir a quelle classe elle appartient pour savoir quels traitements effectuer. Pour cela on utilise la fonction instanceof

Code:

[lang=php]
        if(isset($form)) {
            if($request->isPost() && $form->isValid($post)) {        
                if($form instanceof $formLogin) {
                    // Soit tu fais le traitement dans une methode. Attention ! Je ne sais si ce que je presente est une bonne façon de faire. Si il vaut mieux attendre un postDispatch ou autre chose, mais bon en tout cas ça marche
                    $this->checkLogin($post); 
                } else if($form instanceof $formCommentaire) { 
                    // Ou alors tu fais le traitement ici
                    echo "Verification, filtrage et insertion dans la base de donnees de l'utilisateur ";
                    echo $post['Utilisateur'];
                    echo ' et du commentaire ';
                    echo $post['Commentaire'];
                    echo ' en cours .....';
                }
            }            
        }     
    }

    public function checkLogin($post) {
        echo 'Verification des droits utilisateur et filtrage du login ';
        echo $post['login'];
        echo ' et du password ';
        echo $post['password'];
        echo ' en cours .....';
    }    
    
    public function checkCommentaire($post) {
        echo "Verification, filtrage et insertion dans la base de donnees de l'utilisateur ";
        echo $post['Utilisateur'];
        echo ' et du commentaire ';
        echo $post['Commentaire'];
        echo ' en cours .....';
    }

Dernière modification par us2rn4m2 (08-12-2012 09:45:18)

Hors ligne

 

#14 08-12-2012 15:17:26

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

La bonne nouvelle, c'est que c'est comme ça que j'avais commencé mon traitement tongue Je suis pas si mauvais avez Zend tongue

La seule chose c'est que dans ce genre de traitement on suppose que l'action appelé par le formulaire est vide et que c'est grâce au titre du bouton que l'on détermine l'action.

C'est fonctionnel mais je doute que ce soit la façon officielle de faire de Zend smile

Aussi, je ne vois pas comment faire des appels de comme

/commentaire/add
/commentaire/remove
/commentaire/modify

et en même temps, faire en sorte que l'utilisateur reste sur la même page.

Donc que si on est sur www.monsite.com/article-1001.php  ( grâce a une route )
et qu'un administrateur efface un commentaire donc avec une action comme /commentaire/remove/12
qu'il ne soit pas envoyé sur www.monsite.com/commentaire/remove/12 mais plutôt que le traitement soit produit et qu'il soit ramener sur la même page.

Ça reviens à un gros if else non ?

        $controller = $request->getControllerName();
        $action = $request->getActionName();

if($controller == "commentaire")}
   switch($action)){

  }
}

etc..

Déjà sa fait en sorte que je n'utiliserais plus jamais les controlleurs....  qui est la base du MVC de Zend...

Mais à la toute fin, après le predispatch, il va quand même essayer de l'amener vers www.monsite.com/commentaire/remove/12


Je ne peux pas croire que la seule façon de faire du traitement de formulaire dans tout les controlleurs soient de les retirer les controlleurs qui utilisent des formulaires sad C'est triste....

Hors ligne

 

#15 08-12-2012 19:31:59

amiss
Membre
Lieu: Cesson-Sévigné
Date d'inscription: 08-05-2011
Messages: 115

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Renko a écrit:

Je ne peux pas croire que la seule façon de faire du traitement de formulaire dans tout les controlleurs soient de les retirer les controlleurs qui utilisent des formulaires sad C'est triste....

A quel objet ZF faut-il s'adresser pour effectuer un traitement( affichage du form et déconnexion)commun à toutes les vues ?
réponse:une aide de vue. en effet elle permet de factoriser le code des traitements redondants donc inutile de déléguer l'affichage du formulaire à la vue(ou aux vues).

Une suggestion de fonctionnement de login/logout  dans l'aide de vue:
la méthode principale dans ton helper de vue doit retourner l'instance du formulaire de connexion tant qu'un user n'est pas authentifié sinon retourner l'identité du user suivi(très important) d'un lien faisant appel à l'action logout.tout ceci te prend 5 lignes au plus et sera réutilisable dans d'autres projets vue la récurrence de la problématique (form login/logout)dans tous les projets web.

N'oublies jamais la méthode setAction('/monControlleur/monAction') de zend_form quand t'as plusieurs formulaires dans la mm vue ou un formulaire dans aide de vue.

Hors ligne

 

#16 08-12-2012 22:40:17

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

@amiss : Tout ceci est fort pratique quand on ne considère pas.

A - Permettre l'appel au formulaire via n'importe quel page.
B - Ne pas effectuer de changement de page donc aucun appel de controlleur, ni d'action puisque le but est de ramener l'usager sur la page en cours, et comme on veux afficher les erreurs... On ne dois pas utiliser de redirector...

Il y a des moyens détourner comme de sauvegarder mes erreurs dans une variable session mais je considère sa vraiment stupide..

Si mon formulaire de login était toujours sur la même page et que  mon logout retournais à l'index... Je n'aurais pas eu à ouvrir un sujet ici smile

Hors ligne

 

#17 09-12-2012 17:26:40

amiss
Membre
Lieu: Cesson-Sévigné
Date d'inscription: 08-05-2011
Messages: 115

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Renko a écrit:

@amiss : Tout ceci est fort pratique quand on ne considère pas.

A - Permettre l'appel au formulaire via n'importe quel page.

A ce stade on a pas à se préoccuper qui va appelé le formulaire ce rôle est dévolu au contrôleur et la vue  n'a pas  connaissance de son contrôleur(d'après le pattern mvc) . l'aide de vue(qui encapsule le formulaire) intervient ici dans la seule logique d'affichage du formulaire et tout le traitement d'authentification(maintien de l'internaute sur la page en cours, redirection) doit être piloté en amant (plugins, controlleur, action...).



Renko a écrit:

B - Ne pas effectuer de changement de page donc aucun appel de controlleur, ni d'action puisque le but est de ramener l'usager sur la page en cours, et comme on veux afficher les erreurs... On ne dois pas utiliser de redirector...

Il y a des moyens détourner comme de sauvegarder mes erreurs dans une variable session mais je considère sa vraiment stupide..

Si mon formulaire de login était toujours sur la même page et que  mon logout retournais à l'index... Je n'aurais pas eu à ouvrir un sujet ici smile

A ce niveau c'est vrai que je n'avais pas répondu à l’entièreté de ton problème qu'à cela ne tienne maintenir l'internaute sur la page en cours revient à sauvegarder la page en cours avant que le controlleur frontal n'exécute le controleur d'action Login et c'est à ce stade qu'un plugin peut être défini pour mémoriser la page en cours de l'internaute(pour ce il y a un excellent exemple qui illustre ton cas: http://blog.developpez.com/julienpauli/ … on_vient_a ). Pour utiliser l'exemple du lien précédent afin de maintenir la page courante de l'internaute il suffit de faire appel(dans ton loginAction) à l'aide d'action personnalisée:

Code:

[lang=php]
//dans l'action login
$this->_helper->redirectorToOrigin();//un appel en cas de succès, un autre en cas d'erreur
//puis dans l'action il est important de lier l'action au form par la méthode $form->setAction('/monControlleur/monAction')

Par ailleurs il est tout à fait possible de sauvegarder les erreurs et de faire une redirection. Pour ce faire l'aide d'action FlashMessenger permet de persister des messages à condition d'en ajouter d'abord avant la redirection.Pour afficher le message d'erreur là encore une aide vue qui boucle sur tous les messages contenus dans le FlashMessenger peut être envisagé.
Un exemple basique:

Code:

[lang=php]
//application/views/helpers/FlashMessages.php
class Zend_View_Helper_FlashMessages extends Zend_View_Helper_Abstract
{
    public function flashMessages()
    {
           
        $messages = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->getMessages();
        $line = '';
        if (is_array($messages)) {
            foreach ($messages as $message) {
                                (is_array($message)? list($key,$value) = each($message) :'');
                                        $line="<p class=".  $key .">".  $value ."</p>";
            }
            
        }
               
        return $line;
    }
}

Code:

[lang=php]
//dans l'action controleur Login
if(/* identification Ok*/){
....
 $this->_helper->flashMessenger->addMessage(array('success'=>'connexion ok'));
...
}else{
 $this->_helper->flashMessenger->addMessage(array('erreur'=>'Login ou mot de passe incorrect'));
}

Pour faire afficher le message d'erreur on fait appel à l'aide de vue flashMessager dans le layout

Code:

[lang=php]
//layout.php
   <?php echo $this->flashMessages(); ?>

Hors ligne

 

#18 09-12-2012 18:02:32

Renko
Membre
Date d'inscription: 29-12-2009
Messages: 30

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Sauf que le fait d'utiliser un redirector perd toute les validations défini dans le formulaire, il n'y auras aucun message d'erreur tel que défini dans mon Zend_Form.

Flash Messenger c'est bien, si on centralise tout nos messages d'erreur à la même place.... Sauf que dans mon cas, ma page peux avoir des messages pour le login, des messages pour l'ajout de commentaire, des messages lors de l'ajout d'une note etc... etc...

FlashMessenger utilise des variables de session pour sauvegarder des messages, et j'ai écrit que je trouvais sa stupide... parce que c'est stupide...


Merci pour le redirectorToOrigine, je vais le noter mais pour tout le reste.... Avec une tel méthode, on perd tout le fonctionnement de validation des formulaires de Zend....

Hors ligne

 

#19 09-12-2012 18:31:14

us2rn4m2
Membre
Date d'inscription: 07-05-2011
Messages: 104

Re: Z.F 1.12 : Zend_Form dans toute mes pages

Heu .. s'cuser moi .. mais y'a une erreur dans le redirectorToOrigin() que presente Julien Pauli. Parce que le Zend_Registry::get('session')->requestUri  ainsi que l'instruction $this->getRequest()->getRequestUri(); c'est l'url ou l'on souhaite aller mais pas celui d'ou l'on vient !!

Celui d'ou l'on vient c'est $this->getRequest()->getServer('HTTP_REFERER');

Dernière modification par us2rn4m2 (09-12-2012 19:05:12)

Hors ligne

 

#20 03-04-2013 07:45:49

zfemogne
Nouveau membre
Date d'inscription: 03-04-2013
Messages: 3

Re: Z.F 1.12 : Zend_Form dans toute mes pages

l'aide de vue(qui encapsule le formulaire) intervient ici dans la seule logique d'affichage du formulaire et tout le traitement.



________________________________
wow gold,wow po

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