2009-10-19 4 views
0

Je ne sais pas si je le fais de la bonne façon. Mon objectif est d'afficher dans ma mise en page une connexion ou une navigation dans la section d'en-tête.Zend_Layout display Connexion ou navigation

Ma mise en œuvre se présente comme suit (sans logique):

2 scripts de mise en page:

  • login.phtml
  • navigation.phtml

Un FrontController Plugin:

class Plugin_Header extends Zend_Controller_Plugin_Abstract { 

     /** 
     * PreDispatch 
     * 
     * Decides wich kind of navigation is displayed in header section 
     * for logged in users the menu, for guests the login box and 
     * link to registration form. 
     * 
     * @return void 
     */ 
     public function preDispatch(Zend_Controller_Request_Abstract $request) 
     { 
      $layout = Zend_Layout::getMvcInstance(); 
      $layout->topNavigation = $layout->render('login'); // or navigation 
     } 
} 

Cela fonctionne bien, mais est-ce le meilleur moyen? ;)

Répondre

1

Je suggère de mettre la fonctionnalité en vue auxiliaire ou partielle. Vous mise en page de flexion de la façon dont il était pas censé être plier, je suppose :)

je ferais ceci:

  • ont deux partials - navigation & connexion
  • faire une My_View_Helper_RenderHeader aide de vue() retieving un paramètre - booléen $ isLoggedIn
  • basé sur la valeur booléenne rend la navigation pour $ isLoggedIn = true et une connexion partielle sinon.
  • vous pouvez également ajouter une sorte de configuration (disons pour différents noms de partials ou un chemin différent) pour rendre ce composant plus reuseable

Autre chose positive est que si vous mettez en œuvre la méthode « toString » vous peut stocker le booléen à l'intérieur de l'assistant - le configurer pour une raison quelconque pour ex. dans la vue index.phtml, puis rendez-le à l'endroit approprié dans la mise en page en utilisant echo $this->renderHeader(). Génial, n'est-ce pas? Si vous n'êtes pas sûr, consultez le code d'aide head * (script, link, ...).

+0

bonne idée, merci. – opHASnoNAME

+0

Comment passez-vous le $ isLoggedIn à l'aide de vue? Iam maintenant le faire avec un plugin à preDispatch ($ layout-> auth = $ auth)? – opHASnoNAME

+0

$ this-> renderHeader (Zend_Auth :: getInstance() -> hasIdentity()) –

0

J'utilise différentes dispositions:

anonymous.phtml 
authenticated.phtml 

Et ceci dans une méthode avant plug-in preDispatch() du contrôleur:

$auth = Zend_Auth::getInstance(); 
if ($auth->hasIdentity()) { 
    $layout = 'authenticated'; 
} else { 
    $layout = 'anonymous'; 
} 


// Bootstrap layouts 
Zend_Layout::startMvc(array(
'layoutPath' => APPLICATION_PATH . '/layouts/scripts', 
'layout' => $layout 
)); 

De plus, je trouve utile aussi de vérifier les requêtes Ajax ici ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'), et ont une troisième disposition "ajax" (vide).