Subversion Repositories eFlore/Applications.coel

Rev

Rev 1524 | Rev 1528 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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