Bonsoir,

J'ai un controller SeriesController et une action show(id, slug) et je voudrais que mon URL soit serie/id/slug donc pour ça j'ai créé une route dans routes.php :

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

Et dans mon action show j'ai :

function show($id = null,$slug = null){
        if(!$id)
            throw new NotFoundException('Aucune page ne correspond à cet ID'); 
        $page = $this->Serie->find('first', array(
            'conditions' => array('id' => $id)
        ));
        if(empty($page))
            throw new NotFoundException('Aucune page ne correspond à cet ID'); 
        if($slug != $page'Serie']'slug'])
            $this->redirect($page'Serie']'link'],301);
        $d'serie'] = current($page);
        $this->set($d);
    }

Quand je me rend sur root/serie/1/how-i-met-your-mother j'ai une erreur comme quoi le controller serie n'existe pas, donc j'en conclue que ma route ne se fait pas :/

Si je me rend sur root/series/show/1/how-i-met-your-mother aucun problème sa s'affiche (logique c'est le chemin "par défaut").
Et vient le problème de redirection, lorsque je change l'url pour tester si la rediction se fait correctement je tombe sur l'URL : root/series/show/id:1/slug:how-i-met-your-mother donc il redirige bien sur le bon slug mais au niveau des paramètres c'est pas bon du tout :/

Je pense que c'est un problème de route mais je ne vois pas ou il est.
(root/ est la racine de mon site bien entendu)

Merci d'avance.

4 réponses


Grafikart
Réponse acceptée

Router::connect('serie/:id/:slug', array('controller' => 'series', 'action' => 'show', array('pass'=> array('id','slug'), 'id'=>'[0-9]+','slug' =>'[a-z0-9-]+')));

Pas bon

Router::connect('serie/:id/:slug', array('controller' => 'series', 'action' => 'show'), array('pass'=> array('id','slug'), 'id'=>'[0-9]+','slug' =>'[a-z0-9-]+'));

Bon :)

Le pass doit être envoyé dans un 3ème argument de Router::connect (regarde bien les parenthèses :)

Flowcki
Auteur
Réponse acceptée

En effet j'utilise chrome ;) (Comment supprimer cette mémoire des 301 ?)

Il manquait un "/" dans le router pour que ça fonctionne, le truc tout bête -_-

Flowcki
Auteur

Merci pour ta réponse ;).

Toujours un problème :/. Quand je supprime le r de mother et que je valide toujours le même soucis, si je rajoute des caractère dans le slug ça fonctionne, je suis redirigé vers serie/1/how-i-met-your-mother mais il me dit toujours que le SerieController est manquant...

Si ça peut aider voila mon controller :

<?php
class SeriesController extends AppController {
    public $uses = array('Serie');
    public $view = 'Series';
    public function index(){
        $d'series'] = $this->Serie->find('all');
        $this->set($d);
    }
    function show($id = null,$slug = null){
        if(!$id)
            throw new NotFoundException('Aucune page ne correspond à cet ID'); 
        $page = $this->Serie->find('first', array(
            'conditions' => array('id' => $id)
        ));
        if(empty($page))
            throw new NotFoundException('Aucune page ne correspond à cet ID'); 
        if($slug != $page'Serie']'slug'])
            $this->redirect($page'Serie']'link'],301);
        $d'serie'] = current($page);
        $this->set($d);
    }
    public function admin_index(){
        $d'series'] = $this->Serie->find('all');
        $this->set($d);
    }
}
?>

Je suis sur la version 2.0 stable.

Attention si tu es sur chrome il a une mémoire des 301, juste pour éliminer cette possibilité tu pourrais me dire quel navigateur tu utilise (si c'est chrome, met toi en navigation privée entre chaque test.