Bonjour a tous. Tout d'abord je tiens à préciser que je commence tout juste CakePhp, j'ai cherché quelques info mais rien de concluant.

Je poste directement mon code (au passage me dire ce qu'il ne va pas):

<?php
    class ArticlesController extends AppController{

        public function index(){
            $d'articles'] = $this->Article->find('all');
            $d'title_for_layout'] = 'Home';
            $this->set($d);
        }
        public function show($id = null, $slug = null){
            $d'article'] = $this->Article->find('first', array(
                'conditions' => array('Article.id' => $id)
            ));
            if(isset($this->params'pass'][1]) && isset($this->params'pass'][0])){
                if($this->params'pass'][1].'-'.$this->params'pass'][0] == $d'article']'Article']'slug'].'-'.$d'article']'Article']'id']){
                    $this->set($d);
                }
                else{
                    $this->redirect('/');
                }
            }
            else{
                $this->redirect('/');
            }
        }
?>

<?php
    class Article extends AppModel{
        public function afterFind($data){
            foreach ($data as $k => $d) {
                if(isset($d'Article']'slug']) && isset($d'Article']'id'])){
                    $d'Article']'link'] = array(
                        'controller' => 'articles',
                        'action' => 'show',
                        'id' => $d'Article']'id'],
                        'slug' => $d'Article']'slug']
                    );
                }

                $data$k] = $d;
            }
            return $data;
        }
    }
?>

Je souhaite, lorsque mon url ne correspond pas au bon Slug, mais au bon ID, rediriger vers la même page afin de corriger l'url.

Par exemple:

http://localhost/site/lorePOAZLSm-ipsum-1 => http://localhost/site/lorem-ipsum-1

Le problème c'est qu'il faut (à mon avis), un moyen pour faire passer mes variables $slug et $id lors de la redirection.
Mais je ne trouve aucun moyen.

J'espère que c'est clair ^^
Merci.

8 réponses


elscorto
Réponse acceptée

Salut Graf l'a fait dans ses tutos,

Dans ta méthode show, tu récupères l'article avec l'id comme tu as fait, puis tu compare le slug en url à celui récupéré, si il est différent tu fais un redirect vers ton action mais avec le bon slug

if($slug != $d'article']'Article']'slug'])
    $this->redirect(array('controller'=>'articles','action'=>'show','id'=>$id,'slug'=>$d'article']'Article']'slug']));

Avec ça, ça devrai fonctionner

thib-17
Auteur

Merci bien !
Il est vrai qu'il faut que je finisse de regarder ses tutos, j'en apprendrais plus et plus rapidement qu'en utilisant la doc :)

Maintenant tout fonctionne comme je veux, mis a part un petit truc assez génant.
Si j'ai une url du type /localhost/site/lorem-ipsum-1 et que j'enlève l'id, J'ai un Missing Controller.
J'ai essayer de faire un condition si mon

$id == null

mais ça ne marche pas !

je te rassure moi aussi, pas eu le temps de regarder, mais je pense que ça vient de la route en fait,

Dans ta route, il y a l'id, si il n'y est plus, celle ci n'est plus prise en compte et cake ne sait pas qui appeler, peut être en checkant au niveau de l'appController au niveau du beforeFilter, si tel controller et pas l'id alors 404 ou redirect.

De tête, un truc du genre

if($this->controller == 'articles'&& empty($this->request->params'id']))
    $this->redirect('/');

à tester...

thib-17
Auteur

Alors j'ai essayer, mais ça ne marche pas. Je pense que c'est a cause du

if($this->controller == 'articles'

En effet lorsque il n'y a pas d'id dans l'url, cakephp essaye de me rediriger vers le controller qui aurai pour nom 'l'url'.

essaye plutôt avec $this->request->controller, je t'avais prévenu de tête lol

thib-17
Auteur

Comme je le disais plus haut, ce système ne peux pas marcher. Lorsque l'on enlève l'id de l'url, cakePhp crois que je fait appel à un nouveau controller, donc le $this->request->controller = "articles" ne peux pas marcher.

ouais exact bien vue, bon ben dans ce cas là, cake utilise une page spéciale en cas de controller inexistant, il te faut juste faire ressembler cette page à ta page 404 qui en soit est plutôt logique, page introuvable.

Je sais pas si il y a moyen de récupérer une erreur de ce style au niveau l'app controller, je t'avoue que je ne me suis jamais penché sur ce style d'erreur et que je ne sais pas trop, peut être que Graf ou les autres ont une méthode bien à eux

Tien je viens de trouver un topic interessant. L'idée est de surcharger l'appError de cake