Bonjour à tous,

voilà, j'ai remarqué qu'il y avait un petit problème, sur certaines actions on fait un $this->Session->setFlash() et puis un $this->redirect() le message s'affiche après le redirect uniquement si la vue n'existe pas par exemple delete() mais pour les vues qui existent du style insert() le message défini dans $this->Session->setFlash() n'apparait pas (après redirect), vu qu'il a été affiché sur la page insert avant de faire $this->redirect() , donc je sais quel est le problème, mais comment gérer ça de manière propre ? (Dans la philosophie du MVC)

Dans l'attente d'une réponse,
Merci de votre compréhension.

8 réponses


Empty
Auteur
Réponse acceptée

Voilà j'ai trouvé, dans Controller.php j'ai mis

public redirect = false;

Toujours dans Controller.php dans la méthode render($view)

if($this->redirect === false) {
    require $view;
    $content_for_layout = ob_get_clean();
    require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';
    $this->rendered = true;
}

Et toujours dans Controller.php dans la méthode redirect($url, $code = null)

function redirect($url, $code = null) {
    $this->redirect = true;
    if($code == 301) {
        header("HTTP/1.1 301 Moved Permanently");
    }
    header("Location: ".Router::url($url));
}

Voilà au plaisir de pouvoir aider les personnes qui auraient le même problème :)

powange
Réponse acceptée

il y a mieux!
suffit juste après la demande de redirection d’arrêter le lancement du reste du script.

/**
    * Redirect
    **/
    public function redirect($url,$code = null ){
        if($code == 301){
            header("HTTP/1.1 301 Moved Permanently");
        }
        header("Location: ".Router::url($url)); 
        die();
    }

Il faut empecher le script de continuer si un redirect a été demandé.

Empty
Auteur

J'essaye de comprendre l'architecture du MVC, j'ai réussi à comprendre pas mal de trucs, mais il reste encore quelques zones d'ombres que je devrais éclaircir normalement par moi-même, je m'étais bien dit qu'il fallait arrêter le script pour ne pas qu'il inclut le view mais ce n'est pas clair dans la tête, j'essaye d'y regarder ce soir, si c'était une solution assez simple au niveau du script, j'aurai aimé savoir comment le faire dans la philosophie du MVC...

Pour moi, je crée une variable publique à false, si on appelle un redirect, je mets cette variable à true, et au niveau du chargement du view, je ne le charge pas si la variable est à true (en gros), est-ce une bonne manière de faire ?

Empty
Auteur

As-tu testé ? Je n'ai pas encore regardé tout en détails au niveau des ordres d'affichage, j'y avait pensé au die, mais j'ai pas testé ^^ j'aime pas trop l'utiliser en dehors des tests, mais si ça le fait c'est vrai que c'est plus simple à mettre en place :P

En y pensant, les header() sont obligé de se trouver en 1er, donc ça doit le faire, merci ;) je testerai :) et je validerai la réponse si ça le fait :D

Ben moi j'avais le même problème que toi mes sessions se vidait et les messages ne s'affichait pas et avec le die() ça fonctionne merci car je trouvais pas ce qui clochait

Merci j'avais posté ailleurs sur le forum mais obtenu aucune réponse ! Je vous remercie tous et plus particulièrement djtec qui m'a averti de l'existence de cette solution !

et ca marche parfaitement avec le die();
Encore Merci