Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
je développe avec zend framework depuis presque 10 mois et j'essai d'améliorer un peu mes connaissances. En fait, j'essai d'utiliser Zend_Controller_Router mais j'ai de gros problèmes avec.
J'ai une page qui a l'url suivant :
localhost/proweb/annonces/details/typeAnnonce/12/idAnnonce/17
Et je veux lui donner la forme suivante :
localhost/proweb/annonces/offres-emploi/12-17-titre-de-mon-annonce.html
voici le code que j'ai mis dans le bootstrap
$route = new Zend_Controller_Router_Route_Regex( $config->site->url.'/annonces/(\.+)/(\d+)-(\d+)-(\.+).html', array( 'module'=>'Index', 'controller' => 'Annonces', 'action' => 'details' ), array( 1=>'textTypeAnnonce', 2 => 'typeAnnonce', 3 => 'idAnnonce', 4=>'titreAnnonce' ), 'annonces/%s/%d-%d-%s.html' ); $router->addRoute('detailsAnnonce', $route);
Et voici celui de ma page de vue
<a style="color:#2979C4;text-decoration:none;font-family:Arial,Verdana; font-size:14px;" href="'.$this->url(array('textTypeAnnonce'=>'type-des-annonces','typeAnnonce'=>$annonce->annonce_type_id,'idAnnonce'=>$annonce->annonce_id,'titreAnnonce'=>$annonce->annonce_titre),'detailsAnnonce').'"> '.$annonce->annonce_titre.' </a>
Mais avec cette méthode le lien écris dans la source de la page est:
./proweb/annonces/type-des-annonces/1-8-Offre+emploi+1+modifi%C3%A9.html
Et quand je clique dessus ça me donne 1 liens sous la forme
localhost/proweb/annonces/liste-annonces/typeAnnonce/1/proweb/annonces/type-des-annonces/1-8-Offre+emploi+1+modifi%C3%A9.html
S'il vous plait aidez moi :cry::cry::cry:
Dernière modification par othmane126 (23-05-2009 13:17:17)
Hors ligne
Ton titre comporte des espaces et des accents ?
Pourquoi ne pas rajouter un champ "alias" ou autre dans ta table qui serait le titre sous cette forme :
Titre : Le titre de l'annonce.
Alias : le-titre-de-annonce
Les espaces deviennent des -
Les lettres avec leur apostrophe deviennent des - (comprenant aussi l'espace avant)
Les points sont supprimés
Tout les accents sont retirés des lettres
Cela te ferai donc une url comme cela : %typeAnnonce%-%idAnnonce%-%alias%.html
Et le titre pourra comporter des accents, espaces etc...
Tu peux avec cette solution soit convertir ton titre pour remplir ton alias ou fournir un champ dans le formulaire pour mettre un alias.
Ensuite pour récupérer ta ligne correspondante, tu vérifie ton typeAnnonce, idAnnonce et sont alias si il ne retourne rien ->Erreur.
Dernière modification par Seazer (17-05-2009 15:33:31)
Hors ligne
Bonjour,
je vous remercie Seazer pour votre réponse. En fait, pour le moment je ne me soucis pas des accents et espaces dans l'url mais plutôt du chemin généré par le router qui est complétement erroné. Il me donne un lien sous la forme localhost/proweb/annonces/liste-annonces/typeAnnonce/1/proweb/annonces/type-des-annonces/1-8-Offre+emploi+1+modifi%C3%A9.html alors qu'il faut qu'il aie la forme suivante :
localhost/proweb/annonces/type-des-annonces/1-8-Offre+emploi+1+modifi%C3%A9.html
Hors ligne
Ton problème doit venir du : "$config->site->url"
Essaye plutôt avec quelque chose comme ceci :
$router->addRoute( "detailsAnnonce", new Zend_Controller_Router_Route_Regex( '(\w+)/(\w+)/(\w+)/annonce/(\.+)/(\d+)-(\d+)-(\.+).html', array( 'module' => 'Index', 'controller' => 'Annonces', 'action' => 'details' ), array( 1 => 'textTypeAnnonce', 2 => 'typeAnnonce', 3 => 'idAnnonce', 4 => 'titreAnnonce' ) ) );
Je ne peux pas le tester, j'ai essayé de te pondre un code, il peux y avoir des petites erreurs.
P. S. : Je ne connaissais pas le "$this->url(array())", merci j'aurais moi même appris quelque chose.
Dernière modification par Seazer (18-05-2009 00:06:38)
Hors ligne
Bonjour, merci seazer pour ton aide je vois que vous êtes le seul ici qui s'y connait en Zend_Controller_Router
Je viens d'utilser ton code et ça me donne l'erreur suivante :
Fatal error: Uncaught exception 'Zend_Controller_Router_Exception' with message 'Cannot assemble. Reversed route is not specified.' in D:\wamp\www\proweb\library\zend1.7.8\library\Zend\Controller\Router\Route\Regex.php:150 Stack trace: #0 D:\wamp\www\proweb\library\zend1.7.8\library\Zend\Controller\Router\Rewrite.php(377): Zend_Controller_Router_Route_Regex->assemble(Array, false, true) #1 D:\wamp\www\proweb\library\zend1.7.8\library\Zend\View\Helper\Url.php(49): Zend_Controller_Router_Rewrite->assemble(Array, 'detailsAnnonce', false, true) #2 [internal function]: Zend_View_Helper_Url->url(Array, 'detailsAnnonce') #3 D:\wamp\www\proweb\library\zend1.7.8\library\Zend\View\Abstract.php(329): call_user_func_array(Array, Array) #4 [internal function]: Zend_View_Abstract->__call('url', Array) #5 D:\wamp\www\proweb\application\Index\views\scripts\annonces\liste-annonces.phtml(24): Zend_View->url(Array, 'detailsAnnonce') #6 D:\wamp\www\proweb\library\zend1.7.8\library\Zend\View.php(107): include('D:\wamp\www\pro...') #7 D:\wamp\ in D:\wamp\www\proweb\library\zend1.7.8\library\Zend\Controller\Router\Route\Regex.php on line 150
J'ai cherché sur internet mais pas de solution concernant cette erreur :s :s
Hors ligne
Non je ne doit pas être le seul et heureusement d'ailleurs.
J'essaye juste d'aider avec mon infime connaissance de ce formidable framework.
En faite je crois que mon code est beaucoup trop personnel (Initializer quand tu nous tiens !), je vais essayer de t'en faire un plus générique.
$routeDetailsAnnonce = new Zend_Controller_Router_Route_Regex( 'annonce/(\.+)/(\d+)-(\d+)-(\.+).html', array( 'module' => 'Index', 'controller' => 'Annonces', 'action' => 'details', 1 => 'defaultValueTextTypeAnnonce', 2 => 'etc...' ), array( 1 => 'textTypeAnnonce', 2 => 'typeAnnonce', 3 => 'idAnnonce', 4 => 'titreAnnonce' ), 'annonces/%s/%d-%d-%s.html' ) ); $router->addRoute('detailsAnnonce', $routeDetailsAnnonce);
Là, ton url sera de la forme :
root/annonces/textTypeAnnonce/typeAnnonce-idAnnonce-titreAnnonce.html
Comme tu le voit on revient à la case départ mais sans ton "$config->site->url".
P. S. : J'aime bien ton "voutoiement".
Au pire, voilà un tutoriel qui pourra t'aider.
En attente d'un retour.
Dernière modification par Seazer (18-05-2009 10:18:19)
Hors ligne
Bonjour,
Ouuf enfin ça marche ! Au moins une partie ! Merci beaucoup seazer maintenant j'obtiens les urls sous la forme que je veux, ex :
/proweb/annonces/Business/11-41-Business.html
Mais j'ai encore un problème, c'est par exemple cet url si j'ajoute d'autres mots à la fin ça ne marche pas. Par ex avec cet url
/proweb/annonces/Business/11-41-Business-new.html
j'obtiens l'exception suivante
atal error: Uncaught exception 'Zend_Controller_Action_Exception' with message 'Action "business" does not exist and was not trapped in __call()' in D:\wamp\www\proweb\library\zend1.7.8\library\Zend\Controller\Action.php:475 Stack trace: #0 D:\wamp\www\proweb\library\zend1.7.8\library\Zend\Controller\Action.php(505): Zend_Controller_Action->__call('businessAction', Array) #1 D:\wamp\www\proweb\library\zend1.7.8\library\Zend\Controller\Dispatcher\Standard.php(285): Zend_Controller_Action->dispatch('businessAction') #2 D:\wamp\www\proweb\library\zend1.7.8\library\Zend\Controller\Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #3 D:\wamp\www\proweb\index.php(133): Zend_Controller_Front->dispatch() #4 {main} thrown in D:\wamp\www\proweb\library\zend1.7.8\library\Zend\Controller\Action.php on line 475
Voici le code que j'utilise maintenan :
index.php
Zend_Loader::loadClass('Zend_Controller_Router_Route_Regex'); $router = $frontController->getRouter(); $routeDetailsAnnonce = new Zend_Controller_Router_Route_Regex( 'annonces/(\w+)/(\d+)-(\d+)-(\w+).html', array( 'module' => 'Index', 'controller' => 'Annonces', 'action' => 'details', 1 => 'offres-emploi', 2 => 1, 3 => 1, 4 => 'titre-default' ), array( 1 => 'textTypeAnnonce', 2 => 'typeAnnonce', 3 => 'idAnnonce', 4 => 'titreAnnonce' ), 'annonces/%s/%d-%d-%s.html' ); $router->addRoute('detailsAnnonce', $routeDetailsAnnonce);
la vue :
<a style="color:#2979C4;text-decoration:none;font-family:Arial,Verdana; font-size:14px;" href="'. $this->url( array('textTypeAnnonce'=>$annonce['annonce_type_titre'], 'typeAnnonce'=>$annonce['annonce_type_id'], 'idAnnonce'=>$annonce['annonce_id'], 'titreAnnonce'=>$annonce['annonce_titre']), 'detailsAnnonce') .'"> '.$annonce['annonce_titre'].' </a>
Hors ligne
Bonjour,
maintenant c'est parfait, j'avais un problème avec l'expression régulière.
index.php
Zend_Loader::loadClass('Zend_Controller_Router_Route_Regex'); $router = $frontController->getRouter(); $routeDetailsAnnonce = new Zend_Controller_Router_Route_Regex( 'annonces/([A-Za-z-0-9\+]*)/(\d+)-(\d+)-([A-Za-z-0-9\+]*).html', array( 'module' => 'Index', 'controller' => 'Annonces', 'action' => 'details', 1 => 'offres-emploi', 2 => 1, 3 => 1, 4 => 'titre-default' ), array( 1 => 'textTypeAnnonce', 2 => 'typeAnnonce', 3 => 'idAnnonce', 4 => 'titreAnnonce' ), 'annonces/%s/%d-%d-%s.html' ); $router->addRoute('detailsAnnonce', $routeDetailsAnnonce);
view:
echo '<table style="background:#'.$bgColor.';width:100%;height:100px;"> <tr><td style="width:500px;"> <a style="color:#2979C4;text-decoration:none;font-family:Arial,Verdana; font-size:14px;" href="'. $urlAnnonce=$this->url( array('textTypeAnnonce'=>$annonce['annonce_type_titre_alias'], 'typeAnnonce'=>$annonce['annonce_type_id'], 'idAnnonce'=>$annonce['annonce_id'], 'titreAnnonce'=>$titre), 'detailsAnnonce') .'"> '.$annonce['annonce_titre'].' </a></td> <td style="text-align:right;color:#2979C4">'.$annonce['date_ajout'].'</td></tr> <tr><td colspan="2">'.$annonce['texte'].'</td></tr> <tr> <td style="">Ville: <span style="color:#2969C4;font-weight:bold;text-transform: capitalize;">'.utf8_encode($annonce['ville']).'</span> </td><td style="text-align:right"> <a style="color:#F0A42A;font-weight:bold;text-decoration:none;font-family:Arial,Verdana; font-size:14px;" href="'.$urlAnnonce.'">Voir détails>></a></td></tr> </table> ';
Dernière modification par othmane126 (23-05-2009 13:15:21)
Hors ligne
Pages: 1