Subversion Repositories eFlore/Applications.coel

Rev

Rev 1528 | Rev 1577 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1528 Rev 1536
1
<?php
1
<?php
2
/** Paramêtres indiquant que l'on est en français pour permettre l'affichage des dates en français. */
2
/** Paramêtres indiquant que l'on est en français pour permettre l'affichage des dates en français. */
3
setlocale(LC_TIME, 'fr_FR.UTF-8');
3
setlocale(LC_TIME, 'fr_FR.UTF-8');
4
/**
4
/**
5
 * Classe mère abstraite contenant les méthodes génériques des services.
5
 * Classe mère abstraite contenant les méthodes génériques des services.
6
 * Encodage en entrée : utf8
6
 * Encodage en entrée : utf8
7
 * Encodage en sortie : utf8
7
 * Encodage en sortie : utf8
8
 * 
8
 * 
9
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
11
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
11
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
12
 * @version $Id$
12
 * @version $Id$
13
 * @copyright 2009
13
 * @copyright 2009
14
 */
14
 */
15
abstract class Coel {
15
abstract class Coel {
16
	
16
	
17
	const ETAT_AJOUTER = 1;
17
	const ETAT_AJOUTER = 1;
18
	const ETAT_MODIFIER = 2;
18
	const ETAT_MODIFIER = 2;
19
	const ETAT_SUPPRIMER = 3;
19
	const ETAT_SUPPRIMER = 3;
20
	
20
	
21
	protected $sessionName = 'CoelSession';
21
	protected $sessionName = 'CoelSession';
22
	protected $sessionExpireTime = 8640000;// 60*60*24*100 = 100 jours
22
	protected $sessionExpireTime = 8640000;// 60*60*24*100 = 100 jours
23
	protected static $cookieChemin = '';
23
	protected static $cookieChemin = '';
24
	public $config;
24
	public $config;
25
	protected $bdd;
25
	protected $bdd;
26
	protected $log = array();
26
	protected $log = array();
27
	protected $messages = array();
27
	protected $messages = array();
28
	protected $debug = array();
28
	protected $debug = array();
29
	protected $distinct = false;
29
	protected $distinct = false;
30
	protected $orderby = null;
30
	protected $orderby = null;
31
	protected $formatRetour = 'objet';
31
	protected $formatRetour = 'objet';
32
	protected $start = 0; 
32
	protected $start = 0; 
33
	protected $limit = 150;
33
	protected $limit = 150;
34
	
34
	
35
	public function __construct($config, $demarrer_session = true) {
35
	public function __construct($config, $demarrer_session = true) {
36
		// Tableau contenant la config de Jrest
36
		// Tableau contenant la config de Jrest
37
		$this->config = $config;
37
		$this->config = $config;
38
		
38
		
39
		// Connection à la base de données
39
		// Connection à la base de données
40
		$this->bdd = $this->connecterPDO($this->config, 'coel');
40
		$this->bdd = $this->connecterPDO($this->config, 'coel');
41
		
41
		
42
		$this->gererSession($demarrer_session);
42
		$this->gererSession($demarrer_session);
43
		$this->gererIdentificationPermanente();
43
		$this->gererIdentificationPermanente();
44
		
44
		
45
		// Nettoyage du $_GET (sécurité)
45
		// Nettoyage du $_GET (sécurité)
46
		if (isset($_GET)) {
46
		if (isset($_GET)) {
47
			$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
47
			$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
48
			foreach ($get_params as $get) {
48
			foreach ($get_params as $get) {
49
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
49
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
50
				$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
50
				$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
51
				if (isset($_GET[$get]) && $_GET[$get] != '') {
51
				if (isset($_GET[$get]) && $_GET[$get] != '') {
52
					$this->$get = $_GET[$get];
52
					$this->$get = $_GET[$get];
53
				} else {
53
				} else {
54
					$_GET[$get] = null;
54
					$_GET[$get] = null;
55
				}
55
				}
56
			}
56
			}
57
		}
57
		}
58
	}
58
	}
59
 
59
 
60
	/**
60
	/**
61
	 * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
61
	 * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
62
	 */
62
	 */
63
	public function getRessource() {
63
	public function getRessource() {
64
		$this->getElement(array());
64
		$this->getElement(array());
65
	}
65
	}
66
	
66
	
67
	
67
	
68
	protected function creerXmlHisto($donnees) {
68
	protected function creerXmlHisto($donnees) {
69
		// Création du xml de l'enregistrement à historiser
69
		// Création du xml de l'enregistrement à historiser
70
		$info = null;
70
		$info = null;
71
		$xml_tpl = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<resultset>\n<row>\n%s</row>\n</resultset>";
71
		$xml_tpl = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<resultset>\n<row>\n%s</row>\n</resultset>";
72
		$xml = null;
72
		$xml = null;
73
		 
73
		 
74
		foreach ($donnees as $cle => $valeur) {
74
		foreach ($donnees as $cle => $valeur) {
75
			if (!is_null($valeur) && $valeur != '') {
75
			if (!is_null($valeur) && $valeur != '') {
76
				$xml .= "<$cle>$valeur</$cle>\n";
76
				$xml .= "<$cle>$valeur</$cle>\n";
77
			}
77
			}
78
		}
78
		}
79
		if ($xml !== null) {
79
		if ($xml !== null) {
80
			$info = sprintf($xml_tpl, $xml);
80
			$info = sprintf($xml_tpl, $xml);
81
			$info = $this->bdd->quote($info);
81
			$info = $this->bdd->quote($info);
82
		}
82
		}
83
		
83
		
84
		return $info;
84
		return $info;
85
	}
85
	}
86
	
86
	
87
	protected function getTableauDepuisXmlHisto($xml) {
87
	protected function getTableauDepuisXmlHisto($xml) {
88
		// Création du xml de l'enregistrement à historiser
88
		// Création du xml de l'enregistrement à historiser
89
		$info = array();
89
		$info = array();
90
		
90
		
91
		if (!empty($xml) && preg_match_all('|<([^>]+)>(.*)</[^>]+>|U', $xml, $matches, PREG_SET_ORDER)) {
91
		if (!empty($xml) && preg_match_all('|<([^>]+)>(.*)</[^>]+>|U', $xml, $matches, PREG_SET_ORDER)) {
92
			foreach ($matches as $val) {
92
			foreach ($matches as $val) {
93
				$info[$val[1]] = $val[2];
93
				$info[$val[1]] = $val[2];
94
			}
94
			}
95
		}
95
		}
96
		
96
		
97
		return $info;
97
		return $info;
98
	}
98
	}
99
		
99
		
100
	protected function historiser($table_id, $ligne_cle, $info, $id_utilisateur, $etat, $id_session) {
100
	protected function historiser($table_id, $ligne_cle, $info, $id_utilisateur, $etat, $id_session) {
101
		// Pré-traitement des variables
101
		// Pré-traitement des variables
102
		$info = (is_null($info)) ? 'NULL' : $info;
102
		$info = (is_null($info)) ? 'NULL' : $info;
103
		
103
		
104
		// Historisation (Ajout des méta-données)
104
		// Historisation (Ajout des méta-données)
105
		$requete = 	'INSERT INTO coel_meta_historique_ligne '. 
105
		$requete = 	'INSERT INTO coel_meta_historique_ligne '. 
106
					'	(cmhl_ce_table, cmhl_cle_ligne, cmhl_enregistrement, cmhl_date_modification, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, cmhl_session_id) '.
106
					'	(cmhl_ce_table, cmhl_cle_ligne, cmhl_enregistrement, cmhl_date_modification, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, cmhl_session_id) '.
107
					'VALUES ('.
107
					'VALUES ('.
108
					"		$table_id, ".
108
					"		$table_id, ".
109
					'		"'.$ligne_cle.'", '.
109
					'		"'.$ligne_cle.'", '.
110
					"		$info, ".
110
					"		$info, ".
111
 					'		"'.date('Y-m-d H:i:s', time()).'", '.
111
 					'		"'.date('Y-m-d H:i:s', time()).'", '.
112
					"		$id_utilisateur, ".
112
					"		$id_utilisateur, ".
113
					"		$etat, ".
113
					"		$etat, ".
114
					'		"'.$_SERVER['REMOTE_ADDR'].'", '.
114
					'		"'.$_SERVER['REMOTE_ADDR'].'", '.
115
					'		"'.$id_session.'") ';
115
					'		"'.$id_session.'") ';
116
		
116
		
117
   		// Exécution de la requêtre SQL et test d'éventuelles erreurs
117
   		// Exécution de la requêtre SQL et test d'éventuelles erreurs
118
		$resultat = $this->bdd->exec($requete);
118
		$resultat = $this->bdd->exec($requete);
119
		if ($resultat === false ) {
119
		if ($resultat === false ) {
120
			$this->log[] = "Des données de la table '$table_id' (enrg. $ligne_cle) n'ont pas été historisées car la requête a échouée.";
120
			$this->log[] = "Des données de la table '$table_id' (enrg. $ligne_cle) n'ont pas été historisées car la requête a échouée.";
121
		}
121
		}
122
		return $this->bdd->lastInsertId();
122
		return $this->bdd->lastInsertId();
123
	}
123
	}
124
	
124
	
125
	protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
125
	protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
126
		// Traitements des messages d'erreurs et données
126
		// Traitements des messages d'erreurs et données
127
		if (count($this->messages) != 0) {
127
		if (count($this->messages) != 0) {
128
			header('HTTP/1.1 500 Internal Server Error');
128
			header('HTTP/1.1 500 Internal Server Error');
129
			$mime = 'text/html';
129
			$mime = 'text/html';
130
			$encodage = 'utf-8';
130
			$encodage = 'utf-8';
131
			$json = true;
131
			$json = true;
132
			$sortie = $this->messages;
132
			$sortie = $this->messages;
133
		} else {
133
		} else {
134
			$sortie = $donnees;
134
			$sortie = $donnees;
135
			if (is_null($donnees)) {
135
			if (is_null($donnees)) {
136
				$sortie = 'OK';
136
				$sortie = 'OK';
137
			}
137
			}
138
		}
138
		}
139
 
139
 
140
		// Gestion de l'envoie du déboguage
140
		// Gestion de l'envoie du déboguage
141
		$this->envoyerDebogage();
141
		$this->envoyerDebogage();
142
		
142
		
143
		// Encodage au format et JSON et envoie sur la sortie standard
143
		// Encodage au format et JSON et envoie sur la sortie standard
144
		$contenu = $json ? json_encode($sortie) : $sortie;
144
		$contenu = $json ? json_encode($sortie) : $sortie;
145
		$this->envoyerContenu($encodage, $mime, $contenu);
145
		$this->envoyerContenu($encodage, $mime, $contenu);
146
	}
146
	}
147
	
147
	
148
	protected function envoyerHTML($donnees = null) {
148
	protected function envoyerHTML($donnees = null) {
149
		// Traitements des messages d'erreurs et données
149
		// Traitements des messages d'erreurs et données
150
		$contenu = '';
150
		$contenu = '';
151
		if (count($this->messages) > 0) {
151
		if (count($this->messages) > 0) {
152
			$contenu = '<p>'.implode('<br />', $this->messages).'</p>';
152
			$contenu = '<p>'.implode('<br />', $this->messages).'</p>';
153
		} else {
153
		} else {
154
			$contenu = $donnees;
154
			$contenu = $donnees;
155
			if (is_null($donnees)) {
155
			if (is_null($donnees)) {
156
				$contenu = 'OK';
156
				$contenu = 'OK';
157
			}
157
			}
158
		}
158
		}
159
 
159
 
160
		// Gestion de l'envoie du déboguage
160
		// Gestion de l'envoie du déboguage
161
		$this->envoyerDebogage();
161
		$this->envoyerDebogage();
162
		
162
		
163
		// Envoie sur la sortie standard
163
		// Envoie sur la sortie standard
164
		$this->envoyerContenu($encodage, $mime, $contenu);
164
		$this->envoyerContenu($encodage, $mime, $contenu);
165
	}
165
	}
166
	
166
	
167
	protected function envoyerEnteteMessage() {
167
	protected function envoyerEnteteMessage() {
168
		if (!is_array($this->messages)) {
168
		if (!is_array($this->messages)) {
169
			$this->messages[] = $this->messages;
169
			$this->messages[] = $this->messages;
170
		}
170
		}
171
		if (count($this->messages) != 0) {
171
		if (count($this->messages) != 0) {
172
			foreach ($this->messages as $cle => $val) {
172
			foreach ($this->messages as $cle => $val) {
173
				if (is_array($val)) {
173
				if (is_array($val)) {
174
					$this->messages[$cle] = print_r($val, true);
174
					$this->messages[$cle] = print_r($val, true);
175
				}
175
				}
176
			}
176
			}
177
			header('X-MessageJrest-Data: '.json_encode($this->messages));
177
			header('X-MessageJrest-Data: '.json_encode($this->messages));
178
		}
178
		}
179
	}
179
	}
180
 
180
 
181
	protected function envoyerDebogage() {
181
	protected function envoyerDebogage() {
182
		$this->envoyerEnteteDebogage();
182
		$this->envoyerEnteteDebogage();
183
	}
183
	}
184
	
184
	
185
	protected function envoyerEnteteDebogage() {
185
	protected function envoyerEnteteDebogage() {
186
		if (!is_array($this->debug)) {
186
		if (!is_array($this->debug)) {
187
			$this->debug[] = $this->debug;
187
			$this->debug[] = $this->debug;
188
		}
188
		}
189
		if (count($this->debug) != 0) {
189
		if (count($this->debug) != 0) {
190
			foreach ($this->debug as $cle => $val) {
190
			foreach ($this->debug as $cle => $val) {
191
				if (is_array($val)) {
191
				if (is_array($val)) {
192
					$this->debug[$cle] = print_r($val, true);
192
					$this->debug[$cle] = print_r($val, true);
193
				}
193
				}
194
			}
194
			}
195
			header('X-DebugJrest-Data: '.json_encode($this->debug));
195
			header('X-DebugJrest-Data: '.json_encode($this->debug));
196
		}
196
		}
197
	}
197
	}
198
	
198
	
199
	protected function envoyerContenu($encodage, $mime, $contenu) {
199
	protected function envoyerContenu($encodage, $mime, $contenu) {
200
		header("Content-Type: $mime; charset=$encodage");
200
		header("Content-Type: $mime; charset=$encodage");
201
		print $contenu;
201
		print $contenu;
202
	}
202
	}
203
	
203
	
204
	private function connecterPDO($config, $base = 'database') {
204
	private function connecterPDO($config, $base = 'database') {
205
        $cfg = $config[$base];
205
        $cfg = $config[$base];
206
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
206
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
207
		try {
207
		try {
208
    		$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
208
    		$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
209
		} catch (PDOException $e) {
209
		} catch (PDOException $e) {
210
    		echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
210
    		echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
211
		}
211
		}
212
		// Passe en UTF-8 la connexion à la BDD
212
		// Passe en UTF-8 la connexion à la BDD
213
		$PDO->exec("SET NAMES 'utf8'");
213
		$PDO->exec("SET NAMES 'utf8'");
214
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
214
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
215
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
215
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
216
        return $PDO;
216
        return $PDO;
217
	}
217
	}
218
	
218
	
219
	protected function getTxt($id) {
219
	protected function getTxt($id) {
220
		$sortie = '';
220
		$sortie = '';
221
		switch ($id) {
221
		switch ($id) {
222
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
222
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
-
 
223
			case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
223
			default : $sortie = $id; 
224
			default : $sortie = $id; 
224
		}
225
		}
225
		return $sortie;
226
		return $sortie;
226
	}
227
	}
227
	
228
	
228
	protected function concatenerChamps($champs, $prefixe = null) {
229
	protected function concatenerChamps($champs, $prefixe = null) {
229
		$chaine = '';
230
		$chaine = '';
230
		foreach ($champs as $cle => $valeur) {
231
		foreach ($champs as $cle => $valeur) {
231
			if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
232
			if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
232
				$chaine .= ", $cle = $valeur";
233
				$chaine .= ", $cle = $valeur";
233
			}
234
			}
234
		}
235
		}
235
		return ltrim($chaine, ', ');
236
		return ltrim($chaine, ', ');
236
	}
237
	}
237
 
238
 
238
	protected function separerChampsValeurs($donnees, $prefixe = null) {
239
	protected function separerChampsValeurs($donnees, $prefixe = null) {
239
		$sortie = array('', '');
240
		$sortie = array('', '');
240
		// Concaténation des champs et des valeurs dans des chaines séparées
241
		// Concaténation des champs et des valeurs dans des chaines séparées
241
		foreach ($donnees as $cle => $valeur) {
242
		foreach ($donnees as $cle => $valeur) {
242
			if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
243
			if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
243
				$sortie[0] .= "$cle, ";
244
				$sortie[0] .= "$cle, ";
244
				$sortie[1] .= "$valeur, ";
245
				$sortie[1] .= "$valeur, ";
245
			}
246
			}
246
		}
247
		}
247
		// Suppression de la virgule finale
248
		// Suppression de la virgule finale
248
		$sortie[0] = rtrim($sortie[0], ', ');
249
		$sortie[0] = rtrim($sortie[0], ', ');
249
		$sortie[1] = rtrim($sortie[1], ', ');
250
		$sortie[1] = rtrim($sortie[1], ', ');
250
		return $sortie;
251
		return $sortie;
251
	}
252
	}
252
	
253
	
253
	
254
	
254
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
255
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
255
		$sortie = array();
256
		$sortie = array();
256
		foreach ($params_attendu as $num => $nom) {
257
		foreach ($params_attendu as $num => $nom) {
257
			if (isset($params[$num]) && $params[$num] != '*') {
258
			if (isset($params[$num]) && $params[$num] != '*') {
258
				if ($pourBDD) {
259
				if ($pourBDD) {
259
					$params[$num] = $this->bdd->quote($params[$num]);
260
					$params[$num] = $this->bdd->quote($params[$num]);
260
				}
261
				}
261
				$sortie[$nom] = $params[$num];
262
				$sortie[$nom] = $params[$num];
262
			}
263
			}
263
		}
264
		}
264
		return $sortie;
265
		return $sortie;
265
	}
266
	}
266
	
267
	
267
	protected function traiterBddClauseIn($chaine) {
268
	protected function traiterBddClauseIn($chaine) {
268
		$sortie = '';
269
		$sortie = '';
269
		$chaine = trim($chaine, " '");
270
		$chaine = trim($chaine, " '");
270
		if ($chaine != '') {
271
		if ($chaine != '') {
271
			$valeurs = explode(',', $chaine);
272
			$valeurs = explode(',', $chaine);
272
			foreach ($valeurs as $id => $valeur) {
273
			foreach ($valeurs as $id => $valeur) {
273
				$valeurs[$id] = $this->bdd->quote($valeur);
274
				$valeurs[$id] = $this->bdd->quote($valeur);
274
			}
275
			}
275
			$sortie = implode(',', $valeurs);
276
			$sortie = implode(',', $valeurs);
276
		}
277
		}
277
		return $sortie;
278
		return $sortie;
278
	}
279
	}
279
	
280
	
280
	protected function traiterParametresPost($params) {
281
	protected function traiterParametresPost($params) {
281
		$sortie = array();
282
		$sortie = array();
282
		foreach ($params as $cle => $valeur) {
283
		foreach ($params as $cle => $valeur) {
283
			$sortie[$cle] = $this->bdd->quote($valeur);
284
			$sortie[$cle] = $this->bdd->quote($valeur);
284
		}
285
		}
285
		return $sortie;
286
		return $sortie;
286
	}
287
	}
287
	
288
	
288
	protected function getIdentification(&$params) {
289
	protected function getIdentification(&$params) {
289
		// Initialisation des variables
290
		// Initialisation des variables
290
		$utilisateur = array(0, session_id());
291
		$utilisateur = array(0, session_id());
291
		
292
		
292
		// L'id utilisateur est soit passé par le POST soit dans l'url
293
		// L'id utilisateur est soit passé par le POST soit dans l'url
293
		if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) {
294
		if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) {
294
		   	$utilisateur[0] = $params['cmhl_ce_modifier_par'];
295
		   	$utilisateur[0] = $params['cmhl_ce_modifier_par'];
295
			unset($params['cmhl_ce_modifier_par']);
296
			unset($params['cmhl_ce_modifier_par']);
296
		} else if (is_string($params)) {
297
		} else if (is_string($params)) {
297
			$utilisateur[0] = $params;
298
			$utilisateur[0] = $params;
298
		}
299
		}
299
		
300
		
300
		return $utilisateur;
301
		return $utilisateur;
301
	}
302
	}
302
	
303
	
303
	protected function etreAutorise($id_utilisateur) {
304
	protected function etreAutorise($id_utilisateur) {
304
		$autorisation = false;
305
		$autorisation = false;
305
		if (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur) {    	  
306
		if (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur) {    	  
306
			$this->messages[] = 'Accès interdit.';
307
			$this->messages[] = 'Accès interdit.';
307
		} else if ($_SESSION['coel_utilisateur'] == '') {    	  
308
		} else if ($_SESSION['coel_utilisateur'] == '') {    	  
308
			$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.';
309
			$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.';
309
		} else {
310
		} else {
310
			$autorisation = true;
311
			$autorisation = true;
311
		}
312
		}
312
		return $autorisation;
313
		return $autorisation;
313
	}
314
	}
314
	
315
	
315
	protected function recupererCle($table) {
316
	protected function recupererCle($table) {
316
		$cle = null;
317
		$cle = null;
317
		if (isset($table['champs_valeurs_id'])) {
318
		if (isset($table['champs_valeurs_id'])) {
318
			$identifiants = array();
319
			$identifiants = array();
319
			// Trie des clés primaire pour avoir toujours le même ordre dans la table historique pour les clés multiples
320
			// Trie des clés primaire pour avoir toujours le même ordre dans la table historique pour les clés multiples
320
			ksort($table['champs_valeurs_id']);
321
			ksort($table['champs_valeurs_id']);
321
		   	foreach ($table['champs_valeurs_id'] as $id) {
322
		   	foreach ($table['champs_valeurs_id'] as $id) {
322
		   		$identifiants[] = $id;
323
		   		$identifiants[] = $id;
323
		   	}
324
		   	}
324
		   	$cle = implode('-', $identifiants);
325
		   	$cle = implode('-', $identifiants);
325
		}
326
		}
326
		return $cle;
327
		return $cle;
327
	}
328
	}
328
	
329
	
329
	protected function avoirCleComplete($table) {
330
	protected function avoirCleComplete($table) {
330
		$cle_complete = false;
331
		$cle_complete = false;
331
		if (isset($table['champs_valeurs_id'])) {
332
		if (isset($table['champs_valeurs_id'])) {
332
		   	$ok = true;
333
		   	$ok = true;
333
			foreach ($table['id'] as $id) {
334
			foreach ($table['id'] as $id) {
334
		   		if (!isset($table['champs_valeurs_id'][$id]) || $table['champs_valeurs_id'][$id] == '') {
335
		   		if (!isset($table['champs_valeurs_id'][$id]) || $table['champs_valeurs_id'][$id] == '') {
335
		   			$ok = false;
336
		   			$ok = false;
336
		   			break;
337
		   			break;
337
		   		}
338
		   		}
338
		   	}
339
		   	}
339
		   	$cle_complete = $ok;
340
		   	$cle_complete = $ok;
340
		}
341
		}
341
		return $cle_complete;
342
		return $cle_complete;
342
	}
343
	}
343
	
344
	
344
	protected function recupererEtat($table) {
345
	protected function recupererEtat($table) {
345
		$etat = 1;// Ajout
346
		$etat = 1;// Ajout
346
		if ($this->avoirEnregistrement($table) === true) {
347
		if ($this->avoirEnregistrement($table) === true) {
347
			$etat = 2;// Modification
348
			$etat = 2;// Modification
348
		}
349
		}
349
		return $etat;
350
		return $etat;
350
	}
351
	}
351
	
352
	
352
	protected function avoirEnregistrement($table) {
353
	protected function avoirEnregistrement($table) {
353
		$avoir_enregistrement = false;
354
		$avoir_enregistrement = false;
354
   		$requete = 	'SELECT * '.
355
   		$requete = 	'SELECT * '.
355
					"FROM {$table['nom']} ".
356
					"FROM {$table['nom']} ".
356
					"WHERE %s ";
357
					"WHERE %s ";
357
   		
358
   		
358
   		$where = $this->construireWhere($table['champs_valeurs_id']);
359
   		$where = $this->construireWhere($table['champs_valeurs_id']);
359
   		$requete = sprintf($requete, $where);
360
   		$requete = sprintf($requete, $where);
360
   		
361
   		
361
	   	// Exécution de la requêtre SQL et test d'éventuelles erreurs
362
	   	// Exécution de la requêtre SQL et test d'éventuelles erreurs
362
		$resultat = $this->bdd->query($requete, PDO::FETCH_ASSOC)->fetch();
363
		$resultat = $this->bdd->query($requete, PDO::FETCH_ASSOC)->fetch();
363
		
364
		
364
		if ($resultat !== false) {
365
		if ($resultat !== false) {
365
			$avoir_enregistrement = true;
366
			$avoir_enregistrement = true;
366
		}
367
		}
367
		return $avoir_enregistrement;
368
		return $avoir_enregistrement;
368
	}
369
	}
369
	
370
	
370
	protected function contenirDonnees($requete) {
371
	protected function contenirDonnees($requete) {
371
		$nbre = $this->bdd->query($requete)->fetchColumn();
372
		$nbre = $this->bdd->query($requete)->fetchColumn();
372
		
373
		
373
		$presence = false;
374
		$presence = false;
374
		if ($nbre != 0) {
375
		if ($nbre != 0) {
375
			$presence = true;
376
			$presence = true;
376
		}
377
		}
377
		return $presence;
378
		return $presence;
378
	}
379
	}
379
	
380
	
380
	protected function construireWhere($table) {
381
	protected function construireWhere($table) {
381
		$where = '1';
382
		$where = '1';
382
	   	if (is_array($table) && count($table) > 0) {
383
	   	if (is_array($table) && count($table) > 0) {
383
			$table_where = array();
384
			$table_where = array();
384
	   		foreach ($table as $chp => $id) {
385
	   		foreach ($table as $chp => $id) {
385
	   			$table_where[] = "$chp = '$id'";
386
	   			$table_where[] = "$chp = '$id'";
386
	   		}
387
	   		}
387
	   		$where = implode(' AND ', $table_where);
388
	   		$where = implode(' AND ', $table_where);
388
	   	}
389
	   	}
389
	   	return $where;
390
	   	return $where;
390
	}
391
	}
391
	
392
	
392
	protected function recupererTablesAModifier($parametres) {
393
	protected function recupererTablesAModifier($parametres) {
393
		$tables_a_modifier = $this->tables;
394
		$tables_a_modifier = $this->tables;
394
   		foreach ($this->tables as $table_id => $table) {
395
   		foreach ($this->tables as $table_id => $table) {
395
   			$tables_a_modifier[$table_id]['champs'] = null;
396
   			$tables_a_modifier[$table_id]['champs'] = null;
396
   			foreach ($parametres as $cle => $valeur) {
397
   			foreach ($parametres as $cle => $valeur) {
397
   				if (preg_match('/^'.$table['prefixe'].'_/', $cle)) {
398
   				if (preg_match('/^'.$table['prefixe'].'_/', $cle)) {
398
   					// Contient les noms des champs seulements
399
   					// Contient les noms des champs seulements
399
   					$tables_a_modifier[$table_id]['champs'][] = $cle;
400
   					$tables_a_modifier[$table_id]['champs'][] = $cle;
400
   					// Contient un tableau de résultats protégé pour l'inclusion en bdd
401
   					// Contient un tableau de résultats protégé pour l'inclusion en bdd
401
   					$tables_a_modifier[$table_id]['champs_valeurs_protege'][$cle] = $this->bdd->quote($valeur);
402
   					$tables_a_modifier[$table_id]['champs_valeurs_protege'][$cle] = $this->bdd->quote($valeur);
402
   					// Contient un tableau de résultats non protégé
403
   					// Contient un tableau de résultats non protégé
403
   					$tables_a_modifier[$table_id]['champs_valeurs_brut'][$cle] = $valeur;
404
   					$tables_a_modifier[$table_id]['champs_valeurs_brut'][$cle] = $valeur;
404
   					if (preg_match('/_id_/', $cle)) {
405
   					if (preg_match('/_id_/', $cle)) {
405
   						$tables_a_modifier[$table_id]['champs_valeurs_id'][$cle] = $valeur;
406
   						$tables_a_modifier[$table_id]['champs_valeurs_id'][$cle] = $valeur;
406
   					}
407
   					}
407
   				}
408
   				}
408
   			}  
409
   			}  
409
   		}
410
   		}
410
   		return $tables_a_modifier;
411
   		return $tables_a_modifier;
411
	}
412
	}
412
	
413
	
413
 
414
 
414
	protected function mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table) {
415
	protected function mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table) {
415
		if (!is_null($table['champs'])) {
416
		if (!is_null($table['champs'])) {
416
	   		// Historisation (Ajout des méta-données)
417
	   		// Historisation (Ajout des méta-données)
417
	   		$cle = $this->recupererCle($table);
418
	   		$cle = $this->recupererCle($table);
418
	   		$etat = $this->recupererEtat($table);
419
	   		$etat = $this->recupererEtat($table);
419
	   		$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
420
	   		$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
420
			$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
421
			$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
421
			$champ_meta = "{$table['prefixe']}_ce_meta";
422
			$champ_meta = "{$table['prefixe']}_ce_meta";
422
			$table['champs_valeurs_protege'][$champ_meta] = $this->bdd->quote($id_meta);
423
			$table['champs_valeurs_protege'][$champ_meta] = $this->bdd->quote($id_meta);
423
			
424
			
424
			// Mise à jour des données ou ajout en fonction de l'état
425
			// Mise à jour des données ou ajout en fonction de l'état
425
			if ($etat == 1) { // Ajout
426
			if ($etat == 1) { // Ajout
426
				$this->ajouter($table);
427
				$this->ajouter($table);
427
			} else if ($etat == 2) { // Modif
428
			} else if ($etat == 2) { // Modif
428
				$this->modifier($table);
429
				$this->modifier($table);
429
			}
430
			}
430
   		}
431
   		}
431
	}
432
	}
432
	
433
	
433
	protected function ajouter($table) {
434
	protected function ajouter($table) {
434
		$requete = 	"INSERT INTO {$table['nom']} ".
435
		$requete = 	"INSERT INTO {$table['nom']} ".
435
   					' (%s) '.
436
   					' (%s) '.
436
					' VALUES (%s) ';
437
					' VALUES (%s) ';
437
		
438
		
438
		$champs = $valeurs = '';
439
		$champs = $valeurs = '';
439
		foreach ($table['champs_valeurs_protege'] as $chp => $val) {
440
		foreach ($table['champs_valeurs_protege'] as $chp => $val) {
440
			$champs .= "$chp, ";
441
			$champs .= "$chp, ";
441
			$valeurs .= "$val, ";
442
			$valeurs .= "$val, ";
442
		}
443
		}
443
		$requete = sprintf($requete, rtrim($champs, ', '), rtrim($valeurs, ', '));
444
		$requete = sprintf($requete, rtrim($champs, ', '), rtrim($valeurs, ', '));
444
		
445
		
445
		$resultat = $this->bdd->exec($requete);
446
		$resultat = $this->bdd->exec($requete);
446
		$dernier_id = false;
447
		$dernier_id = false;
447
		if ($resultat === false) {
448
		if ($resultat === false) {
448
			$cle = $this->recupererCle($table);
449
			$cle = $this->recupererCle($table);
449
			$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été ajouté car la requête a échouée.";
450
			$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été ajouté car la requête a échouée.";
450
		} else {
451
		} else {
451
			$dernier_id = $this->bdd->lastInsertId();
452
			$dernier_id = $this->bdd->lastInsertId();
452
		}
453
		}
453
		return $dernier_id;
454
		return $dernier_id;
454
	}
455
	}
455
	
456
	
456
	protected function modifier($table) {
457
	protected function modifier($table) {
457
		$requete = 	"UPDATE {$table['nom']} ".
458
		$requete = 	"UPDATE {$table['nom']} ".
458
   					'SET %s '.
459
   					'SET %s '.
459
   					'WHERE %s ';
460
   					'WHERE %s ';
460
		
461
		
461
		$champs_requete = '';
462
		$champs_requete = '';
462
		foreach ($table['champs_valeurs_protege'] as $chp => $val) {
463
		foreach ($table['champs_valeurs_protege'] as $chp => $val) {
463
			$champs_requete .= "$chp = $val, ";
464
			$champs_requete .= "$chp = $val, ";
464
		}
465
		}
465
		$where = $this->construireWhere($table['champs_valeurs_id']);
466
		$where = $this->construireWhere($table['champs_valeurs_id']);
466
		$requete = sprintf($requete, rtrim($champs_requete, ', '), $where);
467
		$requete = sprintf($requete, rtrim($champs_requete, ', '), $where);
467
		$resultat = $this->bdd->exec($requete);
468
		$resultat = $this->bdd->exec($requete);
468
		if ($resultat === false) {
469
		if ($resultat === false) {
469
			$cle = $this->recupererCle($table);
470
			$cle = $this->recupererCle($table);
470
			$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été mis à jour car la requête a échouée.";
471
			$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été mis à jour car la requête a échouée.";
471
		} else {
472
		} else {
472
			$resultat = true;
473
			$resultat = true;
473
		}
474
		}
474
		return $resultat;
475
		return $resultat;
475
	}
476
	}
476
	
477
	
477
	protected function supprimer($table) {
478
	protected function supprimer($table) {
478
		$requete = 	"DELETE FROM {$table['nom']} ".
479
		$requete = 	"DELETE FROM {$table['nom']} ".
479
					'WHERE %s ';
480
					'WHERE %s ';
480
		
481
		
481
		$where = $this->construireWhere($table['champs_valeurs_id']);
482
		$where = $this->construireWhere($table['champs_valeurs_id']);
482
		$requete = sprintf($requete, $where);
483
		$requete = sprintf($requete, $where);
483
		
484
		
484
		$resultat = $this->bdd->exec($requete);
485
		$resultat = $this->bdd->exec($requete);
485
		if ($resultat === false) {
486
		if ($resultat === false) {
486
			$cle = $this->recupererCle($table);
487
			$cle = $this->recupererCle($table);
487
			$this->messages[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été supprimé car la requête a échouée.";
488
			$this->messages[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été supprimé car la requête a échouée.";
488
		} else {
489
		} else {
489
			$resultat = true;
490
			$resultat = true;
490
		}
491
		}
491
		return $resultat;
492
		return $resultat;
492
	}
493
	}
493
	
494
	
494
	private function gererSession($demarrage) {
495
	private function gererSession($demarrage) {
495
		session_name($this->sessionName);
496
		session_name($this->sessionName);
496
 
497
 
497
		// Configuration du cookie de session
498
		// Configuration du cookie de session
498
		// Détermination du chemin pour les cookies nécessaire à Jrest
499
		// Détermination du chemin pour les cookies nécessaire à Jrest
499
		/// ATTENTION : comme les cookies sont passés à Jrest, il faut utiliser l'url de Jrest pour établir le chemin
500
		/// ATTENTION : comme les cookies sont passés à Jrest, il faut utiliser l'url de Jrest pour établir le chemin
500
		$url_morceaux = parse_url($this->config['coel']['urlBaseJrest']);
501
		$url_morceaux = parse_url($this->config['coel']['urlBaseJrest']);
501
		$this->cookieChemin = $this->reparerCheminCookie($url_morceaux['path']);
502
		$this->cookieChemin = $this->reparerCheminCookie($url_morceaux['path']);
502
		unset($url_morceaux);
503
		unset($url_morceaux);
503
		session_set_cookie_params($this->sessionExpireTime, $this->cookieChemin);
504
		session_set_cookie_params($this->sessionExpireTime, $this->cookieChemin);
504
		
505
		
505
		// Démarrage de la session
506
		// Démarrage de la session
506
		if ($demarrage) {
507
		if ($demarrage) {
507
			session_start();
508
			session_start();
508
		}
509
		}
509
	}
510
	}
510
	
511
	
511
	private function reparerCheminCookie($chemin) {
512
	private function reparerCheminCookie($chemin) {
512
		// dirname renvoit / si le chemin vaut seulement /dossier/, cela renvoit /dossier si le chemin vaut /dossier//.
513
		// dirname renvoit / si le chemin vaut seulement /dossier/, cela renvoit /dossier si le chemin vaut /dossier//.
513
		$chemin = dirname($chemin.'/.');
514
		$chemin = dirname($chemin.'/.');
514
		// Fixe la gestion des chemins pour les cookies sous les OS utilisant le \ comme séparteur de chemin
515
		// Fixe la gestion des chemins pour les cookies sous les OS utilisant le \ comme séparteur de chemin
515
		$chemin = str_replace('\\', '/', $chemin);
516
		$chemin = str_replace('\\', '/', $chemin);
516
		// Ajoute un '/' terminal sauf si on est à la racine web
517
		// Ajoute un '/' terminal sauf si on est à la racine web
517
		$chemin = ($chemin != '/' ? $chemin.'/' : '');
518
		$chemin = ($chemin != '/' ? $chemin.'/' : '');
518
		return $chemin;
519
		return $chemin;
519
	}
520
	}
520
	
521
	
521
	private function gererIdentificationPermanente() {
522
	private function gererIdentificationPermanente() {
522
		// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd
523
		// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd
523
		if ($this->getUtilisateur() == '' 
524
		if ($this->getUtilisateur() == '' 
524
				&& isset($_COOKIE['coel_login']) 
525
				&& isset($_COOKIE['coel_login']) 
525
				&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
526
				&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
526
			$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
527
			$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
527
		}
528
		}
528
	}
529
	}
529
	
530
	
530
	protected function getUtilisateur() {
531
	protected function getUtilisateur() {
531
		return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : '');
532
		return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : '');
532
	}
533
	}
533
	
534
	
534
	protected function chargerUtilisateur($login, $mot_de_passe = null) {
535
	protected function chargerUtilisateur($login, $mot_de_passe = null) {
535
		$sortie = false;
536
		$sortie = false;
536
		$cp_ce_projet = $this->config['coel']['idProjetUtilisateurs'];
537
		$cp_ce_projet = $this->config['coel']['idProjetUtilisateurs'];
537
		$requete =	'SELECT cp_id_personne AS id, cp_fmt_nom_complet AS nom_complet, cp_prenom AS prenom, '.
538
		$requete =	'SELECT cp_id_personne AS id, cp_fmt_nom_complet AS nom_complet, cp_prenom AS prenom, '.
538
					'	cp_nom AS nom, cp_login AS login, cp_mot_de_passe AS mot_de_passe, cp_parametre AS parametre, '.
539
					'	cp_nom AS nom, cp_login AS login, cp_mot_de_passe AS mot_de_passe, cp_parametre AS parametre, '.
539
					'	cp_ville AS ville, cp_code_postal AS code_postal, '.
540
					'	cp_ville AS ville, cp_code_postal AS code_postal, '.
540
					'	cp_mark_licence AS licence '.
541
					'	cp_mark_licence AS licence '.
541
					'FROM coel_personne '.
542
					'FROM coel_personne '.
542
					"WHERE cp_login = {$this->bdd->quote($login)} ".
543
					"WHERE cp_login = {$this->bdd->quote($login)} ".
543
					"	AND cp_ce_projet = '$cp_ce_projet' ".
544
					"	AND cp_ce_projet = '$cp_ce_projet' ".
544
					((!is_null($mot_de_passe)) ? "AND cp_mot_de_passe = {$this->bdd->quote($mot_de_passe)} " : '');
545
					((!is_null($mot_de_passe)) ? "AND cp_mot_de_passe = {$this->bdd->quote($mot_de_passe)} " : '');
545
		try {
546
		try {
546
			$resultat = $this->bdd->query($requete)->fetch();
547
			$resultat = $this->bdd->query($requete)->fetch();
547
			if ($resultat === false) {
548
			if ($resultat === false) {
548
				$this->debug[] = "L'utilisateur n'est pas enregistré comme utilisateur de COEL.";
549
				$this->debug[] = "L'utilisateur n'est pas enregistré comme utilisateur de COEL.";
549
			} else {
550
			} else {
550
				$sortie = array('id' => $resultat['id'], 
551
				$sortie = array('id' => $resultat['id'], 
551
					'login' => $login, 
552
					'login' => $login, 
552
					'mot_de_passe' => $resultat['mot_de_passe'], 
553
					'mot_de_passe' => $resultat['mot_de_passe'], 
553
					'nom_complet' => $resultat['nom_complet'], 
554
					'nom_complet' => $resultat['nom_complet'], 
554
					'nom' => $resultat['nom'], 
555
					'nom' => $resultat['nom'], 
555
					'prenom' => $resultat['prenom'], 
556
					'prenom' => $resultat['prenom'], 
556
					'parametre' => $resultat['parametre'],
557
					'parametre' => $resultat['parametre'],
557
					'ville' => $resultat['ville'], 
558
					'ville' => $resultat['ville'], 
558
					'code_postal' => $resultat['code_postal'],  
559
					'code_postal' => $resultat['code_postal'],  
559
					'licence' => $resultat['licence']);
560
					'licence' => $resultat['licence']);
560
			}
561
			}
561
		} catch (PDOException $e) {
562
		} catch (PDOException $e) {
562
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
563
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
563
		}
564
		}
564
		
565
		
565
		return $sortie;
566
		return $sortie;
566
	}
567
	}
567
	
568
	
568
	protected function setUtilisateur($utilisateur, $permanence = 1) {
569
	protected function setUtilisateur($utilisateur, $permanence = 1) {
569
		$_SESSION['coel_utilisateur'] = $utilisateur;
570
		$_SESSION['coel_utilisateur'] = $utilisateur;
570
		$this->debug[] = $_SESSION['coel_utilisateur'];
571
		$this->debug[] = $_SESSION['coel_utilisateur'];
571
		$this->setCookiePersistant('coel_login', $utilisateur['login'], $permanence);
572
		$this->setCookiePersistant('coel_login', $utilisateur['login'], $permanence);
572
		$this->setCookiePersistant('coel_mot_de_passe', $utilisateur['mot_de_passe'], $permanence);
573
		$this->setCookiePersistant('coel_mot_de_passe', $utilisateur['mot_de_passe'], $permanence);
573
		$this->setCookiePersistant('coel_licence', $utilisateur['licence'], $permanence);
574
		$this->setCookiePersistant('coel_licence', $utilisateur['licence'], $permanence);
574
		$this->setCookiePersistant('coel_permanence', $permanence, $permanence);
575
		$this->setCookiePersistant('coel_permanence', $permanence, $permanence);
575
	}
576
	}
576
	
577
	
577
	protected function setCookiePersistant($cookie_nom, $valeur, $permanence = 1) {
578
	protected function setCookiePersistant($cookie_nom, $valeur, $permanence = 1) {
578
		setCookie($cookie_nom, $valeur, time() + ($permanence ? 100*24*60*60 : 60*60), $this->cookieChemin);
579
		setCookie($cookie_nom, $valeur, time() + ($permanence ? 100*24*60*60 : 60*60), $this->cookieChemin);
579
		$_COOKIE[$cookie_nom] = $valeur;
580
		$_COOKIE[$cookie_nom] = $valeur;
580
	}
581
	}
581
	
582
	
582
	protected function supprimerCookie($cookie_nom) {
583
	protected function supprimerCookie($cookie_nom) {
583
		setCookie($cookie_nom, '', 1, $this->cookieChemin);
584
		setCookie($cookie_nom, '', 1, $this->cookieChemin);
584
		$_COOKIE[$cookie_nom] = '';
585
		$_COOKIE[$cookie_nom] = '';
585
	}
586
	}
586
	
587
	
587
	/**
588
	/**
588
	 * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
589
	 * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
589
	 * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
590
	 * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
590
	 *
591
	 *
591
	 * @param String $fichier	le chemin du fichier du squelette
592
	 * @param String $fichier	le chemin du fichier du squelette
592
	 * @param Array  $donnees	un tableau associatif contenant les variables a injecter dans le squelette.
593
	 * @param Array  $donnees	un tableau associatif contenant les variables a injecter dans le squelette.
593
	 *
594
	 *
594
	 * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
595
	 * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
595
	 */
596
	 */
596
	public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
597
	public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
597
		$sortie = false;
598
		$sortie = false;
598
		if (file_exists($fichier)) {
599
		if (file_exists($fichier)) {
599
			// Extraction des variables du tableau de données
600
			// Extraction des variables du tableau de données
600
			extract($donnees);
601
			extract($donnees);
601
			// Démarage de la bufferisation de sortie
602
			// Démarage de la bufferisation de sortie
602
			ob_start();
603
			ob_start();
603
			// Si les tags courts sont activés
604
			// Si les tags courts sont activés
604
			if ((bool) @ini_get('short_open_tag') === true) {
605
			if ((bool) @ini_get('short_open_tag') === true) {
605
				// Simple inclusion du squelette
606
				// Simple inclusion du squelette
606
				include $fichier;
607
				include $fichier;
607
			} else {
608
			} else {
608
				// Sinon, remplacement des tags courts par la syntaxe classique avec echo
609
				// Sinon, remplacement des tags courts par la syntaxe classique avec echo
609
				$html_et_code_php = self::traiterTagsCourts($fichier);
610
				$html_et_code_php = self::traiterTagsCourts($fichier);
610
				// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
611
				// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
611
				$html_et_code_php = '?>'.$html_et_code_php;
612
				$html_et_code_php = '?>'.$html_et_code_php;
612
				// Interprétation du html et du php dans le buffer
613
				// Interprétation du html et du php dans le buffer
613
				echo eval($html_et_code_php);
614
				echo eval($html_et_code_php);
614
			}
615
			}
615
			// Récupèration du contenu du buffer
616
			// Récupèration du contenu du buffer
616
			$sortie = ob_get_contents();
617
			$sortie = ob_get_contents();
617
			// Suppression du buffer
618
			// Suppression du buffer
618
			@ob_end_clean();
619
			@ob_end_clean();
619
		} else {
620
		} else {
620
			$msg = "Le fichier du squelette '$fichier' n'existe pas.";
621
			$msg = "Le fichier du squelette '$fichier' n'existe pas.";
621
			trigger_error($msg, E_USER_WARNING);
622
			trigger_error($msg, E_USER_WARNING);
622
		}
623
		}
623
		// Retourne le contenu
624
		// Retourne le contenu
624
		return $sortie;
625
		return $sortie;
625
	}
626
	}
626
	
627
	
627
	/**
628
	/**
628
	 * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
629
	 * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
629
	 *
630
	 *
630
	 * @param String $chemin_squelette le chemin du fichier du squelette
631
	 * @param String $chemin_squelette le chemin du fichier du squelette
631
	 *
632
	 *
632
	 * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
633
	 * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
633
	 */
634
	 */
634
	private static function traiterTagsCourts($chemin_squelette) {
635
	private static function traiterTagsCourts($chemin_squelette) {
635
		$contenu = file_get_contents($chemin_squelette);
636
		$contenu = file_get_contents($chemin_squelette);
636
		// Remplacement de tags courts par un tag long avec echo
637
		// Remplacement de tags courts par un tag long avec echo
637
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
638
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
638
		// Ajout systématique d'un point virgule avant la fermeture php
639
		// Ajout systématique d'un point virgule avant la fermeture php
639
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
640
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
640
		return $contenu;
641
		return $contenu;
641
	}
642
	}
642
	
643
	
643
	public static function debug($var) {
644
	public static function debug($var) {
644
		echo '<pre>'.print_r($var, true).'</pre>';
645
		echo '<pre>'.print_r($var, true).'</pre>';
645
	}
646
	}
646
}
647
}
647
?>
648
?>