Variables introuvables apres un extract()

Par negreen, il y a 12 ans


j'ai cette class qui me pose un petit problem

<?php
    /**
    * Index Controller
    */
    class Index extends Controller{
        public $_content = array();
        function __construct(){
            parent::__construct();
            $this->_content"title"] = array("title" => "Welcome to Project");
            $this->_content"description"] = "We provide you the best IT service.";
            $this->vars = $this->_content;
            extract($this->vars);
            $this->render('index');
        }
        /*
        *sample action of signing up
        */
    }
?>

la variable $vars a ete declaree dans Controller comme ceci :

protected $vars = array();

Le probleme est que j'essaye d'acceder aux variable dans ma vue comme ceci et ca me di que la variable title est introuvable:

<?php print $title ?>

2 réponses

MrGuillou, il y a 12 ans

Bonjour,
Je ne sais pas si tu utilises un framework grand public ou un truc perso, mais c'est bizarre. Normalement tu dois avoir une méthode pour envoyer les variables à la vue. La c'est normal que la vue ne trouve pas les variables, car elles sont cloisonnées dans la méthode __construct.

Cordialement,

negreen, il y a 12 ans

Je crois que j'ai retrouvé le problème

la fonction render($view); a ete declare dans le controller parent, et c'est la aussi que la variable $vars a ete aussi declarer. C'est dans la function render() qu'on fait l'inclusion de la vue, donc c'est la il faut extraire nos variables avec extract() avant d'inclure la vue; ET dans les controllers de pages, je n'ai plus qu'a juste initialiser la variable $vars avant l'appel de la function render();

cequi me donnerait un render suivant:

function render($view){
            $file = ROOT.DS."views/".$view.DS.$view.".php";
            extract($this->vars);
            if(file_exists($file)){
                ob_start();
                require_once $file;
                $template_content = ob_get_clean();
                require_once ROOT.DS."views".DS."layouts".DS.$this->_layout.".php";
            }else{
                print "404: la vue n'exist pas";
            }
        }

Et dans mes controller de page je pourrais appler render de cette maniere :

function __construct(){
            parent::__construct();
            $this->vars"title"] = "Welcome to my web site";
            $this->vars"description"] = "We offer you the best IT tutorials on GraphicArt.fr";
            $this->render('index');
        }

ET dans mes vues je peux acceder a ces variables comme suit:

<?php print $title; ?>

C'est pour cette simplicite d'utilisation des variables que j'ai fait usage de la fonction extract() voir Function extract()

OU COMME SUIT :

<?php print $this->vars'title']; ?>

En fait si j'ai choisie la methode d'extraction c'est parce que j'avais l'intention d'utiliser le racourci de la function echo() dans mes vues comme suit:

<?= print $title; ?>

La ca m'eviterais d'avoir trop de print() ou echo().

Merci a vous pour votre participation.