IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO][MVC] envoyer des objets à la vue


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Points : 53
    Points
    53
    Par défaut [POO][MVC] envoyer des objets à la vue
    Bonjour,

    J'ai laissé une question sur le Forum Conception/POO mais je ne suis pas certain d'y obtenir une réponse car ce forum n'est pas très actif, et parce qu'il y est question de la conception MVC/PHP d'une tuto adapté à mon projet.

    Je vais donc essayer de l'expliquer ici à nouveau.

    J'ai développé un site Internet en me basant sur le tuto de Julien Pauli. J'ai du me battre pas mal car les concepts sont un peu survolés, mais bon, c'est quand même une bonne base de départ.

    On peut y remarquer que les variables sont envoyées à la vue sous la forme d'array qui sont ajoutées à un objet Response sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->_response->addVar('var', $array);
    où $this->_response est mon instance d'objet Response dans mon contrôleur d'action,
    $var est la variable qui sera utilisée dans le fichier vue.php sous la forme
    et $array la variable de type array() à afficher, par exemple une occurrence d'une table récupérée par PDO. Eh oui, ici, je ne récupère que des array() avec PDO, comme sur le tuto, puisque je ne peux afficher que ça.

    Le but de cette question est le suivant.

    J'ai pu remarquer, dans des exemples sur le net ou sur ce site, l'utilisation de la syntaxe suivante pour l'affichage :
    or, avec le système que j'utilise, je ne peux qu'utiliser :
    puisque je n'ai que des array à manipuler.

    Comment donc, envoyer à ma vue, des objets ? si tant est que c'est la bonne question.
    Quels sont les changements à effectuer ? où ? comment ?


    Je rappelle ici quelques bouts de code qui sont utilisés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    class View {
     
    	public function render($file, $assigns = array()) {
    		extract($assigns);
    		ob_start();
    		require($file);
    		$str = ob_get_contents();
    		ob_end_clean();
    		return $str;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Controller_Action {
    ...
     
    ...
    public function render($file) {
    		$this->_response->addVar('config', $_SESSION['config']);
    		$this->_response->addVar('login', $_SESSION['login']);
    		$this->_response->addVar('message', $this->_response->getMessage());
     
    		$view = new View();
    		$this->_response->setBody($view->render(VIEWS . '/' .$file, $this->_response->getVars()));
    	}
    Je n'en met pas plus, mais je peux le faire sur demande.

    D'avance merci

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    dans le template c'est plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $this->var['attribut'];

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Points : 53
    Points
    53
    Par défaut
    Bonsoir,

    Remarque intéressante, car je ne suis pas certain d'utiliser un système de template (autrement dit, je pense que non).
    Et de fait, lorsque j'écris j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Notice: Undefined property: View::$var in ...\vue.php on line 18

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par basket Voir le message
    Bonsoir,

    Remarque intéressante, car je ne suis pas certain d'utiliser un système de template (autrement dit, je pense que non).
    Et de fait, lorsque j'écris j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Notice: Undefined property: View::$var in ...\vue.php on line 18

    ton vue.php c'est ton tamplate

    ou est definie addVar ?


    dans render c'est plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function render($file)
    { 
        $view = new View();
        $view->config =  $_SESSION['config'];
        $view->login= $_SESSION['login'];
        $view->message= $this->_response->getMessage();
    }
    et ensuite tu pourras faire


  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Points : 53
    Points
    53
    Par défaut
    Je mets ici le code de la classe Response dans laquelle on trouve la fonction addVar() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    <?php
    class Response {
     
    	private $_vars = array();
    	private $_headers = array();
    	private $_body;
    	private $_redirect;
    	private $_message;
    	private $_profil;
     
    	public function getProfil() {
    		return $this->_profil;
    	}
     
    	public function setProfil($profil) {
    		$this->_profil = $profil;
    	}
     
    	public function addVar($key, $value) {
    		$this->_vars[$key] = $value;
    	}
     
    	public function getVar($key) {
    		if(isset($this->_vars[$key])) {
    			return $this->_vars[$key];
    		} else {
    			return '';
    		}
    	}
     
    	public function getVars() {
    		return $this->_vars;
    	}
     
    	public function setBody($value) {
    		$this->_body = $value;
    	}
     
    	public function setMessage($msg) {
    		$this->_message = $msg;
    	}
     
    	public function getMessage() {
    		return $this->_message;
    	}
     
    	/**
    	 *
    	 * @param <string> $value $value vaut 0 ou 1
    	 * non = non redirigé
    	 * oui = redirigé
    	 */
    	public function setRediriger($value) {
    		$this->_redirect = $value;
    	}
     
    	public function getRediriger() {
    		return $this->_redirect;
    	}
     
    	public function redirect($url, $permanent = false) {
    		if ($permanent) {
    			$this->_headers['Status'] = '301 Moved Permanently';
    		} else {
    			$this->_headers['Status'] = '302 Found';
    		}
    		$this->_redirect = 'oui';
    		$this->_headers['location'] = $url;
    	}
     
    	public function printOut() {
    		foreach ($this->_headers as $key => $value) {
    			header($key. ':' . $value);
    		}
    		echo $this->_body;
    	}
     
     
    }
    J'ai cru comprendre que l'avantage de passer par addVar(), getVars() était de pouvoir gérer les noms de variables sans avoir à les connaitre au moment du render, puisque tout est transporté par l'objet Response.

    Mais s'il y a une façon de les transporter et de les récupérer sous forme d'objet, alors je suis preneur.

    D'avance merci pour votre aide.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    mais le problème c'est que, quand tu vois

    enfaite c'est

    ca sera donc pour toi

    et c'est pas pareil :
    http://framework.zend.com/manual/fr/...elpers.initial

  7. #7
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Points : 53
    Points
    53
    Par défaut
    ok, j'abandonne.

    Je commence à comprendre : j'avais vu cette syntaxe sur des scripts qui mélangeaient la POO pour la gestion des classes mais sans implémentation de MVC. Je crois que dans ce cas, l'objet à afficher était directement disponible car instancié dans le fichier .php qui gérait tout (connexion base, gestion objets et affichage).

    Je pensais faire pareil mais ça ne parait pas possible.

    stealth35, merci quand même pour ton aide.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Points : 53
    Points
    53
    Par défaut
    Bonjour à tous,

    Eh non, je n'avais pas abandonné... et j'ai trouvé !

    En fait, ça aurait dû fonctionner dès le départ avec mon code, sauf que j'ai dû faire une erreur qqpart. Je crois qu'avoir voulu tester une nouvelle syntaxe sur du code existant sans pour autant le faire planter complètement, j'ai mélangé les variables anciennes et nouvelles.

    Il n'en reste pas moins qu'à force de vouloir comprendre le fonctionnement de mon code, j'ai réussi
    1 : à voir où était l'erreur,
    2 : mais surtout à découvrir de nouvelles choses ! ce qui me réjouit toujours.

    Merci encore, et à la prochaine question...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. envoyer des messages à la vue
    Par figatelliSTI dans le forum Zend Framework
    Réponses: 5
    Dernier message: 15/04/2008, 14h46
  2. Envoyer des objets par valeur
    Par Promeneur dans le forum Windows Communication Foundation
    Réponses: 7
    Dernier message: 28/03/2008, 17h45
  3. Réponses: 2
    Dernier message: 19/09/2007, 10h21
  4. [POO] Listing avec des objets
    Par estampille dans le forum Langage
    Réponses: 5
    Dernier message: 27/08/2007, 16h19
  5. [POO] MVC : Gestion des "pages"
    Par Dinan dans le forum Langage
    Réponses: 4
    Dernier message: 18/02/2007, 19h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo