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

5 réponses


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