Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2010, 16h09   #1
Membre à l'essai
 
Inscription : mars 2006
Messages : 70
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 70
Points : 22
Points : 22
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 :
$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 :
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 :
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
basket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 17h26   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
dans le template c'est plutôt

Code :
echo $this->var['attribut'];
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 17h44   #3
Membre à l'essai
 
Inscription : mars 2006
Messages : 70
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 70
Points : 22
Points : 22
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 :
Notice: Undefined property: View::$var in ...\vue.php on line 18
basket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 17h47   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
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 :
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

__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 18h23   #5
Membre à l'essai
 
Inscription : mars 2006
Messages : 70
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 70
Points : 22
Points : 22
Je mets ici le code de la classe Response dans laquelle on trouve la fonction addVar() :

Code :
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.
basket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 18h36   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2010, 01h13   #7
Membre à l'essai
 
Inscription : mars 2006
Messages : 70
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 70
Points : 22
Points : 22
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.
basket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2010, 00h40   #8
Membre à l'essai
 
Inscription : mars 2006
Messages : 70
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 70
Points : 22
Points : 22
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...
basket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h19.


 
 
 
 
Partenaires

Hébergement Web