Bonjour, j'ai développé un petit framework PHP maison à base du tutoriel créer un site de A à Z.

J'ai crée un système flash mais j'ai un probleme, tout dabord voici les bouts de codes necessaire à la compréhension :

L'action inscription du controlleur Auth

/**
    *@return affiche un formulaire d'inscription en cas de requete GET
    *@return insert un nouveau usagé apres vérification courante des données saisies
    **/
    public function inscription(){
        $this->helpers(array('Form'));
        $this->layout = 'main';

        if($this->request->is('POST')){
            debug($this->request->data);
            //debug($_SESSION);
            //debug($_SERVER);
            $this->loadModel('User');
            $check_user = $this->User->find(array(
                                        'where' => array(
                                            'use_login' => $this->request->data'use_login'])));
            if(!empty($check_user)){
                $this->session->setFlash('Ce pseudo est déjà pris !');
                $this->redirect($this->referer);
            }else{
                debug($check_user);
                if($this->User->save($this->request->data)){
                    $this->session->setFlash('Inscription completed !');
                    $this->redirect('blog/index');
                }else{
                    $this->redirect($this->referer);
                }
            }
        }elseif($this->request->is('GET')){
            $this->render('inscription');
        }

    }

La class session

<?php
class Session{

    public function __construct(){
        return session_start();
    }
    public function set($attr, $value){
        $_SESSION$attr] = $value;
    }
    /**
    *@param $message le message flash a afficher
    **/
    public function setFlash($message){
        $this->set('flash', $message);
    }
}

La fonction flash que j'appelle dans un layout

/**
    *@return $_SESSION'flash'], le message flash dans la vue
    **/
    public function flash(){
        if(!empty($_SESSION'flash'])){
            echo $_SESSION'flash'];
        }
        $_SESSION'flash'] ='';
    }
//quand la fonction est passé à ma vue ca n'écrit pas la valeur de echo $_SESSION'flash'] est vide on dirait que la derniere ligne est pris en compte avant l'appel à la fonction echo

et mon layout main.php

<!DOCTYPE>
<html>
<head>
    <meta charset="UTF-8">
    <title>Métro Arts et Métiers</title>
    <?php echo $this->link('css', 'layout'); ?>
    <?php echo $this->link('javascript', 'modernizer'); ?>
    <?php echo $this->link('javascript', 'jquery'); ?>
    <?php echo $this->link('javascript', 'style'); ?>
</head>
<body>
    <?php echo $this->flash(); ?>
    <?php $data'pages'] = $this->layoutLoad('Blog', 'page'); ?>
    <?php debug( $data'pages']); ?>
    <?php echo $content_for_layout; ?>

<aside>
    <div>
        <a href="<?php echo BASE_URL.'/auth/inscription'; ?>">Inscription</a><a href="<?php echo BASE_URL.'/auth/connexion'; ?>">Connexion</a>
    </div>

    <?php $data'categories'] = $this->layoutLoad('Blog', 'listCat'); ?>
    <?php debug($data'categories']); ?>
</aside>
</body>
</html>

Mon probleme c'est que <?php echo $this->flash(); ?> retourne rien la session flash est vidé avant l'appel de echo ... c'est bizare.

3 réponses


Tackacoder
Réponse acceptée

Bonjour,
je crois que c'est à cause du redirect(). En gros tu remplis ta session, tu l'echo, tu la vides et tu redirect, donc rien ne s'affiche.
Moi j'avais réussi en mettant un die() dans ma fonction redirect().

tapesec
Auteur

Oui je viens effectivement de trouver c'est à cause du redirect. Du coup ce que j'ai fais, c'est que j'ai définis layout = ''; comme ça la méthode $this->flash n'est pas appelé avant la destination finale.

Bon cette façon de faire est quand même dégueulasse je trouve.. plus tard il faudra que je revienne dessus d'autant que je me demande comment fait notre maitre le raton dans ce cas là. J'ai pas regardé la série de tuto en entier j'ai fais que les 2 premiers et j'avance tout seul sur le reste pour me forcer à cogiter d'autant que j'ai bien compris que c'est de la copie du principe de cake php que je connais bien.

Merci en tous cas :)

Je suis en retard mais j'ai trop galéré dessus donc je poste la solution de notre maitre **Raton*****

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