Routes article

Par Digikube, il y a 13 ans


Bonjour à toutes et à tous,

Un petit soucis de routes que je n'arrive pas à résoudre pouvez vous m'aider svp :

Routes.php :

Router::connect('/actualites/:id-:slug',array('controller' => 'articles', 'action' => 'lire'),array('pass' => array('id','slug'), 'id' => '[0-9]+', 'slug' => '[a-z0-9\-]+'));

ArticlesController.php :

public function lire($id = null, $slug = null) {
        $this->Article->contain('Tag','Commentaire');
        $data = $this->Article->find('first',array(
            'conditions' => array('id' => $id)
        ));
        if($slug != $data'Article']'slug']){
            $this->redirect(array('controller' => 'articles', 'action' => 'lire', $article'Article']'id'], $article'Article']'slug']),301); 
        }
        $this->set('article', $data);
    }

Je ne vois pas où ça cloche ...

10 réponses

Flohw, il y a 13 ans

ok, alors je te donne la solution :…

désolé pour l'ironie, c'est quoi le problème de ton code ?

Digikube, il y a 13 ans

Ah oui j'ai oublié de préciser lol cette route ne s'affiche pas correctement :

articles/lire/12/titre

Attendu :

actualites/12-titre
Flohw, il y a 13 ans

je vois pas trop d'où ca peut venir, cependant, je sais que lorsque je mets une règle pour le slug, les routes ne fonctionnent pas…
as tu d'autres routes avant ? parce que si c'est le cas et qu'elles correspondent, les suivantes sont ignorées

Digikube, il y a 13 ans

Oui voici les autres mais elle ne devraient pas coincider ...

Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
    Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

    Router::connect('/actualites/:id-:slug',array('controller' => 'articles', 'action' => 'lire'),array('pass' => array('id','slug'), 'id' => '[0-9]+', 'slug' => '[a-z0-9\-]+'));
    Router::connect('/actualites', array('controller' => 'articles', 'action' => 'index', 'compte' => false));
    Router::connect('/compte', array('controller' => 'utilisateurs', 'action' => 'dashboard', 'compte' => true));
    Router::connect('/compte/connexion', array('controller' => 'utilisateurs', 'action' => 'connexion', 'compte' => false));
    Router::connect('/compte/inscription', array('controller' => 'utilisateurs', 'action' => 'inscription', 'compte' => false));
    Router::connect('/compte/deconnexion', array('controller' => 'utilisateurs', 'action' => 'deconnexion', 'compte' => false));
Flohw, il y a 13 ans

ouai, effectivement… essaye de virer la contraintes sur le slug pour voir si ca marche mieux… quand je fais mes routes et que je mets ces contraintes, ca marche pas… je pourrais pas t'aider plus, par contre, si tu trouves la solution, dis moi :)

Digikube, il y a 13 ans

Jai essayer .. mais sans succès. J'ai même tester je l'enlever et laisser que l'id comme ça mais en vain.

Router::connect('/actualites/:id',array('controller' => 'articles', 'action' => 'lire'),array('pass' => array('id'), 'id' => '[0-9]+'));
Flohw, il y a 13 ans

mh… je vois pas trop là comment définis tu tes liens ? avec un array('controller' => …) ou /articles/lire/12/titre ? si c'est le deuxieme cas, c'est normal que ca ne marche pas !

Digikube, il y a 13 ans

Voici la syntaxe que j'utilise :

<p><?php echo $this->Html->link('Lire la suite', array('controller' => 'articles', 'action' => 'lire', $article'Article']'id'], $article'Article']'slug'])); ?></p>
Flohw, il y a 13 ans

haaa baj oui, je comprends mieux !!
les :id-:slug dans la définition de la route, signifie que ce sont des arguments nommés, tu dois donc avoir :
array(…]'lire', 'id' => $articleId, 'slug' => $articleSlug));

l'argument 'pass' de la route signifie que tu donnes en paramètres, dans l'ordre défini les arguments id et slug (les noms des arguments dans les fonctions ne portent pas nécessairement le même nom

tout compris ? je ne suis pas sûr d'avoir été très clair

Digikube, il y a 13 ans

Ah ah je vais tester ça tout de suite.
Et ça marche à merveille !