2010-02-21 2 views
0

Je n'arrive pas à comprendre comment créer un formulaire de connexion et de connexion (Zend_Form) flexible et divers liens spécifiques au module/contrôleur.Afficher le formulaire de connexion sur chaque page en utilisant Zend Form

La solution la plus courante semble utiliser:

echo $this->action('login', 'authentication', 'default');

Mais Apperently ce n'est pas la 'meilleure'? J'ai lu que cela déclenche un dispatchloop et donc prendre un coup de performance?

J'ai pensé à chanter une Ma_View_Helper pour la barre latérale:

class Zend_View_Helper_Sidebar extends Zend_View_Helper_Abstract 
{ 
    public function sidebar() 
    { 
     $sidebar = $this->view->placeholder('sidebar'); 
     $sidebar->setPrefix('<div class="sidebar-element">') 
       ->setSeparator('</div><div class="sidebar-element">') 
       ->setPostfix('</div>'); 

     $sidebar->append(new Form_Login); 
     $sidebar->append(new Model_Category->getList()); 
     return $sidebar 
    } 
} 

Dans mon Form_Login j'ai l'action définie sur/auth/connexion qui contient le code suivant:

public function loginAction() 
{ 
    $request = $this->getRequest(); 

    if($request->isPost()) { 
     $form = new Form_Login(); 
     $data = $request->getPost(); 
     if($form->isValid($data)) { 
      $username = $form->getValue('username'); 
      $password = $form->getValue('password'); 
      $users = new Model_DbTable_Users(); 
      $authenticated = $users->login($username, $password); 
      if($authenticated) {      
        //Succes - show identity instead of loginForm     
      } else {          
       $this->view->loginForm = $form; 
       $this->render('/index'); 
      } 
     } 
    } 
} 

Si je fournir le mauvais nom d'utilisateur/mot de passe il rend indexAction qui est actuellement vide. C'est bon. Il rend également ma barre latérale contenant le formulaire de connexion au besoin, mais le formulaire est vide (l'entrée de l'utilisateur n'est pas affichée, ni aucun message que le formulaire n'a pas réussi à valider).

Le champ de nom d'utilisateur dans le formulaire doit afficher l'entrée fournie par l'utilisateur avant la soumission. Et un message d'erreur devrait être affiché.

Toute aide pour expliquer pourquoi cela ne se produit pas, est très appréciée.

Répondre

3

Vous effectuez la validation de votre formulaire dans un loginAction et vous avez indiqué que vous êtes en train de poster sur l'action d'index, est-ce une faute de frappe? En outre, vous créez deux copies de Form_Login. Une fois, dans l'action et une fois dans l'aide. Si vous validez une instance dans l'action, vous devez afficher cette même instance du formulaire dans l'assistant d'affichage. Vous pouvez soit déplacer toute la logique de validation dans l'assistant d'affichage, soit partager l'instance entre l'assistant d'affichage et l'action. Je vais suggérer le dernier.

Vérifiez dans votre assistant d'affichage si un formulaire existe déjà dans le registre. Si c'est le cas, utilisez simplement cette instance. Sinon, vous pouvez créer une nouvelle instance. Voici un exemple de ce que je rugueux veux dire:

class Zend_View_Helper_Sidebar extends Zend_View_Helper_Abstract 
{ 
    public function sidebar() 
    { 
     $sidebar = $this->view->placeholder('sidebar'); 
     $sidebar->setPrefix('<div class="sidebar-element">') 
       ->setSeparator('</div><div class="sidebar-element">') 
       ->setPostfix('</div>'); 

     if(Zend_Registry::isReigistered('loginForm')) { 
      $loginForm = Zend_Registry::get('loginForm'); 
     } else { 
      $loginForm = new Form_Login(); 
     } 

     $sidebar->append($loginForm); 
     $sidebar->append(new Model_Category->getList()); 
     return $sidebar 
    } 
} 

public function loginAction() 
{ 
    $form = new Form_Login(); 
    Zend_Registry::set('loginForm', $form); 

    $request = $this->getRequest(); 

    if($request->isPost()) {   
     $data = $request->getPost(); 
     if($form->isValid($data)) { 
      $username = $form->getValue('username'); 
      $password = $form->getValue('password'); 
      $users = new Model_DbTable_Users(); 
      $authenticated = $users->login($username, $password); 
      if($authenticated) {      
        //Succes - show identity instead of loginForm     
      } else {          
       $this->view->loginForm = $form; 
       $this->render('/index'); 
      } 
     } 
    } 
} 

Edit:

Non, il n'y a pas d'auto vérifier si une instance d'une forme existe déjà. Vous devez le faire vous-même.

Je suis assez sûr que la manière suggérée est d'utiliser un assistant de vue. Comme vous l'avez dit dans votre question, l'utilisation de l'assistant d'affichage de l'action provoque une autre boucle de répartition qui est mauvaise pour les performances. Je ne sais pas quel est le verdict sur le fait de savoir si toute la logique devrait être maintenue dans l'assistant de vue ou non.

Questions connexes