Salut,
Je viens de lire le tutoriel sur le routing de cake php, et je me suis fait rapidement un système d'annonce :
/CakePHP/annonces/ => Liste des annonces
/CakePHP/annonces/2 => Liste des annonces (Page 2)
/CakePHP/annonces/view/telephonie/chargeur-galaxy-s4 => Voir l'annonce Chargeur Galaxy S4 de la catégory Téléphonie.
Seulement, je voudrais pouvoir retirer le view et donnner:
/CakePHP/annonces/telephonie/chargeur-galaxy-s4 SOIS: /CakePHP/annonces/cateogry/slug
J'ai donc fait ceci:
Router::connect(
'/annonces/:category/:slug_annonce',
array('controller' => 'annonces', 'action' => 'view'),
array( 'pass' => array('category', 'slug_annonce'),
'category' => '[A-Za-z\-]+',
'slug_annonce' => '[A-Za-z0-9\-]+'
)
);
public function view($category, $slug_annonce)
{
die("Category: $category | Slug: $slug_annonce");
}
Ce qui fait que ceci fonctionne:
/CakePHP/annonces/telephonie/chargeur-galaxy-s4
Mais ça fait tous planté après,
/CakePHP/annonces/ index / 5 interprete la category index et le slug 5.
Alors il y a t'il un moyen de faire ce que je veut faire, ou ce n'est pas possible ?
Merci
Bonjour,
Le soucis est que dans les expressions régulière que tu lui donnes pour parser l'url, les deux urls sont parsés exactement de la même façon, en effet pour lui, rien ne les differencie.
Alors comme ça trois idées, (des bonnes et des bien pourries innapliquables^^)
La première idée et mauvaise idée, c'est de retirer la chaine index dans l'expression régulière pour matcher la catégorie, déjà c'est pas super simple à écrire et en plus ça reglera pas le problème avec les autres actions ... => poubelle
La deuxième, c'est simplement de dire que lorsqu'on va sur un article précis, on est pas sur http:///truc/annonces mais sur http://truc/annonce au singulier , ça c'est pas pour faire le petit malinois mais c'est sans doute pas le mieux
Alors la troisième idée que j'ai comme ça, c'est de regarder ce qui différencie les deux urls.
La différence notable est sur le slug
En effet dans le premier cas, on a un slug assez long avec des lettres, des chiffres
De le l'autre juste un nombre
L'idée est peut être de d'imposer au slug de commencer par une lettre par exemple:
'slug_annonce' => '[A-Za-z][A-Za-z0-9\-]*'
ou de contenir au moins une lettre:
'slug_annonce' => '[A-Za-z0-9\-]*[A-Za-z]+[A-Za-z0-9\-]*'
Bien cordialement
Antho
Dans ta vue, lorsque tu génère ton lien avec le helper Html, il faut lui préciser les variable que tu lui passe dans l'url
Actuellement, tu as ça :
<?php echo $this->Html->link('Mon lien', array('controller' => 'annonces', 'action' => 'view', $category, $slug));
Il faut préciser à quoi correspondent $category et $slug dans ton url pour qu'il match avec t'as route
<?php echo $this->Html->link('Mon lien', array('controller' => 'annonces', 'action' => 'view', 'category' => $category, 'slug_annonce' => $slug));
Du coup dans ta fonction view, tu n'as plus besoin de préciser les paramètres $category et $slug, en revanche tu dois les récupérer avec
$category = $this->request->params'category'];
$slug= $this->request->params'slug_annonce'];
Bonjour,
D'accord, mais toujours est-il qu'avec la route actuelle
Router::connect(
'/annonces/:category/:slug_annonce',
array('controller' => 'annonces', 'action' => 'view'),
array( 'pass' => array('category', 'slug_annonce'),
'category' => '[A-Za-z\-]+',
'slug_annonce' => '[A-Za-z0-9\-]+'
)
);
Cette url là :
/site/annonces/index/5
sera comprise en :
categoy => index (ça match bien [A-Za-z-]+)
slug_annonce => 5 (ça match bien '[A-Za-z0-9-]+')
bien cordialement
Essaye en déclarant une nouvelle route avant celle de view
Router::connect(
'/annonces/index/:page',
array('controller' => 'annonces', 'action' => 'index'),
array('named' => array(
'page' => '[0-9]+')
)
);
En faite le soucis est que ça dépend vachement des autres actions éventuelles... , ma solution laisse libre a toute url du style /index/4 , /add/3, /del/2 etc...
La tienne isole le cas index ,
Tout ça ça marche... mais jusqu'à quand? c'est surement la question à se poser ... quelles vont être les évolutions futures et les nouvelles routes à considérer et selon, redéfinir celle-ci ...