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
Réponse acceptée

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

ok, alors je te donne la solution :…

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

Digikube
Auteur

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

articles/lire/12/titre

Attendu :

actualites/12-titre

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
Auteur

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));

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
Auteur

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]+'));

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
Auteur

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>
Digikube
Auteur

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