Bonjour à tous,

Je me mets à CakePHP doucement et je rencontre quelques problème sur le routing. Après de nombreuses recherches infructueuses sur le net je me décide donc à poster un message.
Je souhaiterai passer mon site sur Cake tout en conservant les anciennes URLs (pour le référencement). Mon but est d'adapter Cake. Les urls actuelles ont cette forme :
http://wwww.monsite.com/nom-categorie/nom-produit.html
http://wwww.monsite.com/actualites/actualite.html

Pour les urls comme actualités ça reste simple ; un controller est créé et les paramètres sont passés dans les liens et récupérés dans le router :

Router::connect('/actualites/:slug',
        array('controller'=>'actualites','action'=>'view'),
        array('pass'=>array('slug'))
        );

Pour les produits :

Router::connect('/:categorie',
        array('controller'=>'pages','action'=>'categorie'),
        array('pass'=>array('categorie'))
        );
Router::connect('/:categorie/:slug',
        array('controller'=>'pages','action'=>'view'),
        array('pass'=>array('categorie','slug'))
        );

Dans l'absolu tout fonctionne. Mais je suis obligé de créer une règle pour chaque controller en plus. Et si le controller n'existe pas la règle des produits reprend le dessus et génère des erreurs. De plus, les actions avec le controller users font planter le système.
Je précise également qu'il n'est pas possible de créer un controller par catégorie de produit (même si elles sont peur nombreuses) car ces catégories contiennent des tirets.

Je n'ai pas trouvé de solution dans la doc et si j'ai bien compris ce problème est insoluble à part recréer un controller pour les produits et donc changer d'URL en http://www.monsite.com/produits/no-categorie/nom-produit.html.

Si vous avez une idée, une astuce je suis preneur.

Un grand merci !

2 réponses


Pour les produits, ta seconde façon de faire est bonne, par contre il faudra bien penser à passer le slug de la catégorie en paramètre lorsque tu créés tes liens via les Helpers Html.

J'utilise ça sur pas mal de projets intra/extranet sur lesquels les modèles sont vraiment hérités et hiérarchisés, et je n'ai aucun souci à avoir des urls http://domaine.dev/slug-model/slug-model-enfant/slug-model-petit-enfant/

Perso, ce que je fais, c'est que pour chaque élément de la route je vérifie s'il est bien le parent du model en question, mais si ton but est simplement la réécriture d'url, ça va le faire sans ça. Par contre, tes urls seront valides mêmes avec des catégories n'existant pas.

A toi de voir ;)

Dam
Auteur

Bonjour,

Merci pour la réponse Pakito.
Mon but est effectivement de faire une réécriture propre mais surtout de faire correspondre les anciennes urls avec les urls de CakePHP.
Le problème est que je me retrouve avec plus de 15 lignes de réécriture d'URL dans le router et le problème des urls valides avec des catégories n'existant pas.
J'ai entendu dire que surcharger le router n'était pas bon pour la rapidité de cakePHP.

Pour le moment je poursuis dans cette voie. Je laisse le sujet non validé encore un peu pour voir si d'autres personnes postent leurs idées. Sinon je validerai ta réponse.

Merci