Bonjour,
je souhaiterais réaliser l'URL Rewriting pour une catégorie + département + une option.
Actuellement, l'URL Rewriting fonctionne pour catégorie + département avec le code suivant dans le fichier routes.php :
exemple :
je voudrais que le 2. devienne : /annuaire/1-libellecategorie/dep:86/bleu non ok actuellement :(
Voici mon code :
Router::connect(
'/annuaire/:id-:slug/*', // E.g. /blog/3-CakePHP_Rocks
array('controller' => 'agregats', 'action' => 'index'),
array(
// order matters since this will simply map ":id" to $articleId in your action
'pass' => array('id', 'slug'),
'id' => '[0-9]+'
)
);
Merci d'avance !
Fait toujours de la plus présice à la moins précise !
Router::connect('/annuaire/:id-:slug/:dep/:option', ['controller' => 'agregats', 'action' => 'index'], [
'pass' => ['id', 'slug', 'dep', 'option'], 'id' => '\d+', 'slug' => '[a-z0-9\-]+', 'dep' => '\d+', 'option' => '\w+'
]);
Router::connect('/annuaire/:id-:slug/:dep', ['controller' => 'agregats', 'action' => 'index'], [
'pass' => ['id', 'slug', 'dep'], 'id' => '\d+', 'slug' => '[a-z0-9\-]+', 'dep' => '\d+'
]);
Router::connect('/annuaire/:id-:slug', ['controller' => 'agregats', 'action' => 'index'], [
'pass' => ['id', 'slug'], 'id' => '\d+', 'slug' => '[a-z0-9\-]+'
]);
Et l'action de ton controller devrait ressembler à ceci :
public function index($id = null, $slug = null, $dep = null, $option = null) {}
Pour créer le lien, oublie pas de toujours passer les arguments.
Et tu devrais avoir accès à :
/annuaire/1-libellecategorie/86/bleu
/annuaire/1-libellecategorie/86
/annuaire/1-libellecategorie
merci de ton retour, malheureusement cela ne fonctionne pas moi je souhaite :
/annuaire/1-libellecategorie/dep:86/bleu
quand j'applique ta recommandation, j'ai bien /annuaire/1-libellecategorie/86/bleu mais la page est identique à /annuaire/1-libellecategorie
Bonjour.
moi je souhaite : /annuaire/1-libellecategorie/dep:86/bleu
Il te faut éviter de vouloir mettre :
dans l'url, car dans le routing de CakePHP, le caractère :
sert d'identifiants pour les paramètres passées dans l'url, ce qui ferait ceci pour matcher l'url : /annuaire/:id-:slug/dep::dep/:option
.
Comme tu peux le voir, ça ferait deux fois le caractère :
placé consécutivement, ce qui risque de poser des problèmes pour matcher l'url pour le routing, si tu veux tu peux par exemple remplacer par : /annuaire/:id-:slug/dep.:dep/:option
ce qui donnerait par exemple /annuaire/1-libellecategorie/dep.86/bleu.
quand j'applique ta recommandation, j'ai bien /annuaire/1-libellecategorie/86/bleu mais la page est identique à /annuaire/1-libellecategorie
Il ne te faut pas oublier de bien prendre en compte les paramètres qui sont dans l'url ou non et de faire la requête SQL correspondante.
Par exemple :
public function index($id = null, $slug = null, $dep = null, $option = null)
{
$conditions = [];
if (!is_nul($option)) {
$conditions = array_merge($conditions, ['option' => $option]);
}
if (!is_null($dep)) {
$conditions = array_merge($conditions, ['dep' => $dep]);
}
if (!is_null($slug) {
$conditions = array_merge($conditions, ['dep' => $dep]);
}
if (!is_null($id) {
$conditions = array_merge($conditions, ['slug' => $slug]);
}
if ($conditions) {
$agregats = $this->Agregat->find('all', ['conditions' => $conditions]);
} else {
$agregats = $this->Agregat->find('all');
}
// Suite du code ...
}