2009-06-26 5 views
2

J'ai un bouton de connexion dans l'en-tête du site. Le html de cet en-tête est programmé dans les vues/layouts/home.phtml du framework Zend.Zend framework code commun pour tous les contrôleurs

J'ai une forme cachée dans cette mise en page qui est déclenchée par l'intégration de l'affichage de contenu en ligne jQuery thickbox. Raison, je ne veux pas faire un appel ajax juste pour aller chercher un petit formulaire de connexion.

Je crée le formulaire en utilisant Zend_Form et le problème est que je dois le faire dans tous les contrôleurs après avoir vérifié si l'utilisateur est connecté ou non. Je veux placer cette génération de forme dans un seul endroit, disons dans le bootstrap et ai alors une logique dans le bootstrap pour dire que si l'utilisateur est connecté ne générez pas le formulaire.

Je ne sais pas si bootstrap est le bon endroit pour le faire ou devrais-je le faire dans un autre endroit.

Alors, où dois-je instancier le formulaire afin que son disponible partout si l'utilisateur n'est pas connecté.

Répondre

1

Je l'ai fait d'une manière différente, en étendant Zend_Controller_Plugin_Abstract pour implémenter un plugin et l'enregistrer avec le contrôleur frontal.

public function routeStartup(Zend_Controller_Request_Abstract $request) { } 

a généré le formulaire à l'intérieur de la méthode mentionnée ci-dessus et en définissant le formulaire dans l'objet $ view.

vue $ peut être ren- voyées en utilisant:

$view = Zend_Layout :: getMvcInstance()->getView(); 
2

Créez votre propre contrôleur de base qui étend Zend_Controller_Action ont alors vos contrôleurs étendre hors de votre contrôleur de base. Je ne sais pas ce que "jQuery thickbox inline content l'intégration de l'affichage" est ... mais vous avez plusieurs sections que vous pouvez mettre en fonction de quand vous avez besoin de votre code pour fonctionner. init(), preDispatch(), postDispatch() etc ... Assurez-vous quand vous étendez votre contrôleur de base que vous ne sthing comme:

parent :: init() parent :: preDispatch() parent :: postDispatch() etc ... dans chaque section afin que le code de base fonctionne aussi ...

2

Soyez attentif à la solution de Pradeep Sharma (la réponse qu'il écrit lui-même et accepté ci-dessous).

Tout le code ci-dessous pour ZF 1,12, et non ZF 2.0

Dans le bootstrap, l'instance MVC de Zend_Layout peut-être pas encore été créé. Vous devez utiliser Zend_Layout::startMvc() à la place:

$view = Zend_Layout::startMvc()->getView() ; 

Et TBH je préfère l'exécution de ce code dans la fonction preDispatch(). Les nouveaux utilisateurs de ZF pourraient être intéressés par ceci:

application/plugins/HeaderForm.php:

class Application_Plugin_HeaderForm extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    {  
     $view = Zend_Layout::startMvc()->getView() ; 
     $view->headerForm = new Application_Form_HeaderForm() ; 
    } 
} 

Appel nouvelle Application_Form_HeaderForm() charge automatiquement par défaut dans dossier application/formulaires/. Vous pouvez également créer le formulaire directement dans le plugin avec new Zend_Form(), et addElement() etc. mais il ne sera pas réutilisable.

Bien sûr, vous devez enregistrer ce plugin dans votre bootstrap!

demande

/Bootstrap.php:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initPlugin() 
    { 
     $front = Zend_Controller_Front::getInstance() ; 
     $front->registerPlugin(new Application_Plugin_HeaderForm()) ; 
    } 
} 

Appel nouvelle Application_Plugin_HeaderForm() charge automatiquement par défaut dans application/plugins/ dossier