2009-11-19 2 views
0

Je suis à mi-chemin d'un CMS où l'URL est un nom convivial SEO basé sur un titre de page. Il y a un besoin pour une section d'utiliser un contrôleur spécifique. Ainsi, par exemple:Comment changer dynamiquement un contrôleur dans Zend Framework?

test.com/page1 (utilise le contrôleur d'index) test.com/page2 (utilise un contrôleur d'index) test.com/page3 (utilise un contrôleur différent) test.com/page4 (utilise le contrôleur d'index

Je pourrais ajouter une route qui dit que "page3" utilisera le contrôleur "différent", mais les utilisateurs du CMS doivent être capables de changer le nom et le référencement de l'URL, donc où il est actuellement "page3 "Il pourrait être changé plus tard, ce qui briserait ma règle de routage. Quelle est la meilleure façon (soit de brancher le contrôleur frontal ou autre) pour saisir la demande et tirer le contrôleur à utiliser à partir de la DB (sql serait comme "SELECT contrôleur FROM menu WHERE seo = 'page3'"), puis régler cela comme le contrôleur avant Zend définit le contrôleur à utiliser?

Toute aide ou compréhension est grandement appréciée.

Répondre

1

Vous devrez créer un plugin de contrôleur et définir le module/contrôleur/action sur l'objet de requête.

Ensuite, dans le preDispatch(), vous pouvez faire quelque chose comme ceci:

public function preDispatch(Zend_Controller_Request_Abstract $request) 
{ 
    $request->setModuleName($this->_getModule()); 
    $request->setControllerName($this->_getController()); 
    $request->setActionName($this->_getAction()); 
} 

Et vous pouvez créer des méthodes __getModule(), _getController(), _getAction() qui examinera le $ _SERVER [ 'REQUEST_URI '] et votre DB et définissez le module/contrôleur/action approprié.

+0

Merci pour la réponse. Les fonctions que vous mentionnez doivent-elles toutes faire partie du plugin frontController? Disons que je crée le plugin appelé updateControllerSeo, les fonctions preDispatch et _getController font partie de ce plugin de classe? Merci encore. – Ben

+0

Oui. Ils devraient être dans le plugin. Mais je suggère de les mettre dans routeShutdown(), comme dans ce cas, ils seraient appelés avant chaque action (si vous utilisez une vue d'action hleper, ou alors ...) –

+0

Créez toutes ces méthodes dans le plugin. Si elles ne sont pas dans votre classe de plugin, vous ne pouvez pas les appeler en utilisant ($ this). Et le preDispatch() ou le routeShutdown() sont nécessaires car ce sont les "hooks" qui sont invoqués pendant le cycle d'envoi –

Questions connexes