Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'utilisais les routes de façon basique jusqu'à maintenant (voir ci-dessous).
J'ai maintenant besoin de remplacer le controller et l'action de ma route par un slug.
Je veux donc passer de :
www.****.com/provider/list
à
www.****.com/liste-des-providers.
Je peux ôter le nom du controller de la route, cependant pas l'action.
Je pourrais utiliser des child route en définissant une route par défaut pour chaque action, mais j'aimerais que mon code soit réutilisable et donc, j'aimerais garder le système d'action générique, sans avoir à rajouter un child route à chaque nouvelle action.
Si vous avez une idée, vous remercies d'avance pour votre aide.
Ancienne route:
'router' => array( 'routes' => array( 'provider' => array( 'type' => 'segment', 'options' => array( 'route' => '/provider[/:action][/:page]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'page' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Provider\Controller\Provider', 'action' => 'index', 'page' => 1, ), ), ), ), ),
Nouvelle route:
'router' => array( 'routes' => array( 'provider' => array( 'type' => 'segment', 'options' => array( 'route' => '[/:slug][/:page]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'slug' => '[a-zA-Z][a-zA-Z0-9_-]*', 'page' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Provider\Controller\Provider', 'action' => 'list', 'slug' => 'list', 'page' => 1, ), ),
Hors ligne
Bonjour,
Autre chose, je pensais pouvoir gérer ce problème (en prenant plus de temps) et en créant des child routes. Seulement cela ne fonctionne pas non plus. J'ai pas mal cherché mais je ne trouve pas de solution.
Avec l'url monsite/liste-des-sites-a-visiter (slug qui correspond à mon action provider/list) ou avec monsite//points-de-vente (slug qui correspond à mon action provider/listpdv) j'atteris à chaque fois sur la vue list, même avec le slug points-de-vente (je devrais atterir sur la vue listpdv avec celui-ci).
Peu importe le slug que je saisies en url j'atteris sur ma vue list, qui correspond à mon action listAction.
J'aimerai que chaque slug me renvoie bien vers la bonne vue.
Si quelqu'un a déjà rencontré ce problème je suis preneur d'une solution!
module.config.php:
[lang=php] 'router' => array( 'routes' => array( 'provider' => array( 'type' => 'segment', 'options' => array( 'route' => '[/:slug][/:page]', 'constraints' => array( 'slug' => '[a-zA-Z][a-zA-Z0-9_-]*', 'page' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Provider\Controller\Provider', 'action' => 'list', 'page' => 1, ), ), 'may_terminate' => true, 'child_routes' => array( 'listpdv' => array( 'type' => 'segment', 'options' => array( 'route' => '[/:slug][/:page]', 'constraints' => array( 'slug' => '[a-zA-Z0-9_-]+', 'page' => '[0-9]+', ), 'defaults' => array( 'action' => 'listpdv', 'page' => 1, ), ), ), 'detail' => array( 'type' => 'segment', 'options' => array( 'route' => '[/:slug][/:page]', 'constraints' => array( 'slug' => '[a-zA-Z0-9_-]+', 'page' => '[0-9]+', ), 'defaults' => array( 'action' => 'detail', 'page' => 1, ), ), ), ), ), ), ),
Voilà mon fichier de navigation :
[lang=php]<?php return [ 'navigation' => [ 'default' => [ [ 'idmenu' => '9', 'label' => 'Comment ça marche ?', 'title' => 'Comment ça marche ?', 'slug' => 'commentcamarche', 'menu' => true, 'active' => true, 'route' => 'home', 'controller' => 'index', 'action' => 'index', 'resource' => 'menu_issuer', 'pages' => [ [ 'idmenu' => '6', 'label' => 'Fonctionnement du Pass\'a', 'title' => 'Fonctionnement du Pass\'a', 'slug' => 'fonctionnement', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'fonctionnement', 'params' => [ '' => '' ], 'active' => true, 'parent_id' => '9' ], [ 'idmenu' => '7', 'label' => 'Economies réalisées', 'title' => 'Economies réalisées', 'slug' => 'economies-realisees', 'menu' => true, 'route' => 'simulator', 'controller' => 'simulator', 'action' => 'index', 'active' => true, 'position' => '1', 'parent_id' => '9' ], [ 'idmenu' => '8', 'label' => 'Carte cadeau', 'title' => 'Carte cadeau', 'slug' => 'cartecadeau', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'cartecadeau', 'active' => true, 'position' => '2', 'parent_id' => '9' ] ] ], [ 'idmenu' => '10', 'label' => 'Sites inclus dans le Pass', 'title' => 'sitesinclus', 'slug' => 'sitesinclus', 'menu' => true, 'active' => true, 'position' => '1', 'route' => 'home', 'controller' => 'index', 'action' => 'index', 'pages' => [ [ 'idmenu' => '11', 'label' => 'Liste des sites à visiter', 'title' => 'liste-des-sites-a-visiter', 'slug' => 'liste-des-sites-a-visiter', 'menu' => true, 'route' => 'provider', 'controller' => 'provider', 'action' => 'list', 'active' => true, 'parent_id' => '10', 'params'=>[ 'slug' => 'liste-des-sites-a-visiter', ] ], [ 'idmenu' => '12', 'label' => 'Carte des sites à visiter', 'title' => 'carte des sites a visiter', 'slug' => 'carte-des-sites-a-visiter', 'menu' => true, 'route' => 'googlemap', 'controller' => 'googlemap', 'action' => 'providermap', 'active' => true, 'position' => '1', 'parent_id' => '10' ], [ 'idmenu' => '13', 'label' => 'Phothotèque des sites à visiter', 'title' => 'Phothotèque des sites à visiter', 'slug' => 'phothoteque-des-sites-a-visiter', 'menu' => true, 'route' => 'phototheque', 'controller' => 'phototheque', 'action' => 'index', 'active' => true, 'position' => '2', 'parent_id' => '10' ], [ 'idmenu' => '14', 'label' => 'videothèque des sites à visiter', 'title' => 'videothèque des sites à visiter', 'slug' => 'videotheque-des-sites-a-visiter', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'videotheque', 'active' => true, 'position' => '3', 'parent_id' => '10' ] ] ], [ 'idmenu' => '15', 'label' => 'Où se le procurer ?', 'title' => 'Où se le procurer ?', 'slug' => 'ou-se-le-procurer', 'menu' => true, 'active' => true, 'position' => '2', 'route' => 'home', 'controller' => 'index', 'action' => 'index', 'pages' => [ [ 'idmenu' => '16', 'label' => 'Points de vente', 'title' => 'Points de vente', 'slug' => 'points-de-vente', 'menu' => true, 'route' => 'provider', 'controller' => 'provider', 'action' => 'listpdv', 'active' => true, 'parent_id' => '15', 'params'=>[ 'slug' => 'points-de-vente', ] ], [ 'idmenu' => '17', 'label' => 'Carte des points de vente', 'title' => 'Carte des points de vente', 'slug' => 'carte-des-points-de-vente', 'menu' => true, 'route' => 'googlemap', 'controller' => 'googlemap', 'action' => 'pdvmap', 'active' => true, 'position' => '1', 'parent_id' => '15' ], [ 'idmenu' => '18', 'label' => 'Boutique en ligne', 'title' => 'Boutique en ligne', 'slug' => 'boutique-en-ligne', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'shop', 'active' => true, 'position' => '2', 'parent_id' => '15' ] ] ], [ 'idmenu' => '19', 'label' => 'Boutique Pass\'a', 'title' => 'Boutique Pass\'a', 'slug' => 'boutique-pass-a', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'shop', 'active' => true, 'position' => '3' ], [ 'idmenu' => '20', 'label' => 'Autour du Pass\'a', 'title' => 'Autour du Pass\'a', 'slug' => 'autour-du-pass-a', 'menu' => true, 'active' => true, 'position' => '4', 'route' => 'home', 'controller' => 'index', 'action' => 'index', 'pages' => [ [ 'idmenu' => '21', 'label' => 'Presse', 'title' => 'Presse', 'slug' => 'presse', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'presse', 'active' => true, 'parent_id' => '20' ], [ 'idmenu' => '22', 'label' => 'Web', 'title' => 'Web', 'slug' => 'web', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'web', 'active' => true, 'position' => '1', 'parent_id' => '20' ], [ 'idmenu' => '23', 'label' => 'Vidéos', 'title' => 'Vidéos', 'slug' => 'videos', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'video', 'active' => true, 'position' => '2', 'parent_id' => '20' ], [ 'idmenu' => '24', 'label' => 'Amis du Pass', 'title' => 'Amis du Pass', 'slug' => 'amis-du-pass', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'friends', 'active' => true, 'position' => '3', 'parent_id' => '20' ], [ 'idmenu' => '26', 'label' => 'Abonnement à la newsletter', 'title' => 'Abonnement à la newsletter', 'slug' => 'abonnement-a-la-newsletter', 'menu' => true, 'route' => 'newsletter', 'controller' => 'newsletter', 'action' => 'index', 'active' => true, 'position' => '4', 'parent_id' => '20' ] ] ], [ 'idmenu' => '25', 'label' => 'Application Mobile', 'title' => 'Application Mobile', 'slug' => 'application-mobile', 'menu' => true, 'route' => 'page', 'controller' => 'page', 'action' => 'mobile', 'active' => true, 'position' => '5' ] ] ], 'service_manager' => array( 'factories' => array( // 'Zend\Db\Adapter\Adapter' // => 'Zend\Db\Adapter\AdapterServiceFactory', 'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory', ), ), ];
Dernière modification par Lolowe (02-08-2016 11:17:29)
Hors ligne
Hello, franchement je n'ai rien compris ... Pourrais-tu donner un exemple claire de route que tu veux avoir via les 2 méthodes parce que là dans ce que tu expliques dans les 2 cas ta route est la même (seul le slug change mais le pattern est le même) donc normal de tomber toujours sur la même action
Hors ligne
Désolé pour le manque de clarté et merci pour la réponse.
Je voudrais simplement créer des routes avec des slugs, sans que le controller et l'action soient visibles dans l'url.
J'ai évidemment plusieurs actions et plusieurs controllers.
Hors ligne
monsite.com/liste-des-sites-a-visiter
et
monsite.com/points-de-vente
sont au même niveaux. Il ne faut donc pas les imbriquer (parent/child) dans la route. C'est pour cela que tu tombes à chaque fois sur le premier.
Tes slugs, tu les inscrits dans les 'route' et c'est dans les sections 'defaults' que tu assignes le controller et l'action.
C'est tout.
Et vire tous ces "array()" et remplace-les par des "[]" (si tu es en PHP 5.4+ ce que j'espère).
[lang=php] 'router' => array( 'routes' => array( 'provider' => array( 'type' => 'segment', 'options' => array( 'route' => '/liste-des-providers[/:page]', 'constraints' => array( 'page' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Provider\Controller\Provider', 'action' => 'list', 'page' => 1, ), ), ), 'listpdv' => array( 'type' => 'segment', 'options' => array( 'route' => '/liste-des-points-de-vente[/:page]', 'constraints' => array( 'page' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Provider\Controller\Provider', 'action' => 'listpdv', 'page' => 1, ), ) ), 'detail' => array( 'type' => 'segment', 'options' => array( 'route' => 'detail-du-point-de-vente[/:id]', 'constraints' => array( 'id' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Provider\Controller\Provider', 'action' => 'detail' ), ), ), ) )
Dernière modification par Bouks (04-08-2016 23:10:09)
Hors ligne
Merci ça m'a aidé!
Hors ligne