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 :

layout avec plusieurs zones et plusieurs formulaires [ZF 1.10]


Sujet :

MVC PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 29
    Par défaut layout avec plusieurs zones et plusieurs formulaires
    Bonjour,

    Ayant déja lu et relu la documentation, cherché et recherché je n'arrive pas à comprendre le comportement du framework.

    Donc j'ai un layout qui s'affiche correctement et je veux faire des opération distinctes sur un formulaire d'authentification dans une zone et un formulaire d'inscription dans ma zone principale de contenu.

    Voici mon layout :

    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
     
    <?php echo $this->doctype(); ?>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <?php echo $this->headTitle(); ?>
    	<meta name="description" content="description content" />
    	<meta name="keywords" content="keywords" />
    	<meta name="author" content="author" />
    	<meta charset="UTF-8" />
    	<!--[if IE]>
    	<script src="/scripts/html5-ie.js"></script>
    	<link href="/css/themes/colorpaper/ie.css" media="screen" rel="stylesheet" type="text/css" />
    	<![endif]--> 
    	 <?php echo $this->headLink()->appendStylesheet('/css/themes/colorpaper/style.css')
    								 ->appendStylesheet('/css/themes/colorpaper/reset-min.css');?>
     
    </head>
    <body>
    <div id="bgRepeatBottom">
    			<div id="bgTop">
    				<div id="bgBottom">
    					<div id="content">
    					<header>
    						<nav>
    							<a href="<?php echo $this->url(array('controller'=>'index'),'default',true) ?>" title="Accueil" >Accueil</a>
    							<a href="<?php echo $this->url(array('controller'=>'concept'),'default',true) ?>" title="Concept du site" >Concept du site</a>
    							<a href="<?php echo $this->url(array('controller'=>'rss'),'default',true) ?>" title="RSS" >RSS</a>
    							<a href="<?php echo $this->url(array('controller'=>'contact'),'default',true) ?>" title="Contact">Contact</a>
    						</nav>
    					</header>	
    						<div id="brdTopContent"></div>
    						<div id="page">
    							<div id="leftContent">
    								<section id="searchengine">
    									 <h1><?php echo $this->escape($this->title); ?></h1>
    									<?php echo $this->layout()->content;?>
    								</section>	
    								<div id="backgroundBottomLeftContent"></div>
    								<section id="news">
     
    								</section>
    							</div>
    							<div id="rightContent">
    								<section id="log">
    									<h1> Authentification </h1>
    									<?php echo $this->action('log','login'); ?>	
    								</section>	
    								<section id="statistics">
     
    								</section>
    								<section id="ranking">		
     
    								</section>
    							</div>
    							<div class="spacer"></div>
    						</div>
    						<footer>
    							<nav>
     
    							</nav>
    						</footer>
    					</div>
    				</div>
    			</div>
    		</div>
    </body>
    </html>
    Voici mon controller Login

    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
     
    <?php
     
    class LoginController extends Zend_Controller_Action
    {
     
        public function init()
        {
     
        }
     
        public function indexAction()
        {
     
        }
     
    	public function logAction()
        {
    		$formLogin = new Form_Login();
    		$this->view->loginForm = $formLogin;
    		$this->render('log');
    		if($this->getRequest()->isPost()){
    			$formDataLogin = $this->getRequest()->getPost();
    				if ($formLogin->isValid($formDataLogin)) {
    					Zend_Debug::dump('ici');
    				}else{
    					$formLogin->populate($formDataLogin);
    				}
    		}
     
     
        }
     
     
     
     
    }
    voici la vue login.phtml


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?php echo $this->loginForm; ?>
    voici le form login.php associé
    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
     
    <?php
    	class Form_Login extends Zend_Form
    	{
    		public function __construct($options = null)
    		{
    			parent::__construct($options);
     
    			$this->setName('login');
    			$this->setAction('/login/log');
     
    			$email = new Zend_Form_Element_Text("emailLog",array('size' => 25));		
    			$email ->setLabel('E-mail *')
    				   ->setRequired(true)
    				   ->addFilter('StringTrim')
    				   ->addFilter('StripTags')
    				   ->addValidator('NotEmpty', true , array('messages' => array('isEmpty' => 'Vide')))
    				   ->addValidator('EmailAddress');
     
     
    			$email->addDecorator(new My_Form_Decorator_Html(array('html' => "<div class='spacer'></div>",'placement' => 'append')));
     
    			$password = new Zend_Form_Element_Password("passwordLog", array('size' => 25));
    			$password ->setLabel('Mot de passe *')
    					  ->setRequired(true)
    					  ->addFilter('StringTrim')
    					  ->addValidator('NotEmpty', true , array('messages' => array('isEmpty' => 'Vide')));
    			$password->addDecorator(new My_Form_Decorator_Html(array('html' => "<div class='spacer'></div>",'placement' => 'append')));	
     
     
    			$valider = new Zend_Form_Element_Submit('valider');
    			$valider->addDecorator(new My_Form_Decorator_Html(array('html' => "<a title='Inscription' href='/users/ajouter' id='inscription-link'>Inscription</a>",'placement' => 'append')));	
    			$valider->setAttrib('id', 'boutonValider')
    					->removeDecorator('DtDdWrapper');	
     
    			$this->addElements(array($email,$password,$valider));
     
     
     
     
    		}
     
    	}
    Donc mon formulaire d'authentification s'affiche correctement en haut à droite dans mon layout dans la <section id="log"> .

    Par contre quand je valide ce formulaire d'authentification :
    -Le formulaire vide s'affiche dans la section <section id="searchengine"> à la place du $this->layout()->content; au lieu de rester dans la section dans laquelle j'ai mon formulaire <section id="log"> ?
    -Les messages liés aux validateurs ->addValidator('NotEmpty', true , array('messages' => array('isEmpty' => 'Vide'))) ne s'affiche pas même dans cette mauvaise section ?

    Voilà je ne comprends pas pourquoi le framework agit comme ça ?
    Il doit y avoir quelque chose qui m'échappe ...

    En vous remerçiant.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 178
    Par défaut
    Hello,

    Voici quelques éléments de réponse sur ce que je comprend de ton cas.

    L'exécution du helper de vue action dans ton layout se passe bien.
    As-tu compris que dans le cas de l'utilisation de ce helper il te renvoie uniquement le rendu de vue d'action sans passer par le layout ?

    Ensuite, l'action de ton form pointe vers '/login/log'.
    Première remarque : au lieu d'écrire ce type chemin en dur, pense à toujours utiliser un helper d'url, ça t'évitera des ennuis plus tard lors d'un passage en prod ou d'un changement de routage, etc...
    2ème remarque : cette action de form va se dispatcher directement vers ton action de login, en faisant de celle-ci ton contenu principal, d'ailleurs l'url dans ton navigateur reflète ce changement, tu pointes vers login/log le contenu est donc celui de cette action.

    Donc, dans ton cas ce que tu veux faire c'est poster ce formulaire vers la même url que celle dans laquelle il apparait.
    C'est classique pour ce genre de formulaire qui est un bon candidat pour être présent sur toutes les pages de ton site.
    Pour faire ça tu peux laisser l'action de form vide.
    Va se présenter un autre problème : si dans ta page tu as au moins un autre form, il faut pouvoir distinguer les envois de form d'un autre.
    Le fait d'avoir une requête POST ne suffit plus, il te faudra détecter la présence d'un champ spécifique à chaque form avant d'en déclencher le traitement.

    Dans ta logAction, le fait de faire un isValid fait déjà un populate don pas besoin de le refaire plus bas.

    Enfin, tu fais ton render trop tôt, d'ailleurs à moins d'avoir désactivé le viewRenderer ou de vouloir rendre une vue spécifique tu ne devrais pas avoir à faire un render manuel.
    Dans tous les cas, si tu veux enclencher manuellement le rendu, fais-le en toute fin d'action.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 29
    Par défaut
    Tout d'abord merci pour ta réponse patbator, elle m'a permis de me poser les bonnes questions et ainsi résoudre mon problème.

    Pour la première remarque je n'allais pas le laissé comme ça, souvent quand tu retourne un problème dans tous les sens tu essayes de simplifier au maximum ce que tu code et cette url en dur en faisait partie.

    Pour la deuxième remarque ben j'ai effectivement distingué mon formulaire d'authentification via un input type hidden qui me permet de le différencier d'un autre formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $idForm = new Zend_Form_Element_Hidden('form');
    $idForm->removeDecorator('HtmlTag')
    	  ->removeDecorator('label')
    	 ->setAttrib('id', 'formLog')
    	 ->setValue('formLog');
    Effectivement j'ai bel et bien vu que l'action isValid issu de la classe Zend_Form effectué bel le réremplissage du form en cas de mauvaise saisie.

    Comme j'ai avancé je suis passé a l'authentification complète, mon controller est encore à retravailler mais ça donne ça pour l'instant

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    <?php
     
    class LoginController extends Zend_Controller_Action
    {
     
        public function init()
        {
     
        }
     
        public function indexAction()
        {
           if(Zend_Auth::getInstance()->getIdentity()){
    			$logged = $this->loggedInAs();
    			$this->view->login = $logged;
    		}else{
    			$this->log();
    		}
        }
     
    	public function log()
        {
    		$formLogin = new Form_Login();
    		$this->view->login = $formLogin;
    		if($this->getRequest()->isPost()){
    			$formDataLogin = $this->getRequest()->getPost();
    			if(isset($formDataLogin['form']) && $formDataLogin['form']==='formLog'){
    					if ($formLogin->isValid($formDataLogin)){
    						if($this->_process($formLogin->getValues())){
    							$users = new Model_DbTable_Users();
    							if($users->obtenirStatutUser($formDataLogin['emailLog'])==1){
    								$logged = $this->loggedInAs();
    								$this->view->login = $logged;
    							}else{
    								//a améliorer (l'afficher déja caché dans le frm) 
    								$passwordElement = $formLogin->getElement('passwordLog');
    								$passwordElement->addDecorator(new My_Form_Decorator_Html(array('html' => "<div class='spacer'></div><div class='errorLog'>Votre compte est inactif (lien vue explication)</div>",'placement' => 'append')));	
    							}
    						}else{
    							//a améliorer (l'afficher déja caché dans le frm) 
    							$passwordElement = $formLogin->getElement('passwordLog');
    							$passwordElement->addDecorator(new My_Form_Decorator_Html(array('html' => "<div class='spacer'></div><div class='errorLog'>Email ou mot de passe incorrecte</div>",'placement' => 'append')));	
    						}	
    					}
    			}		
    		}
        }
     
    	protected function _process($values)
        {
            $adapter = $this->_getAuthAdapter();
    		$adapter->setIdentity($values['emailLog']); 
            $adapter->setCredential($values['passwordLog']);
            $auth = Zend_Auth::getInstance();
            $result = $auth->authenticate($adapter);
            if ($result->isValid()){
                $user = $adapter->getResultRowObject();
                $auth->getStorage()->write($user);
                return true;
            }
            return false;
        }
     
    	protected function _getAuthAdapter() {
            $dbAdapter = Zend_Db_Table::getDefaultAdapter();
            $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
            $authAdapter->setTableName('utilisateur')
                ->setIdentityColumn('EMAIL_UTILISATEUR')
                ->setCredentialColumn('MDP_UTILISATEUR')
                ->setCredentialTreatment('SHA1(MD5(CONCAT(?)))');
            return $authAdapter;
        }
     
    	protected function loggedInAs()
        {
            $auth = Zend_Auth::getInstance();
            if ($auth->hasIdentity()) {
                $pseudo =  $auth->getIdentity()->PSEUDO_UTILISATEUR;
                $logoutUrl = $this->view->url(array('controller'=>'login','action'=>'logout'), null, true);
                return 'Bienvenue <span class="loggedPseudo">' . $pseudo .  '</span><br /><a href="'.$logoutUrl.'" class="classicButton" title="Déconnexion" >Déconnexion</a>';
            }
        }
     
    	public function logoutAction()
        {
            Zend_Auth::getInstance()->clearIdentity();
    		$this->_redirect('/');
        }
     
     
    }
    En tout cas encore merci tu me permet d'avancer encore sur mon projet

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 178
    Par défaut
    Hello,

    Ça fait plaisir de pouvoir aider

    Cependant je ne peux pas m'empêcher de te faire des remarques sur l'organisation de ton contrôleur.

    Pour moi un Zend_Controller_Action n'est instancié que par le Zend_Controller_Front, du coup les méthodes que tu écris dedans sont soit des méthodes de l'API Zend comme init(), pre/postDispatch() … soit des actions de la forme xxxAction() et le reste doit commencer par être private.

    Par exemple, le fait que tu ais créé une «public function log()» sous-entend que dans un code en dehors de ta classe, tu aurais à instancier ton Zend_Controller_Action et dessus tu appellerais à la main $object->log();.

    En fait, cela n'arrivera jamais donc, passe-la en private function __log().

    Même tarif pour ta «protected function loggedInAs()» passe-la en private function __loggedInAs().

    Dans ta «protected function loggedInAs()» tu retournes du html mais je vois pas ce que ça à a faire dans le controller, j'aurais plutôt mis,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private function __loggedInAs()
        {
            $auth = Zend_Auth::getInstance();
            if ($auth->hasIdentity()) {
                $this->view->pseudo =  $auth->getIdentity()->PSEUDO_UTILISATEUR;
                $this->view->logoutUrl = $this->view->url(array('controller'=>'login','action'=>'logout'), null, true);
            }
        }
    Ensuite c'est dans ta vue que tu organises le html qui va bien.

    Du coup ton indexAction ressemblerait à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public function indexAction()
    {
        if (Zend_Auth::getInstance()->getIdentity()) {
            $this->__loggedInAs();
     
        } else {
            $this->__log();
     
        }
    }
    Il y aurait encore des choses à dire sur l'utilisation de l'auth mais j'en garde pour plus tard

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/03/2008, 12h42
  2. Selection de plusieurs colonnes avec une zone de liste
    Par vinzeffect dans le forum Access
    Réponses: 3
    Dernier message: 20/01/2007, 22h51
  3. Concaténer plusieurs zones d'un formulaire en cours de saisie
    Par harry25 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/01/2007, 18h48
  4. Réponses: 1
    Dernier message: 28/12/2006, 14h03
  5. boite de dialogue avec plusieurs zones de text
    Par hammag dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 11/05/2006, 15h04

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