2010-01-12 4 views
3

J'ai déjà vu cette question - mais aucune des réponses ne s'est vraiment avérée satisfaisante pour moi, donc je vous demande à nouveau: je veux intégrer un formulaire de connexion persistant (qui se transformera en barre de navigation) si connecté) dans la barre d'en-tête d'un site. En effet, je veux être capable d'injecter une certaine logique de contrôleur dans la mise en page. Après de nombreuses recherches, je peux voir plusieurs façons d'atteindre cet objectif - aucune d'entre elles ne semble parfaitement adaptée.Intégration du formulaire de connexion persistante Zend

Affichage Les aides semblent appropriées pour ajouter une suite de méthodes à l'objet Zend_View - mais je ne veux pas écrire de code conditionnel dans le layout.phtml pour déclencher une méthode. Les aides d'action m'aideraient à retirer cette fonctionnalité et à l'appeler d'un contrôleur - mais cela semble être en mauvaise faveur depuis plusieurs trimestres. Ensuite, il y a des plugins, qui pourraient bien convenir dans la boucle dispatch/authentication. Donc, j'espérais que quelqu'un pourrait être en mesure de m'offrir quelques conseils sur la meilleure façon de répondre à mes besoins. Toute aide est grandement appréciée.

Répondre

1

Pour ceux d'entre vous avec un problème similair, voilà comment je fini par résoudre (j'utilise la mise en page BTW)

Je me suis inscrit une aide de vue dans le Bootstrap:

protected function _initHelpers(){ 
    //has to come after view resource has been created 
    $view = $this->getResource('view'); 
    // prefix refers to the folder name and the prefix for the class 
    $view->addHelperPath(APPLICATION_PATH.'/views/helpers/PREFIX','PREFIX'); 
    return $view; 
} 

Voici le code d'aide à la vue - la logique d'authentification réelle est cachée dans le code du modèle. Il est un peu maladroit, mais il fonctionne

class SB_UserLoginPanel extends Zend_View_Helper_Abstract { 

public function __construct() { 
    $this->user = new SB_Entity_Users(); 
$this->userAccount = new SB_Model_UserAccount(); 
    $this->request = Zend_Controller_Front::getInstance()->getRequest(); 
    $this->form = $this->makeLoginForm(); 
    $this->message=''; 
} 

//check login 
public function userLoginPanel() { 
    if(isset($_POST['loginpanel']['login'])) { 
     $this->processLogin(); 
    } 
    if(isset($_POST['loginpanel']['logout'])) { 
     $this->processLogout(); 
    } 
    $auth = Zend_Auth::getInstance(); 
    if ($auth->hasIdentity()) { 
     $this->loginPanel = $this->getUserNav(); 
    } else { 
     $this->loginPanel = $this->getLoginForm(); 
     $this->loginPanel .= $this->getMessages(); 
    } 
    return $this->loginPanel; 
} 

private function processLogin() { 
    if($this->form->isValid($_POST)){ 
     $logindata = $this->request->getPost('loginpanel'); 
     if($this->user->login($logindata['email'],$logindata['password'])) { 
      Zend_Session::rememberMe(); 
      $redirect = new Zend_Controller_Action_Helper_Redirector(); 
      $redirect->goToUrl('/account/'); 
      return $this->getUserNav(); 
     }else { 
      $this->message = '<p id="account_error">Account not authorised</p>'; 
     } 
    }else { 
     $this->form->getMessages(); 
    } 
} 


private function processLogout() { 
    if(isset($_POST['loginpanel']['logout'])) { 
     $this->user->logout(); 
     $request_data = Zend_Controller_Front::getInstance()->getRequest()->getParams(); 
     if($request_data['controller']=='notallowed') { 
      $redirect = new Zend_Controller_Action_Helper_Redirector(); 
      $redirect->goToUrl('/'); 
     } 
    } 
} 

private function makeLoginForm() { 
} 

private function getLoginForm(){ 
    return $this->form; 
} 

private function getMessages(){ 
    return $this->message; 
} 

private function getUserNav(){   
//return partial/render 
} 

}

J'appelle alors cela de la partie pertinente du balisage dans le fichier layout.phtml.

<?php echo $this->doctype(); ?> 
<head> 
<?php 
echo $this->headLink() ."\n"; 
echo $this->headScript() ."\n"; 
echo $this->headMeta() ."\n"; 
?> 
<title><?php echo $this->escape($this->title) ."\n"; ?></title> 
</head> 
<div id="masthead"> 
    <div id="userLoginPanel"> 
     <?php echo $this->userLoginPanel(); ?> 
    </div> 
</div> 
<!--rest of layout--> 

En principe, cette devrait être une aide d'action, mais après avoir lu certains articles moins favorables en ce qui concerne Helper action Zend - J'ai opté pour cette méthode qui a fait l'affaire.

Espérons que ça aide!

Questions connexes