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 :

  1. /annuaire/1-libellecategorie/dep:86 c'est ok
  2. /annuaire/1-libellecategorie/dep:86/option:bleu c'est ok

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 !

3 réponses


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 ...
}