Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je souhaiterai gérer plusieurs utilisateurs sur mon site avec URL personnalisées pour chaque utilisateur :
monsite.com/mon_user1
monsite.com/mon_user2
Ceci dit j'ai déjà des contrôleurs existants (index, inscription, membre...)
J'aurai souhaité faire une route du genre :
Si le nom du contrôleur est invalide alors c'est le contrôleur user qui est utilisé.
Est-il possible de créer ce type de route ?
Je ne souhaite pas avoir une URL de type monsite.com/user/mon_user1 mais bien monsite.com/mon_user1
Dans le bootstrap j'arrive à lister tous les contrôleurs mais je n'arrive pas à lister le contrôleur courant.
Merci d'avance.
Hors ligne
Essaie avec un truc du genre:
$route = new Zend_Controller_Router_Route( ':username', array( 'controller' => 'profile', 'action' => 'userinfo' ) );
PS: le routeur fonctionne avec LIFO, alors cette route doit être entrée dans les premières.
ref: http://framework.zend.com/manual/fr/zen … s.standard
Hors ligne
Le problème avec cette route c'est que cela me casse toutes mes autres routes même celles standard... :(
Une URL de type : monsite.com/inscription
me dirige vers le contrôleur profile :( au lieu de me diriger vers le contrôleur inscription...
Hors ligne
Tu dois alors inverser l'ordre dans lequel tes routes sont insérées.
Hors ligne
Mais c'est ma seule route dans mon bootstrap, je n'ai pas d'ordre à gérer...
Si j'ajoute cette route cela m'écrase les routes par défaut de Zend.
Dans mon bootstrap j'ai exactement :
protected function _initRouter() { $front = Zend_Controller_Front::getInstance(); $router = $front->getRouter(); $router->addRoute('user', new Zend_Controller_Router_Route(':username', array('controller' => 'user'))); }
Hors ligne
ahhh je vois
J'aurai souhaité faire une route du genre :
Si le nom du contrôleur est invalide alors c'est le contrôleur user qui est utilisé
Tu devrais pouvoirça en héritant du Dispatcher et en le modifiant
bonne chance
Hors ligne
N'étant pas super pro je n'ai aucune idée de comment faire cela
Ça me parait bizarre qu'une condition aussi simple soit si difficile à mettre en place
SI contrôleur est invalide ALORS contrôleur = user
Je commence à penser que ce n'est pas possible de faire un truc pareil avec Zend...
Dernière modification par TomaCraCra (03-03-2010 14:37:38)
Hors ligne
S'il te manque des base en orienté objet tu devrais commencer par là
Il faut que tu redéfinisses la méthode dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response) du Zend_Controller_Dispatcher_Standard de sorte que SI le contrôleur est invalide tu le changes pour user...
ALTERNATIVE CHIANTE
tu peux ajouter des routes statiques (inscription...) après ta route user
Bonne chance
Hors ligne
Je ne vois pas où la redéfinir la méthode dispatch...
Hors ligne
Tu dois te créer une class exemple: My_Controller_Dispatcher_Standard, dans cette classe tu redéfinis la méthode disptach
N'oublie pas de changer le dispatcher dans le Zend_Controller_Front
Hors ligne
Dernière petite chose, à quel endroit dois-je créer une instance de cette classe ?
Hors ligne
dans le bootstrap de ton application
Hors ligne
Ça y est, j'ai enfin réussi...
merci pour ton aide ca m'a quand même éclairé
j'ai exactement fais ce que tu as dis :
1/Dans mon bootstrap j'ai mis j'ai fais un setDispatcher pour mettre le mien :
protected function _initFront() { $controller = new Controller(); $front = Zend_Controller_Front::getInstance(); $front->setDispatcher($controller); }
($controller est ma classe perso, j'ai sans doute abusé du nom...)
2/Puis j'ai redéfini la méthode dispatch dans ma classe perso :
public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response) { $controllerName = $request->getControllerName(); $allControllerNames = $this->getAllControllersNames(); if(!in_array($controllerName, $allControllerNames)) { $request->setControllerName("user"); } parent::dispatch($request, $response); }
Et hop tout fonctionne comme je le voulais...
Hors ligne
parfait, tu peux mettre résolu dans le titre
Hors ligne