Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je cherche une solution à mon problème, mais les exemples trouvés (et essayés) ne fonctionnent pas.
J'ai une structure de module à l'intérieur de chacun j'ai plusieurs contrôleurs
admin
controllers
models
views
profile
controllers
models
views
search
controllers
models
views
site
controllers
models
views
Rien d'extraordinaire. Mais voilà, les liens générés sont souvent longs et pas très bons pour les engins de recherche (plus il y a de sous-dossiers, plus Google considère le contenu de moindre importance). J'aimerais racourcir certains de mes liens et le Zend_Controller_Router_Rewrite semble tout désigner.
Par exemple, le lien http://localhost/content/liststories/order/pop/ deviendrait http://localhost/stories/
Pour ce faire, j'ai ajouter la route suivante:
$route = new Zend_Controller_Router_Route(
'stories',
array(
'module' => 'profile',
'controller' => 'member',
'action' => 'liststories'
)
);
$router->addRoute( 'stories', $route);
, mais le contrôlleur me retourne toujours l'erreur «Invalid controller specified (stories)». Je sais que le controller n'existe pas, !
Quelqu'un a une idée?
Merci!!
Voici une partie de mon fichier index.php ::
include 'Zend/Loader.php';
//autoload will avoid adding row like Zend::loadClass('Zend_View');
function __autoload($class)
{
#Zend::loadClass($class);
Zend_Loader::loadClass($class);
}
//Be sure to be able to register (see http://www.kitpages.fr/zf_migration.php)
Zend_Loader::loadClass("Zend_Registry");
//Start session
Zend_Session::start();
//Start session :: access data will be accessible using $value = Zend::registry('session')->value;
$session_ = new Zend_Session_Namespace("namespace");
Zend_Registry::set('session_', $session_);
/**
* Instantiate a Request to set BaseURL
* See later...
*/
$request = new Zend_Controller_Request_Http();
//Define router
$router = new Zend_Controller_Router_Rewrite();
$router->getRoutes();
$router->addRoute( 'admin', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'profile', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$route = new Zend_Controller_Router_Route(
'stories',
array(
'module' => 'profile',
'controller' => 'member',
'action' => 'liststories'
)
);
$router->addRoute( 'stories', $route);
//Define controller
/*$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('controllers');*/
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory(array(
'default' => PATH_CMS.'/applications/site/controllers',
'admin' => PATH_CMS.'/applications/admin/controllers',
'profile' => PATH_CMS.'/applications/profile/controllers',
'search' => PATH_CMS.'/applications/search/controllers',
));
Dernière modification par zudre (30-05-2007 23:16:15)
Hors ligne
As tu préfixer tes classes de controleurs par le nom du module comme
module
Controller
indexController.php
Accessible via l'URL : monsite.com/module/
le nom de la classe du controler Index doit etre :
Module_IndexController
Je te dis ca de mémoire, car j'ai eu le meme probleme mais j'ai pas le code sous les yeux ni la main
Hors ligne
Un petit Zend_Debug::Dump() de l'objet de requête, et éventuellement durant le dispatching, pour voir ce qui s'y passe.
Xdebug est aussi une bonne solution
Hors ligne
Oui, j'ai préfixer mes classes de contrôleur par le nom du module.
En fait, et je me suis sans doute mal exprimé, c'est que je veux faire du modrewrite avec le routeur de Zend. La raison est simple, comme mon .htaccess redirige toute les requêtes vers le index.php, je dois donc trouver une façon de rediriger mes requêtes.
Avec le mod_rewrite, j'aurais ajouté la ligne suivante à mon fichier htaccess
RewriteRule ^stories/?$ content/liststories/order/pop/ [L]
... mais ça ne fonctionne pas. J'ai donc pensé, en lisant la documentation, que le contrôlleur pouvait intercepter ce genre de requête et rediriger vers le bon :module/:controller/:action/*
Je sais pas si je suis plus clair de cette façon?!
J'ai fait un pas en avant et j'ai maintenant l'erreur «IndexController not found». J'ai ajouter ceci à mon fichier index.php
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory(array(
'default' => PATH_CMS.'/applications/site/controllers',
'admin' => PATH_CMS.'/applications/admin/controllers',
'profile' => PATH_CMS.'/applications/profile/controllers',
'search' => PATH_CMS.'/applications/search/controllers',
'stories' => PATH_CMS.'/applications/site/controllers',
));
//Define router
$router = new Zend_Controller_Router_Rewrite();
$router->getRoutes();
$route = new Zend_Controller_Router_Route_Static(
'stories',
array( 'module' => 'site',
'controller' => 'content',
'action' => 'liststories'
)
);
$router->addRoute( 'stories', $route);
$router->addRoute( 'admin', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'profile', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
mais ça ne change rien! Le contrôlleur cherche dans la classe stories l'action indexAction. Déjà que stories existe pas...
Merci de votre aide!
Hors ligne
Voici le dump de l'objet requête (Zend_Controller_Request_Http)
object(Zend_Controller_Request_Http)#3 (13) {
["_requestUri:protected"] => string(16) "/nvitest/stories"
["_baseUrl:protected"] => NULL
["_basePath:protected"] => NULL
["_pathInfo:protected"] => string(0) ""
["_params:protected"] => array(0) {
}
["_aliases:protected"] => array(0) {
}
["_dispatched:protected"] => bool(false)
["_module:protected"] => NULL
["_moduleKey:protected"] => string(6) "module"
["_controller:protected"] => NULL
["_controllerKey:protected"] => string(10) "controller"
["_action:protected"] => NULL
["_actionKey:protected"] => string(6) "action"
}
Hors ligne
Bonjour,
Pour ton exemple de 1h16 du mat (!), il faut ajouter ta route "stories" à la fin. C'est la dernière route ajoutée qui est prioritaire.
A priori, tu n'as pas besoin de rewrite en plus pour cette requête si tu as déjà une rewrite qui balance tout sur index.php.
$router->addRoute( 'admin', new Zend_Controller_Router_Route(':module/:controller/:action/*')); $router->addRoute( 'profile', new Zend_Controller_Router_Route(':module/:controller/:action/*')); $router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*')); // à mettre à la fin pour qu'elle soit prioritaire $router->addRoute( 'stories', $route);
Sinon ça me parrait bizarre que tu aies 3 fois la même route pour 'admin', 'profile' et 'search', mais je n'ai pas trop creusé les modules, c'est peut-être normal...
A+, Philippe
Hors ligne
Le 1h16 du matin s'explique parce que je suis au Québec... et non pas parce que je suis un oiseau de nuit ;-)
Les trois routes sont pour les modules. C'est la seul façon que j'ai trouvé de faire un match entre mes modules (et les contrôlleurs) et la route. Si j'enlève les trois routes identiques et que j'en renomme une «default», toutes les requêtes sont dirigées vers mon module par défault ('default' => PATH_CMS.'/applications/site/controllers'), contrôlleur index, action index.
Finalement, la solution était sous mon nez. J'ai trouvé le site http://osdir.com/ml/php.zend.framework. … 00265.html la réponse.
Solution finale:
$router->addRoute( 'admin', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'profile', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'stories', new Zend_Controller_Router_Route('stories/*', array('module' => 'site', 'controller' => 'content', 'action' => 'listarticle')));
$router->addRoute( 'pictures', new Zend_Controller_Router_Route('pictures/*', array('module' => 'site', 'controller' => 'content', 'action' => 'listgallery')));
Par contre, Philippe, j'ai beau changer l'order de mes routes, la priorité sur la dernière ne semble pas changer grand chose. Comme j'ai toujours mon long lien http://localhost/content/liststories/order/pop/ possible, même si je met ma route stories en premier, l'url n'est plus interprété et me retourne l'erreur «Invalid controller specified (listarticle)». Il semble donc que le contrôlleur ne prenne pas en considération l'ordre, mais bien la route qui correspond le plus à ce qui est demandé.
Est-ce possible?
Hors ligne
Bonjour,
A priori (en tout cas jusqu'au ZF 0.9.1), le ZF prend la première route qui correspond à l'URL en commençant par la fin :
Si on prend ces 2 routes :
$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*')); $router->addRoute( 'stories', new Zend_Controller_Router_Route('stories/*', array('module' => 'site', 'controller' => 'content', 'action' => 'listarticle')));
l'URL : http://www.monsite.com/stories/ctrl/action/12 vérifie les 2 routes. Dans ce cas il prend la dernière route ajoutée au routeur.
En tout cas bien vu pour le /*, j'avais pas vu
A+, Philippe
Hors ligne
Pages: 1