Subversion Repositories eFlore/Applications.coel

Rev

Rev 1950 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1950 Rev 1954
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
/** Définition de l'encodage interne des fichiers. */
4
/** Définition de l'encodage interne des fichiers. */
5
mb_internal_encoding('UTF-8');
5
mb_internal_encoding('UTF-8');
6
 
6
 
7
/**
7
/**
8
 * Classe mère abstraite contenant les méthodes génériques des services.
8
 * Classe mère abstraite contenant les méthodes génériques des services.
9
 * Encodage en entrée : utf8
9
 * Encodage en entrée : utf8
10
 * Encodage en sortie : utf8
10
 * Encodage en sortie : utf8
11
 * 
11
 * 
12
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @version $Id$
15
 * @version $Id$
16
 * @copyright 2009
16
 * @copyright 2009
17
 */
17
 */
18
abstract class Coel {
18
abstract class Coel {
19
	
19
	
20
	const ETAT_AJOUTER = 1;
20
	const ETAT_AJOUTER = 1;
21
	const ETAT_MODIFIER = 2;
21
	const ETAT_MODIFIER = 2;
22
	const ETAT_SUPPRIMER = 3;
22
	const ETAT_SUPPRIMER = 3;
23
	
23
	
24
	protected $sessionName = 'CoelSession';
24
	protected $sessionName = 'CoelSession';
25
	protected $sessionExpireTime = 8640000;// 60*60*24*100 = 100 jours
25
	protected $sessionExpireTime = 8640000;// 60*60*24*100 = 100 jours
26
	protected static $cookieChemin = '';
26
	protected static $cookieChemin = '';
27
	public $config;
27
	public $config;
28
	protected $bdd;
28
	protected $bdd;
29
	protected $log = array();
29
	protected $log = array();
30
	protected $messages = array();
30
	protected $messages = array();
31
	protected $debug = array();
31
	protected $debug = array();
32
	protected $distinct = false;
32
	protected $distinct = false;
33
	protected $orderby = null;
33
	protected $orderby = null;
34
	protected $formatRetour = 'objet';
34
	protected $formatRetour = 'objet';
35
	protected $start = 0; 
35
	protected $start = 0; 
36
	protected $limit = 150;
36
	protected $limit = 150;
37
	
37
	
38
	public function __construct($config, $demarrer_session = true) {
38
	public function __construct($config, $demarrer_session = true) {
39
		// Tableau contenant la config de Jrest
39
		// Tableau contenant la config de Jrest
40
		$this->config = $config;
40
		$this->config = $config;
41
		
41
		
42
		// Connection à la base de données
42
		// Connection à la base de données
43
		$this->bdd = $this->connecterPDO($this->config, 'coel');
43
		$this->bdd = $this->connecterPDO($this->config, 'coel');
44
		
44
		
45
		$this->gererSession($demarrer_session);
45
		$this->gererSession($demarrer_session);
46
		$this->gererIdentificationPermanente();
46
		$this->gererIdentificationPermanente();
47
 
47
 
48
        if(isset($_GET['start'])) $this->start = intval($_GET['start']);
48
        if(isset($_GET['start'])) $this->start = intval($_GET['start']);
49
        if(isset($_GET['limit'])) $this->limit = intval($_GET['limit']);
49
        if(isset($_GET['limit'])) $this->limit = intval($_GET['limit']);
50
		
50
		
51
		// Nettoyage du $_GET (non-sécurisé)
51
		// Nettoyage du $_GET (non-sécurisé)
52
		if (isset($_GET)) {
52
		if (isset($_GET)) {
53
			$get_params = array('orderby', 'distinct', 'formatRetour', 'searchCity');
53
			$get_params = array('orderby', 'distinct', 'formatRetour', 'searchCity');
54
			foreach ($get_params as $get) {
54
			foreach ($get_params as $get) {
55
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
55
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
56
				if (isset($_GET[$get]) && $_GET[$get] != '') {
56
				if (isset($_GET[$get]) && $_GET[$get] != '') {
57
					$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
57
					$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
58
					$this->$get = $_GET[$get];
58
					$this->$get = $_GET[$get];
59
				} else {
59
				} else {
60
					$_GET[$get] = null;
60
					$_GET[$get] = null;
61
				}
61
				}
62
			}
62
			}
63
		}
63
		}
64
	}
64
	}
65
 
65
 
66
	/**
66
	/**
67
	 * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
67
	 * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
68
	 */
68
	 */
69
	public function getRessource() {
69
	public function getRessource() {
70
		$this->getElement(array());
70
		$this->getElement(array());
71
	}
71
	}
72
	
72
	
73
	
73
	
74
	protected function creerXmlHisto($donnees) {
74
	protected function creerXmlHisto($donnees) {
75
		// Création du xml de l'enregistrement à historiser
75
		// Création du xml de l'enregistrement à historiser
76
		$info = null;
76
		$info = null;
77
		$xml_tpl = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<resultset>\n<row>\n%s</row>\n</resultset>";
77
		$xml_tpl = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<resultset>\n<row>\n%s</row>\n</resultset>";
78
		$xml = null;
78
		$xml = null;
79
		 
79
		 
80
		foreach ($donnees as $cle => $valeur) {
80
		foreach ($donnees as $cle => $valeur) {
81
			if (!is_null($valeur) && $valeur != '') {
81
			if (!is_null($valeur) && $valeur != '') {
82
				$xml .= "<$cle>$valeur</$cle>\n";
82
				$xml .= "<$cle>$valeur</$cle>\n";
83
			}
83
			}
84
		}
84
		}
85
		if ($xml !== null) {
85
		if ($xml !== null) {
86
			$info = sprintf($xml_tpl, $xml);
86
			$info = sprintf($xml_tpl, $xml);
87
			$info = $this->bdd->quote($info);
87
			$info = $this->bdd->quote($info);
88
		}
88
		}
89
		
89
		
90
		return $info;
90
		return $info;
91
	}
91
	}
92
	
92
	
93
	protected function getTableauDepuisXmlHisto($xml) {
93
	protected function getTableauDepuisXmlHisto($xml) {
94
		// Création du xml de l'enregistrement à historiser
94
		// Création du xml de l'enregistrement à historiser
95
		$info = array();
95
		$info = array();
96
		
96
		
97
		if (!empty($xml) && preg_match_all('|<([^>]+)>(.*)</[^>]+>|U', $xml, $matches, PREG_SET_ORDER)) {
97
		if (!empty($xml) && preg_match_all('|<([^>]+)>(.*)</[^>]+>|U', $xml, $matches, PREG_SET_ORDER)) {
98
			foreach ($matches as $val) {
98
			foreach ($matches as $val) {
99
				$info[$val[1]] = $val[2];
99
				$info[$val[1]] = $val[2];
100
			}
100
			}
101
		}
101
		}
102
		
102
		
103
		return $info;
103
		return $info;
104
	}
104
	}
105
		
105
		
106
	protected function historiser($table_id, $ligne_cle, $info, $id_utilisateur, $etat, $id_session) {
106
	protected function historiser($table_id, $ligne_cle, $info, $id_utilisateur, $etat, $id_session) {
107
		date_default_timezone_set('Europe/Paris');
107
		date_default_timezone_set('Europe/Paris');
108
		// Pré-traitement des variables
108
		// Pré-traitement des variables
109
		$info = (is_null($info)) ? 'NULL' : $info;
109
		$info = (is_null($info)) ? 'NULL' : $info;
110
		
110
		
111
		// Historisation (Ajout des méta-données)
111
		// Historisation (Ajout des méta-données)
112
		$requete = 	'INSERT INTO coel_meta_historique_ligne '. 
112
		$requete = 	'INSERT INTO coel_meta_historique_ligne '. 
113
					'	(cmhl_ce_table, cmhl_cle_ligne, cmhl_enregistrement, cmhl_date_modification, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, cmhl_session_id) '.
113
					'	(cmhl_ce_table, cmhl_cle_ligne, cmhl_enregistrement, cmhl_date_modification, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, cmhl_session_id) '.
114
					'VALUES ('.
114
					'VALUES ('.
115
					"		$table_id, ".
115
					"		$table_id, ".
116
					'		"'.$ligne_cle.'", '.
116
					'		"'.$ligne_cle.'", '.
117
					"		$info, ".
117
					"		$info, ".
118
 					'		"'.date('Y-m-d H:i:s', time()).'", '.
118
 					'		"'.date('Y-m-d H:i:s', time()).'", '.
119
					"		$id_utilisateur, ".
119
					"		$id_utilisateur, ".
120
					"		$etat, ".
120
					"		$etat, ".
121
					'		"'.$_SERVER['REMOTE_ADDR'].'", '.
121
					'		"'.$_SERVER['REMOTE_ADDR'].'", '.
122
					'		"'.$id_session.'") ';
122
					'		"'.$id_session.'") ';
123
		
123
		
124
   		// Exécution de la requêtre SQL et test d'éventuelles erreurs
124
   		// Exécution de la requêtre SQL et test d'éventuelles erreurs
125
		$resultat = $this->bdd->exec($requete);
125
		$resultat = $this->bdd->exec($requete);
126
		if ($resultat === false ) {
126
		if ($resultat === false ) {
127
			$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.";
127
			$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.";
128
		}
128
		}
129
		return $this->bdd->lastInsertId();
129
		return $this->bdd->lastInsertId();
130
	}
130
	}
131
	
131
	
132
	protected function envoyer($donnees = null, $mime = 'application/json', $encodage = 'utf-8', $json = true) {
132
	protected function envoyer($donnees = null, $mime = 'application/json', $encodage = 'utf-8', $json = true) {
133
		// Traitements des messages d'erreurs et données
133
		// Traitements des messages d'erreurs et données
134
		if (count($this->messages) != 0) {
134
		if (count($this->messages) != 0) {
135
			header('HTTP/1.1 500 Internal Server Error');
135
			header('HTTP/1.1 500 Internal Server Error');
136
			$mime = 'text/html';
136
			$mime = 'text/html';
137
			$encodage = 'utf-8';
137
			$encodage = 'utf-8';
138
			$json = true;
138
			$json = true;
139
			$sortie = $this->messages;
139
			$sortie = $this->messages;
140
		} else {
140
		} else {
141
			$sortie = $donnees;
141
			$sortie = $donnees;
142
			if (is_null($donnees)) {
142
			if (is_null($donnees)) {
143
				$sortie = 'OK';
143
				$sortie = 'OK';
144
			}
144
			}
145
		}
145
		}
146
 
146
 
147
		// Gestion de l'envoie du déboguage
147
		// Gestion de l'envoie du déboguage
148
		$this->envoyerDebogage();
148
		$this->envoyerDebogage();
149
		
149
		
150
		// Encodage au format et JSON et envoie sur la sortie standard
150
		// Encodage au format et JSON et envoie sur la sortie standard
151
		$contenu = $json ? json_encode($sortie) : $sortie;
151
		$contenu = $json ? json_encode($sortie) : $sortie;
152
		$this->envoyerContenu($encodage, $mime, $contenu);
152
		$this->envoyerContenu($encodage, $mime, $contenu);
153
	}
153
	}
154
	
154
	
155
	protected function envoyerHTML($donnees = null) {
155
	protected function envoyerHTML($donnees = null) {
156
		// Traitements des messages d'erreurs et données
156
		// Traitements des messages d'erreurs et données
157
		$contenu = '';
157
		$contenu = '';
158
		if (count($this->messages) > 0) {
158
		if (count($this->messages) > 0) {
159
			$contenu = '<p>'.implode('<br />', $this->messages).'</p>';
159
			$contenu = '<p>'.implode('<br />', $this->messages).'</p>';
160
		} else {
160
		} else {
161
			$contenu = $donnees;
161
			$contenu = $donnees;
162
			if (is_null($donnees)) {
162
			if (is_null($donnees)) {
163
				$contenu = 'OK';
163
				$contenu = 'OK';
164
			}
164
			}
165
		}
165
		}
166
 
166
 
167
		// Gestion de l'envoie du déboguage
167
		// Gestion de l'envoie du déboguage
168
		$this->envoyerDebogage();
168
		$this->envoyerDebogage();
169
		
169
		
170
		// Envoie sur la sortie standard
170
		// Envoie sur la sortie standard
171
		$this->envoyerContenu(null, null, $contenu);
171
		$this->envoyerContenu(null, null, $contenu);
172
	}
172
	}
173
	
173
	
174
	protected function envoyerEnteteMessage() {
174
	protected function envoyerEnteteMessage() {
175
		if (!is_array($this->messages)) {
175
		if (!is_array($this->messages)) {
176
			$this->messages[] = $this->messages;
176
			$this->messages[] = $this->messages;
177
		}
177
		}
178
		if (count($this->messages) != 0) {
178
		if (count($this->messages) != 0) {
179
			foreach ($this->messages as $cle => $val) {
179
			foreach ($this->messages as $cle => $val) {
180
				if (is_array($val)) {
180
				if (is_array($val)) {
181
					$this->messages[$cle] = print_r($val, true);
181
					$this->messages[$cle] = print_r($val, true);
182
				}
182
				}
183
			}
183
			}
184
			header('X-MessageJrest-Data: '.json_encode($this->messages));
184
			header('X-MessageJrest-Data: '.json_encode($this->messages));
185
		}
185
		}
186
	}
186
	}
187
 
187
 
188
	protected function envoyerDebogage() {
188
	protected function envoyerDebogage() {
189
		$this->envoyerEnteteDebogage();
189
		$this->envoyerEnteteDebogage();
190
	}
190
	}
191
	
191
	
192
	protected function envoyerEnteteDebogage() {
192
	protected function envoyerEnteteDebogage() {
193
		if (!is_array($this->debug)) {
193
		if (!is_array($this->debug)) {
194
			$this->debug[] = $this->debug;
194
			$this->debug[] = $this->debug;
195
		}
195
		}
196
		if (count($this->debug) != 0) {
196
		if (count($this->debug) != 0) {
197
			foreach ($this->debug as $cle => $val) {
197
			foreach ($this->debug as $cle => $val) {
198
				if (is_array($val)) {
198
				if (is_array($val)) {
199
					$this->debug[$cle] = print_r($val, true);
199
					$this->debug[$cle] = print_r($val, true);
200
				}
200
				}
201
			}
201
			}
202
			header('X-DebugJrest-Data: '.json_encode($this->debug));
202
			header('X-DebugJrest-Data: '.json_encode($this->debug));
203
		}
203
		}
204
	}
204
	}
205
	
205
	
206
	protected function envoyerContenu($encodage, $mime, $contenu) {
206
	protected function envoyerContenu($encodage, $mime, $contenu) {
207
		if (!is_null($mime) && !is_null($encodage)) {
207
		if (!is_null($mime) && !is_null($encodage)) {
208
			header("Content-Type: $mime; charset=$encodage");
208
			header("Content-Type: $mime; charset=$encodage");
209
		} else if (!is_null($mime) && is_null($encodage)) {
209
		} else if (!is_null($mime) && is_null($encodage)) {
210
			header("Content-Type: $mime");
210
			header("Content-Type: $mime");
211
		}
211
		}
212
		print $contenu;
212
		print $contenu;
213
	}
213
	}
214
	
214
	
215
	private function connecterPDO($config, $base = 'database') {
215
	private function connecterPDO($config, $base = 'database') {
216
        $cfg = $config[$base];
216
        $cfg = $config[$base];
217
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
217
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
218
		try {
218
		try {
219
    		$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
219
    		$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
220
		} catch (PDOException $e) {
220
		} catch (PDOException $e) {
221
    		echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
221
    		echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
222
		}
222
		}
223
		// Passe en UTF-8 la connexion à la BDD
223
		// Passe en UTF-8 la connexion à la BDD
224
		$PDO->exec("SET NAMES 'utf8'");
224
		$PDO->exec("SET NAMES 'utf8'");
-
 
225
		// Désactive les controles strict de mysql
-
 
226
		$PDO->exec("SET SESSION sql_mode = ''");
225
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
227
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
226
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
228
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
227
        return $PDO;
229
        return $PDO;
228
	}
230
	}
229
	
231
	
230
	protected function getTxt($id) {
232
	protected function getTxt($id) {
231
		$sortie = '';
233
		$sortie = '';
232
		switch ($id) {
234
		switch ($id) {
233
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
235
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
234
			case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
236
			case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
235
			default : $sortie = $id; 
237
			default : $sortie = $id; 
236
		}
238
		}
237
		return $sortie;
239
		return $sortie;
238
	}
240
	}
239
	
241
	
240
	protected function concatenerChamps($champs, $prefixe = null) {
242
	protected function concatenerChamps($champs, $prefixe = null) {
241
		$chaine = '';
243
		$chaine = '';
242
		foreach ($champs as $cle => $valeur) {
244
		foreach ($champs as $cle => $valeur) {
243
			if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
245
			if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
244
				$chaine .= ", $cle = $valeur";
246
				$chaine .= ", $cle = $valeur";
245
			}
247
			}
246
		}
248
		}
247
		return ltrim($chaine, ', ');
249
		return ltrim($chaine, ', ');
248
	}
250
	}
249
 
251
 
250
	protected function separerChampsValeurs($donnees, $prefixe = null) {
252
	protected function separerChampsValeurs($donnees, $prefixe = null) {
251
		$sortie = array('', '');
253
		$sortie = array('', '');
252
		// Concaténation des champs et des valeurs dans des chaines séparées
254
		// Concaténation des champs et des valeurs dans des chaines séparées
253
		foreach ($donnees as $cle => $valeur) {
255
		foreach ($donnees as $cle => $valeur) {
254
			if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
256
			if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
255
				$sortie[0] .= "$cle, ";
257
				$sortie[0] .= "$cle, ";
256
				$sortie[1] .= "$valeur, ";
258
				$sortie[1] .= "$valeur, ";
257
			}
259
			}
258
		}
260
		}
259
		// Suppression de la virgule finale
261
		// Suppression de la virgule finale
260
		$sortie[0] = rtrim($sortie[0], ', ');
262
		$sortie[0] = rtrim($sortie[0], ', ');
261
		$sortie[1] = rtrim($sortie[1], ', ');
263
		$sortie[1] = rtrim($sortie[1], ', ');
262
		return $sortie;
264
		return $sortie;
263
	}
265
	}
264
	
266
	
265
	
267
	
266
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
268
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
267
		$sortie = array();
269
		$sortie = array();
268
		foreach ($params_attendu as $num => $nom) {
270
		foreach ($params_attendu as $num => $nom) {
269
			if (isset($params[$num]) && $params[$num] != '*') {
271
			if (isset($params[$num]) && $params[$num] != '*') {
270
				if ($pourBDD) {
272
				if ($pourBDD) {
271
					$params[$num] = $this->bdd->quote($params[$num]);
273
					$params[$num] = $this->bdd->quote($params[$num]);
272
				}
274
				}
273
				$sortie[$nom] = $params[$num];
275
				$sortie[$nom] = $params[$num];
274
			}
276
			}
275
		}
277
		}
276
		return $sortie;
278
		return $sortie;
277
	}
279
	}
278
	
280
	
279
	protected function traiterBddClauseIn($chaine) {
281
	protected function traiterBddClauseIn($chaine) {
280
		$sortie = '';
282
		$sortie = '';
281
		$chaine = trim($chaine, " '");
283
		$chaine = trim($chaine, " '");
282
		if ($chaine != '') {
284
		if ($chaine != '') {
283
			$valeurs = explode(',', $chaine);
285
			$valeurs = explode(',', $chaine);
284
			foreach ($valeurs as $id => $valeur) {
286
			foreach ($valeurs as $id => $valeur) {
285
				$valeurs[$id] = $this->bdd->quote($valeur);
287
				$valeurs[$id] = $this->bdd->quote($valeur);
286
			}
288
			}
287
			$sortie = implode(',', $valeurs);
289
			$sortie = implode(',', $valeurs);
288
		}
290
		}
289
		return $sortie;
291
		return $sortie;
290
	}
292
	}
291
	
293
	
292
	protected function traiterParametresPost($params) {
294
	protected function traiterParametresPost($params) {
293
		$sortie = array();
295
		$sortie = array();
294
		foreach ($params as $cle => $valeur) {
296
		foreach ($params as $cle => $valeur) {
295
			$sortie[$cle] = $this->bdd->quote($valeur);
297
			$sortie[$cle] = $this->bdd->quote($valeur);
296
		}
298
		}
297
		return $sortie;
299
		return $sortie;
298
	}
300
	}
299
	
301
	
300
	protected function getIdentification(&$params) {
302
	protected function getIdentification(&$params) {
301
		// Initialisation des variables
303
		// Initialisation des variables
302
		$utilisateur = array(0, session_id());
304
		$utilisateur = array(0, session_id());
303
		
305
		
304
		// L'id utilisateur est soit passé par le POST soit dans l'url
306
		// L'id utilisateur est soit passé par le POST soit dans l'url
305
		if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) {
307
		if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) {
306
		   	$utilisateur[0] = $params['cmhl_ce_modifier_par'];
308
		   	$utilisateur[0] = $params['cmhl_ce_modifier_par'];
307
			unset($params['cmhl_ce_modifier_par']);
309
			unset($params['cmhl_ce_modifier_par']);
308
		} else if (is_string($params)) {
310
		} else if (is_string($params)) {
309
			$utilisateur[0] = $params;
311
			$utilisateur[0] = $params;
310
		}
312
		}
311
		
313
		
312
		return $utilisateur;
314
		return $utilisateur;
313
	}
315
	}
314
	
316
	
315
	protected function etreAutorise($id_utilisateur) {
317
	protected function etreAutorise($id_utilisateur) {
316
		$autorisation = false;
318
		$autorisation = false;
317
		if (!array_key_exists('coel_utilisateur', $_SESSION) || (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur)) {
319
		if (!array_key_exists('coel_utilisateur', $_SESSION) || (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur)) {
318
			$this->messages[] = 'Accès interdit.';
320
			$this->messages[] = 'Accès interdit.';
319
		} else if ($_SESSION['coel_utilisateur'] == '') {    	  
321
		} else if ($_SESSION['coel_utilisateur'] == '') {    	  
320
			$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.';
322
			$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.';
321
		} else {
323
		} else {
322
			$autorisation = true;
324
			$autorisation = true;
323
		}
325
		}
324
		return $autorisation;
326
		return $autorisation;
325
	}
327
	}
326
	
328
	
327
	protected function recupererCle($table) {
329
	protected function recupererCle($table) {
328
		$cle = null;
330
		$cle = null;
329
		if (isset($table['champs_valeurs_id'])) {
331
		if (isset($table['champs_valeurs_id'])) {
330
			$identifiants = array();
332
			$identifiants = array();
331
			// Trie des clés primaire pour avoir toujours le même ordre dans la table historique pour les clés multiples
333
			// Trie des clés primaire pour avoir toujours le même ordre dans la table historique pour les clés multiples
332
			ksort($table['champs_valeurs_id']);
334
			ksort($table['champs_valeurs_id']);
333
		   	foreach ($table['champs_valeurs_id'] as $id) {
335
		   	foreach ($table['champs_valeurs_id'] as $id) {
334
		   		$identifiants[] = $id;
336
		   		$identifiants[] = $id;
335
		   	}
337
		   	}
336
		   	$cle = implode('-', $identifiants);
338
		   	$cle = implode('-', $identifiants);
337
		}
339
		}
338
		return $cle;
340
		return $cle;
339
	}
341
	}
340
	
342
	
341
	protected function avoirCleComplete($table) {
343
	protected function avoirCleComplete($table) {
342
		$cle_complete = false;
344
		$cle_complete = false;
343
		if (isset($table['champs_valeurs_id'])) {
345
		if (isset($table['champs_valeurs_id'])) {
344
		   	$ok = true;
346
		   	$ok = true;
345
			foreach ($table['id'] as $id) {
347
			foreach ($table['id'] as $id) {
346
		   		if (!isset($table['champs_valeurs_id'][$id]) || $table['champs_valeurs_id'][$id] == '') {
348
		   		if (!isset($table['champs_valeurs_id'][$id]) || $table['champs_valeurs_id'][$id] == '') {
347
		   			$ok = false;
349
		   			$ok = false;
348
		   			break;
350
		   			break;
349
		   		}
351
		   		}
350
		   	}
352
		   	}
351
		   	$cle_complete = $ok;
353
		   	$cle_complete = $ok;
352
		}
354
		}
353
		return $cle_complete;
355
		return $cle_complete;
354
	}
356
	}
355
	
357
	
356
	protected function recupererEtat($table) {
358
	protected function recupererEtat($table) {
357
		$etat = 1;// Ajout
359
		$etat = 1;// Ajout
358
		if ($this->avoirEnregistrement($table) === true) {
360
		if ($this->avoirEnregistrement($table) === true) {
359
			$etat = 2;// Modification
361
			$etat = 2;// Modification
360
		}
362
		}
361
		return $etat;
363
		return $etat;
362
	}
364
	}
363
	
365
	
364
	protected function avoirEnregistrement($table) {
366
	protected function avoirEnregistrement($table) {
365
		$avoir_enregistrement = false;
367
		$avoir_enregistrement = false;
366
   		$requete = 	'SELECT * '.
368
   		$requete = 	'SELECT * '.
367
					"FROM {$table['nom']} ".
369
					"FROM {$table['nom']} ".
368
					"WHERE %s ";
370
					"WHERE %s ";
369
   		
371
   		
370
   		$where = $this->construireWhere($table['champs_valeurs_id']);
372
   		$where = $this->construireWhere($table['champs_valeurs_id']);
371
   		$requete = sprintf($requete, $where);
373
   		$requete = sprintf($requete, $where);
372
   		
374
   		
373
	   	// Exécution de la requêtre SQL et test d'éventuelles erreurs
375
	   	// Exécution de la requêtre SQL et test d'éventuelles erreurs
374
		$resultat = $this->bdd->query($requete, PDO::FETCH_ASSOC)->fetch();
376
		$resultat = $this->bdd->query($requete, PDO::FETCH_ASSOC)->fetch();
375
		
377
		
376
		if ($resultat !== false) {
378
		if ($resultat !== false) {
377
			$avoir_enregistrement = true;
379
			$avoir_enregistrement = true;
378
		}
380
		}
379
		return $avoir_enregistrement;
381
		return $avoir_enregistrement;
380
	}
382
	}
381
	
383
	
382
	protected function contenirDonnees($requete) {
384
	protected function contenirDonnees($requete) {
383
		$nbre = $this->bdd->query($requete)->fetchColumn();
385
		$nbre = $this->bdd->query($requete)->fetchColumn();
384
		
386
		
385
		$presence = false;
387
		$presence = false;
386
		if ($nbre != 0) {
388
		if ($nbre != 0) {
387
			$presence = true;
389
			$presence = true;
388
		}
390
		}
389
		return $presence;
391
		return $presence;
390
	}
392
	}
391
	
393
	
392
	protected function construireWhere($table) {
394
	protected function construireWhere($table) {
393
		$where = '1';
395
		$where = '1';
394
	   	if (is_array($table) && count($table) > 0) {
396
	   	if (is_array($table) && count($table) > 0) {
395
			$table_where = array();
397
			$table_where = array();
396
	   		foreach ($table as $chp => $id) {
398
	   		foreach ($table as $chp => $id) {
397
	   			$table_where[] = "$chp = '$id'";
399
	   			$table_where[] = "$chp = '$id'";
398
	   		}
400
	   		}
399
	   		$where = implode(' AND ', $table_where);
401
	   		$where = implode(' AND ', $table_where);
400
	   	}
402
	   	}
401
	   	return $where;
403
	   	return $where;
402
	}
404
	}
403
	
405
	
404
	protected function recupererTablesAModifier($parametres) {
406
	protected function recupererTablesAModifier($parametres) {
405
		$tables_a_modifier = $this->tables;
407
		$tables_a_modifier = $this->tables;
406
   		foreach ($this->tables as $table_id => $table) {
408
   		foreach ($this->tables as $table_id => $table) {
407
   			$tables_a_modifier[$table_id]['champs'] = null;
409
   			$tables_a_modifier[$table_id]['champs'] = null;
408
   			foreach ($parametres as $cle => $valeur) {
410
   			foreach ($parametres as $cle => $valeur) {
409
   				if (preg_match('/^'.$table['prefixe'].'_/', $cle)) {
411
   				if (preg_match('/^'.$table['prefixe'].'_/', $cle)) {
410
   					// Contient les noms des champs seulements
412
   					// Contient les noms des champs seulements
411
   					$tables_a_modifier[$table_id]['champs'][] = $cle;
413
   					$tables_a_modifier[$table_id]['champs'][] = $cle;
412
   					// Contient un tableau de résultats protégé pour l'inclusion en bdd
414
   					// Contient un tableau de résultats protégé pour l'inclusion en bdd
413
   					$tables_a_modifier[$table_id]['champs_valeurs_protege'][$cle] = is_null($valeur) ? 'NULL' : $this->bdd->quote($valeur);
415
   					$tables_a_modifier[$table_id]['champs_valeurs_protege'][$cle] = is_null($valeur) ? 'NULL' : $this->bdd->quote($valeur);
414
   					// Contient un tableau de résultats non protégé
416
   					// Contient un tableau de résultats non protégé
415
   					$tables_a_modifier[$table_id]['champs_valeurs_brut'][$cle] = $valeur;
417
   					$tables_a_modifier[$table_id]['champs_valeurs_brut'][$cle] = $valeur;
416
   					if (preg_match('/_id_/', $cle)) {
418
   					if (preg_match('/_id_/', $cle)) {
417
   						$tables_a_modifier[$table_id]['champs_valeurs_id'][$cle] = $valeur;
419
   						$tables_a_modifier[$table_id]['champs_valeurs_id'][$cle] = $valeur;
418
   					}
420
   					}
419
   				}
421
   				}
420
   			}  
422
   			}  
421
   		}
423
   		}
422
   		return $tables_a_modifier;
424
   		return $tables_a_modifier;
423
	}
425
	}
424
	
426
	
425
 
427
 
426
	protected function mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table) {
428
	protected function mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table) {
427
		if (!is_null($table['champs'])) {
429
		if (!is_null($table['champs'])) {
428
	   		// Historisation (Ajout des méta-données)
430
	   		// Historisation (Ajout des méta-données)
429
	   		$cle = $this->recupererCle($table);
431
	   		$cle = $this->recupererCle($table);
430
	   		$etat = $this->recupererEtat($table);
432
	   		$etat = $this->recupererEtat($table);
431
	   		$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
433
	   		$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
432
			$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
434
			$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
433
			$champ_meta = "{$table['prefixe']}_ce_meta";
435
			$champ_meta = "{$table['prefixe']}_ce_meta";
434
			$table['champs_valeurs_protege'][$champ_meta] = $this->bdd->quote($id_meta);
436
			$table['champs_valeurs_protege'][$champ_meta] = $this->bdd->quote($id_meta);
435
			
437
			
436
			// Mise à jour des données ou ajout en fonction de l'état
438
			// Mise à jour des données ou ajout en fonction de l'état
437
			if ($etat == 1) { // Ajout
439
			if ($etat == 1) { // Ajout
438
				$this->ajouter($table);
440
				$this->ajouter($table);
439
			} else if ($etat == 2) { // Modif
441
			} else if ($etat == 2) { // Modif
440
				$this->modifier($table);
442
				$this->modifier($table);
441
			}
443
			}
442
   		}
444
   		}
443
	}
445
	}
444
	
446
	
445
	protected function ajouter($table) {
447
	protected function ajouter($table) {
446
		$requete = 	"INSERT INTO {$table['nom']} ".
448
		$requete = 	"INSERT INTO {$table['nom']} ".
447
   					' (%s) '.
449
   					' (%s) '.
448
					' VALUES (%s) ';
450
					' VALUES (%s) ';
449
		
451
		
450
		$champs = $valeurs = '';
452
		$champs = $valeurs = '';
451
		foreach ($table['champs_valeurs_protege'] as $chp => $val) {
453
		foreach ($table['champs_valeurs_protege'] as $chp => $val) {
452
			$champs .= "$chp, ";
454
			$champs .= "$chp, ";
453
			$valeurs .= "$val, ";
455
			$valeurs .= "$val, ";
454
		}
456
		}
455
		$requete = sprintf($requete, rtrim($champs, ', '), rtrim($valeurs, ', '));
457
		$requete = sprintf($requete, rtrim($champs, ', '), rtrim($valeurs, ', '));
456
		
458
		
457
		$resultat = $this->bdd->exec($requete);
459
		$resultat = $this->bdd->exec($requete);
458
		$dernier_id = false;
460
		$dernier_id = false;
459
		if ($resultat === false) {
461
		if ($resultat === false) {
460
			$cle = $this->recupererCle($table);
462
			$cle = $this->recupererCle($table);
461
			$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été ajouté car la requête a échouée.";
463
			$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été ajouté car la requête a échouée.";
462
		} else {
464
		} else {
463
			$dernier_id = $this->bdd->lastInsertId();
465
			$dernier_id = $this->bdd->lastInsertId();
464
		}
466
		}
465
		return $dernier_id;
467
		return $dernier_id;
466
	}
468
	}
467
	
469
	
468
	protected function modifier($table) {
470
	protected function modifier($table) {
469
        // nous ne voulons pas qu'une requête malheureuse affecte toute la base de données. Par exemple:
471
        // nous ne voulons pas qu'une requête malheureuse affecte toute la base de données. Par exemple:
470
        // POST "/jrest/CoelStructure/1"<<<"var=val&" // écraserait tous les enregistrements
472
        // POST "/jrest/CoelStructure/1"<<<"var=val&" // écraserait tous les enregistrements
471
        // car on ne peut garantir que tout le code existant wrap'era ses appels dans un if(avoirCleComplete())
473
        // car on ne peut garantir que tout le code existant wrap'era ses appels dans un if(avoirCleComplete())
472
        if(!array_key_exists('champs_valeurs_id', $table)) die('erreur: ' . __FILE__ . ':' . __LINE__);
474
        if(!array_key_exists('champs_valeurs_id', $table)) die('erreur: ' . __FILE__ . ':' . __LINE__);
473
		$requete = 	"UPDATE {$table['nom']} ".
475
		$requete = 	"UPDATE {$table['nom']} ".
474
   					'SET %s '.
476
   					'SET %s '.
475
   					'WHERE %s ';
477
   					'WHERE %s ';
476
		
478
		
477
		$champs_requete = '';
479
		$champs_requete = '';
478
		foreach ($table['champs_valeurs_protege'] as $chp => $val) {
480
		foreach ($table['champs_valeurs_protege'] as $chp => $val) {
479
			$champs_requete .= "$chp = $val, ";
481
			$champs_requete .= "$chp = $val, ";
480
		}
482
		}
481
		$where = $this->construireWhere($table['champs_valeurs_id']);
483
		$where = $this->construireWhere($table['champs_valeurs_id']);
482
		$requete = sprintf($requete, rtrim($champs_requete, ', '), $where);
484
		$requete = sprintf($requete, rtrim($champs_requete, ', '), $where);
483
		$resultat = $this->bdd->exec($requete);
485
		$resultat = $this->bdd->exec($requete);
484
		if ($resultat === false) {
486
		if ($resultat === false) {
485
			$cle = $this->recupererCle($table);
487
			$cle = $this->recupererCle($table);
486
			$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été mis à jour car la requête a échouée.";
488
			$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été mis à jour car la requête a échouée.";
487
		} else {
489
		} else {
488
			$resultat = true;
490
			$resultat = true;
489
		}
491
		}
490
		return $resultat;
492
		return $resultat;
491
	}
493
	}
492
	
494
	
493
	protected function supprimer($table) {
495
	protected function supprimer($table) {
494
		$requete = 	"DELETE FROM {$table['nom']} ".
496
		$requete = 	"DELETE FROM {$table['nom']} ".
495
					'WHERE %s ';
497
					'WHERE %s ';
496
		
498
		
497
		$where = $this->construireWhere($table['champs_valeurs_id']);
499
		$where = $this->construireWhere($table['champs_valeurs_id']);
498
		$requete = sprintf($requete, $where);
500
		$requete = sprintf($requete, $where);
499
		
501
		
500
		$resultat = $this->bdd->exec($requete);
502
		$resultat = $this->bdd->exec($requete);
501
		if ($resultat === false) {
503
		if ($resultat === false) {
502
			$cle = $this->recupererCle($table);
504
			$cle = $this->recupererCle($table);
503
			$this->messages[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été supprimé car la requête a échouée.";
505
			$this->messages[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été supprimé car la requête a échouée.";
504
		} else {
506
		} else {
505
			$resultat = true;
507
			$resultat = true;
506
		}
508
		}
507
		return $resultat;
509
		return $resultat;
508
	}
510
	}
509
	
511
	
510
	private function gererSession($demarrage) {
512
	private function gererSession($demarrage) {
511
		session_name($this->sessionName);
513
		session_name($this->sessionName);
512
 
514
 
513
		// Configuration du cookie de session
515
		// Configuration du cookie de session
514
		// Détermination du chemin pour les cookies nécessaire à Jrest
516
		// Détermination du chemin pour les cookies nécessaire à Jrest
515
		/// ATTENTION : comme les cookies sont passés à Jrest, il faut utiliser l'url de Jrest pour établir le chemin
517
		/// ATTENTION : comme les cookies sont passés à Jrest, il faut utiliser l'url de Jrest pour établir le chemin
516
		$url_morceaux = parse_url($this->config['coel']['urlBaseJrest']);
518
		$url_morceaux = parse_url($this->config['coel']['urlBaseJrest']);
517
		self::$cookieChemin = $this->reparerCheminCookie($url_morceaux['path']);
519
		self::$cookieChemin = $this->reparerCheminCookie($url_morceaux['path']);
518
		unset($url_morceaux);
520
		unset($url_morceaux);
519
		session_set_cookie_params($this->sessionExpireTime, self::$cookieChemin);
521
		session_set_cookie_params($this->sessionExpireTime, self::$cookieChemin);
520
		
522
		
521
		// Démarrage de la session
523
		// Démarrage de la session
522
		if ($demarrage) {
524
		if ($demarrage) {
523
			session_start();
525
			session_start();
524
		}
526
		}
525
	}
527
	}
526
	
528
	
527
	private function reparerCheminCookie($chemin) {
529
	private function reparerCheminCookie($chemin) {
528
		// dirname renvoit / si le chemin vaut seulement /dossier/, cela renvoit /dossier si le chemin vaut /dossier//.
530
		// dirname renvoit / si le chemin vaut seulement /dossier/, cela renvoit /dossier si le chemin vaut /dossier//.
529
		$chemin = dirname($chemin.'/.');
531
		$chemin = dirname($chemin.'/.');
530
		// Fixe la gestion des chemins pour les cookies sous les OS utilisant le \ comme séparteur de chemin
532
		// Fixe la gestion des chemins pour les cookies sous les OS utilisant le \ comme séparteur de chemin
531
		$chemin = str_replace('\\', '/', $chemin);
533
		$chemin = str_replace('\\', '/', $chemin);
532
		// Ajoute un '/' terminal sauf si on est à la racine web
534
		// Ajoute un '/' terminal sauf si on est à la racine web
533
		$chemin = ($chemin != '/' ? $chemin.'/' : '');
535
		$chemin = ($chemin != '/' ? $chemin.'/' : '');
534
		return $chemin;
536
		return $chemin;
535
	}
537
	}
536
	
538
	
537
	private function gererIdentificationPermanente() {
539
	private function gererIdentificationPermanente() {
538
		// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd
540
		// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd
539
		if ($this->getUtilisateur() == '' 
541
		if ($this->getUtilisateur() == '' 
540
				&& isset($_COOKIE['coel_login']) 
542
				&& isset($_COOKIE['coel_login']) 
541
				&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
543
				&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
542
			$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
544
			$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
543
		}
545
		}
544
	}
546
	}
545
	
547
	
546
	/*protected function rechargerCookieUtilisateur() {
548
	/*protected function rechargerCookieUtilisateur() {
547
		$utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login']);
549
		$utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login']);
548
		$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
550
		$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
549
	}*/
551
	}*/
550
	
552
	
551
	protected function getUtilisateur() {
553
	protected function getUtilisateur() {
552
		return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : '');
554
		return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : '');
553
	}
555
	}
554
 
556
 
555
	/**
557
	/**
556
	 * Tente de trouver un utilisateur dans la table Personnes de CoeL, en fonction de son
558
	 * Tente de trouver un utilisateur dans la table Personnes de CoeL, en fonction de son
557
	 * courriel ($login); si le mot de passe est fournie, le vérifie, sinon l'ignore
559
	 * courriel ($login); si le mot de passe est fournie, le vérifie, sinon l'ignore
558
	 * 
560
	 * 
559
	 * MàJ 2017 : le mot de passe n'est plus stocké en local, tout se fait via l'annuaire
561
	 * MàJ 2017 : le mot de passe n'est plus stocké en local, tout se fait via l'annuaire
560
	 */
562
	 */
561
	protected function chargerUtilisateur($login, $mot_de_passe = null) {
563
	protected function chargerUtilisateur($login, $mot_de_passe = null) {
562
		$sortie = false;
564
		$sortie = false;
563
		$requete =	'SELECT cp_id_personne AS id, cp_fmt_nom_complet AS nom_complet, cp_prenom AS prenom, '.
565
		$requete =	'SELECT cp_id_personne AS id, cp_fmt_nom_complet AS nom_complet, cp_prenom AS prenom, '.
564
					'	cp_nom AS nom, cp_login AS login, cp_mot_de_passe AS mot_de_passe, cp_parametre AS parametre, '.
566
					'	cp_nom AS nom, cp_login AS login, cp_mot_de_passe AS mot_de_passe, cp_parametre AS parametre, '.
565
					'	cp_ville AS ville, cp_code_postal AS code_postal, '.
567
					'	cp_ville AS ville, cp_code_postal AS code_postal, '.
566
					'	cp_mark_licence AS licence '.
568
					'	cp_mark_licence AS licence '.
567
					'FROM coel_personne '.
569
					'FROM coel_personne '.
568
					"WHERE cp_login = {$this->bdd->quote($login)} ";
570
					"WHERE cp_login = {$this->bdd->quote($login)} ";
569
					//((!is_null($mot_de_passe)) ? "AND cp_mot_de_passe = {$this->bdd->quote($mot_de_passe)} " : '');
571
					//((!is_null($mot_de_passe)) ? "AND cp_mot_de_passe = {$this->bdd->quote($mot_de_passe)} " : '');
570
		try {
572
		try {
571
			$resultat = $this->bdd->query($requete)->fetch();
573
			$resultat = $this->bdd->query($requete)->fetch();
572
			if ($resultat === false) {
574
			if ($resultat === false) {
573
				$this->debug[] = "L'utilisateur n'est pas enregistré comme utilisateur de COEL.";
575
				$this->debug[] = "L'utilisateur n'est pas enregistré comme utilisateur de COEL.";
574
			} else {
576
			} else {
575
				$sortie = array('id' => $resultat['id'], 
577
				$sortie = array('id' => $resultat['id'], 
576
					'login' => $login, 
578
					'login' => $login, 
577
					'mot_de_passe' => $resultat['mot_de_passe'], 
579
					'mot_de_passe' => $resultat['mot_de_passe'], 
578
					'nom_complet' => $resultat['nom_complet'], 
580
					'nom_complet' => $resultat['nom_complet'], 
579
					'nom' => $resultat['nom'], 
581
					'nom' => $resultat['nom'], 
580
					'prenom' => $resultat['prenom'], 
582
					'prenom' => $resultat['prenom'], 
581
					'parametre' => $resultat['parametre'],
583
					'parametre' => $resultat['parametre'],
582
					'ville' => $resultat['ville'], 
584
					'ville' => $resultat['ville'], 
583
					'code_postal' => $resultat['code_postal'],  
585
					'code_postal' => $resultat['code_postal'],  
584
					'licence' => $resultat['licence']);
586
					'licence' => $resultat['licence']);
585
			}
587
			}
586
		} catch (PDOException $e) {
588
		} catch (PDOException $e) {
587
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
589
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
588
		}
590
		}
589
		
591
		
590
		return $sortie;
592
		return $sortie;
591
	}
593
	}
592
 
594
 
593
	/**
595
	/**
594
	 * Définit un utilisateur comme "actif" en plaçant un objet Utilisateur dans la session;
596
	 * Définit un utilisateur comme "actif" en plaçant un objet Utilisateur dans la session;
595
	 * Ne pose plus de cookies depuis l'adaptation au SSO, sauf pour la licence (acceptée ou non)
597
	 * Ne pose plus de cookies depuis l'adaptation au SSO, sauf pour la licence (acceptée ou non)
596
	 * @param unknown $utilisateur
598
	 * @param unknown $utilisateur
597
	 * @param number $permanence
599
	 * @param number $permanence
598
	 */
600
	 */
599
	protected function setUtilisateur($utilisateur, $permanence = 1) {
601
	protected function setUtilisateur($utilisateur, $permanence = 1) {
600
		$_SESSION['coel_utilisateur'] = $utilisateur;
602
		$_SESSION['coel_utilisateur'] = $utilisateur;
601
		//$this->setCookiePersistant('coel_licence', $utilisateur['licence'], $permanence);
603
		//$this->setCookiePersistant('coel_licence', $utilisateur['licence'], $permanence);
602
	}
604
	}
603
	
605
	
604
	protected function setCookiePersistant($cookie_nom, $valeur, $permanence = 1) {
606
	protected function setCookiePersistant($cookie_nom, $valeur, $permanence = 1) {
605
		setCookie($cookie_nom, $valeur, time() + ($permanence ? 100*24*60*60 : 60*60), self::$cookieChemin);
607
		setCookie($cookie_nom, $valeur, time() + ($permanence ? 100*24*60*60 : 60*60), self::$cookieChemin);
606
		$_COOKIE[$cookie_nom] = $valeur;
608
		$_COOKIE[$cookie_nom] = $valeur;
607
	}
609
	}
608
	
610
	
609
	protected function supprimerCookie($cookie_nom) {
611
	protected function supprimerCookie($cookie_nom) {
610
		setCookie($cookie_nom, '', 1, self::$cookieChemin);
612
		setCookie($cookie_nom, '', 1, self::$cookieChemin);
611
		$_COOKIE[$cookie_nom] = '';
613
		$_COOKIE[$cookie_nom] = '';
612
	}
614
	}
613
	
615
	
614
	/**
616
	/**
615
	 * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
617
	 * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
616
	 * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
618
	 * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
617
	 *
619
	 *
618
	 * @param String $fichier	le chemin du fichier du squelette
620
	 * @param String $fichier	le chemin du fichier du squelette
619
	 * @param Array  $donnees	un tableau associatif contenant les variables a injecter dans le squelette.
621
	 * @param Array  $donnees	un tableau associatif contenant les variables a injecter dans le squelette.
620
	 *
622
	 *
621
	 * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
623
	 * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
622
	 */
624
	 */
623
	public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
625
	public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
624
		$sortie = false;
626
		$sortie = false;
625
		if (file_exists($fichier)) {
627
		if (file_exists($fichier)) {
626
			// Extraction des variables du tableau de données
628
			// Extraction des variables du tableau de données
627
			extract($donnees);
629
			extract($donnees);
628
			// Démarage de la bufferisation de sortie
630
			// Démarage de la bufferisation de sortie
629
			ob_start();
631
			ob_start();
630
			// Si les tags courts sont activés
632
			// Si les tags courts sont activés
631
			if ((bool) @ini_get('short_open_tag') === true) {
633
			if ((bool) @ini_get('short_open_tag') === true) {
632
				// Simple inclusion du squelette
634
				// Simple inclusion du squelette
633
				include $fichier;
635
				include $fichier;
634
			} else {
636
			} else {
635
				// Sinon, remplacement des tags courts par la syntaxe classique avec echo
637
				// Sinon, remplacement des tags courts par la syntaxe classique avec echo
636
				$html_et_code_php = self::traiterTagsCourts($fichier);
638
				$html_et_code_php = self::traiterTagsCourts($fichier);
637
				// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
639
				// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
638
				$html_et_code_php = '?>'.$html_et_code_php;
640
				$html_et_code_php = '?>'.$html_et_code_php;
639
				// Interprétation du html et du php dans le buffer
641
				// Interprétation du html et du php dans le buffer
640
				echo eval($html_et_code_php);
642
				echo eval($html_et_code_php);
641
			}
643
			}
642
			// Récupèration du contenu du buffer
644
			// Récupèration du contenu du buffer
643
			$sortie = ob_get_contents();
645
			$sortie = ob_get_contents();
644
			// Suppression du buffer
646
			// Suppression du buffer
645
			@ob_end_clean();
647
			@ob_end_clean();
646
		} else {
648
		} else {
647
			$msg = "Le fichier du squelette '$fichier' n'existe pas.";
649
			$msg = "Le fichier du squelette '$fichier' n'existe pas.";
648
			trigger_error($msg, E_USER_WARNING);
650
			trigger_error($msg, E_USER_WARNING);
649
		}
651
		}
650
		// Retourne le contenu
652
		// Retourne le contenu
651
		return $sortie;
653
		return $sortie;
652
	}
654
	}
653
	
655
	
654
	/**
656
	/**
655
	 * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
657
	 * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
656
	 *
658
	 *
657
	 * @param String $chemin_squelette le chemin du fichier du squelette
659
	 * @param String $chemin_squelette le chemin du fichier du squelette
658
	 *
660
	 *
659
	 * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
661
	 * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
660
	 */
662
	 */
661
	private static function traiterTagsCourts($chemin_squelette) {
663
	private static function traiterTagsCourts($chemin_squelette) {
662
		$contenu = file_get_contents($chemin_squelette);
664
		$contenu = file_get_contents($chemin_squelette);
663
		// Remplacement de tags courts par un tag long avec echo
665
		// Remplacement de tags courts par un tag long avec echo
664
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
666
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
665
		// Ajout systématique d'un point virgule avant la fermeture php
667
		// Ajout systématique d'un point virgule avant la fermeture php
666
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
668
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
667
		return $contenu;
669
		return $contenu;
668
	}
670
	}
669
	
671
	
670
	public static function debug($var) {
672
	public static function debug($var) {
671
		echo '<pre>'.print_r($var, true).'</pre>';
673
		echo '<pre>'.print_r($var, true).'</pre>';
672
	}
674
	}
673
 
675
 
674
	/*
676
	/*
675
	 * Retourne une paire de coordonnée depuis un tableau représentant une adresse
677
	 * Retourne une paire de coordonnée depuis un tableau représentant une adresse
676
	 * ou une adresse partielle à l'aide du service Nominatim.
678
	 * ou une adresse partielle à l'aide du service Nominatim.
677
	 * (http://wiki.openstreetmap.org/wiki/Nominatim)
679
	 * (http://wiki.openstreetmap.org/wiki/Nominatim)
678
	 *
680
	 *
679
	 * @param in data: un tableau associatif doté de *toutes* les clefs suivantes:
681
	 * @param in data: un tableau associatif doté de *toutes* les clefs suivantes:
680
	 * 				   'adresse', 'cp', 'ville', 'pays'
682
	 * 				   'adresse', 'cp', 'ville', 'pays'
681
	 * @param out lonlat: un tableau associatif contenant 'lon' et 'lat' si elles ont été déterminées
683
	 * @param out lonlat: un tableau associatif contenant 'lon' et 'lat' si elles ont été déterminées
682
	 *					  Celles-ci sont sous la forme de deux chaînes de caractères numériques représentant
684
	 *					  Celles-ci sont sous la forme de deux chaînes de caractères numériques représentant
683
	 *					  un FLOAT() dont le séparateur des décimales est le "." (point).
685
	 *					  un FLOAT() dont le séparateur des décimales est le "." (point).
684
	 * @param in opts: un tableau associatif optionnel écrasant ou ajoutant des valeurs d'API
686
	 * @param in opts: un tableau associatif optionnel écrasant ou ajoutant des valeurs d'API
685
	 * @return boolean: selon que la fonction à réussi ou non
687
	 * @return boolean: selon que la fonction à réussi ou non
686
	 *
688
	 *
687
	 * opts['force-q']: force l'utilisation d'une requête en texte libre
689
	 * opts['force-q']: force l'utilisation d'une requête en texte libre
688
	 * 					quelque soit le remplissage des composants individuels
690
	 * 					quelque soit le remplissage des composants individuels
689
	 *
691
	 *
690
	 * Note: le code postal est contre-productif pour Nominatim:
692
	 * Note: le code postal est contre-productif pour Nominatim:
691
	 * https://lists.openstreetmap.org/pipermail/talk-fr/2013-April/057084.html
693
	 * https://lists.openstreetmap.org/pipermail/talk-fr/2013-April/057084.html
692
	 */
694
	 */
693
	static function coordGuess(Array $data, Array &$lonlat, Array $opts = NULL) {
695
	static function coordGuess(Array $data, Array &$lonlat, Array $opts = NULL) {
694
		if(!$data) return FALSE;
696
		if(!$data) return FALSE;
695
		$common_query = array('accept_language' => 'fr', 'format' => 'json', 'limit' => 1);
697
		$common_query = array('accept_language' => 'fr', 'format' => 'json', 'limit' => 1);
696
		if(! $data['adresse'] || (! $data['cp'] && ! $data['ville']) || @$opts['force-q']) {
698
		if(! $data['adresse'] || (! $data['cp'] && ! $data['ville']) || @$opts['force-q']) {
697
			unset($opts['force-q']);
699
			unset($opts['force-q']);
698
			$query = array_merge($common_query,
700
			$query = array_merge($common_query,
699
								 array('q' => implode(', ', array_filter($data))),
701
								 array('q' => implode(', ', array_filter($data))),
700
								 $opts ? $opts : array());
702
								 $opts ? $opts : array());
701
		}
703
		}
702
		else {
704
		else {
703
			$query = array_merge($common_query,
705
			$query = array_merge($common_query,
704
								 array_filter(array('street' => $data['adresse'],
706
								 array_filter(array('street' => $data['adresse'],
705
													'city' => $data['ville'],
707
													'city' => $data['ville'],
706
													'postalcode' => $data['cp'],
708
													'postalcode' => $data['cp'],
707
													'country' => $data['pays'])),
709
													'country' => $data['pays'])),
708
								 $opts ? $opts : array());
710
								 $opts ? $opts : array());
709
		}
711
		}
710
		$fullquery = 'http://nominatim.openstreetmap.org/search.php?' . http_build_query($query);
712
		$fullquery = 'http://nominatim.openstreetmap.org/search.php?' . http_build_query($query);
711
 
713
 
712
        $ctx = stream_context_create(array('http' => array( 'timeout' => '4' )));
714
        $ctx = stream_context_create(array('http' => array( 'timeout' => '4' )));
713
        $r = json_decode(file_get_contents($fullquery, FALSE, $ctx));
715
        $r = json_decode(file_get_contents($fullquery, FALSE, $ctx));
714
		error_log(sprintf("COEL: Nominatim request returned %d result(s) [%s]", count($r), $fullquery));
716
		error_log(sprintf("COEL: Nominatim request returned %d result(s) [%s]", count($r), $fullquery));
715
		if($r && isset($r[0])) {
717
		if($r && isset($r[0])) {
716
			$lonlat['lon'] = $r[0]->lon;
718
			$lonlat['lon'] = $r[0]->lon;
717
			$lonlat['lat'] = $r[0]->lat;
719
			$lonlat['lat'] = $r[0]->lat;
718
			return TRUE;
720
			return TRUE;
719
		}
721
		}
720
		return FALSE;
722
		return FALSE;
721
	}
723
	}
722
 
724
 
723
	/*
725
	/*
724
	 * Retourne un tableau prêt à être utilisé par coordGuess(), c'est à dire initialisant toutes
726
	 * Retourne un tableau prêt à être utilisé par coordGuess(), c'est à dire initialisant toutes
725
	 * les clefs nécessaires (même si NULL) et disposant systématiquement d'un pays.
727
	 * les clefs nécessaires (même si NULL) et disposant systématiquement d'un pays.
726
	 * Cela à partir d'un tableau au format de clefs prédéterminé.
728
	 * Cela à partir d'un tableau au format de clefs prédéterminé.
727
	 * S'occupe du filtrage basique des éléments pour maximiser les chances de détection.
729
	 * S'occupe du filtrage basique des éléments pour maximiser les chances de détection.
728
	 *
730
	 *
729
	 * @param in: un tableau associatif contenant les clefs telles que nommées à l'issue du
731
	 * @param in: un tableau associatif contenant les clefs telles que nommées à l'issue du
730
	 * 				du formulaire de saisie: 'cs_adresse_01', 'cs_code_postal', 'cs_ville'
732
	 * 				du formulaire de saisie: 'cs_adresse_01', 'cs_code_postal', 'cs_ville'
731
	 * @param db: une db optionnelle, utilisée si nécessaire pour converir les code pays
733
	 * @param db: une db optionnelle, utilisée si nécessaire pour converir les code pays
732
	 * 				du formulaire de saisie: 'cs_adresse_01', 'cs_code_postal', 'cs_ville'
734
	 * 				du formulaire de saisie: 'cs_adresse_01', 'cs_code_postal', 'cs_ville'
733
	 * @return un tableau associatif contenant une ou plusieurs des clefs suivantes:
735
	 * @return un tableau associatif contenant une ou plusieurs des clefs suivantes:
734
	 *			'adresse', 'cp', 'ville', 'pays'
736
	 *			'adresse', 'cp', 'ville', 'pays'
735
	 */
737
	 */
736
	static function addrReStruct(Array $in, $db = NULL) {
738
	static function addrReStruct(Array $in, $db = NULL) {
737
        $pays = FALSE;
739
        $pays = FALSE;
738
		if(is_numeric(@$in['cs_ce_truk_pays'])) {
740
		if(is_numeric(@$in['cs_ce_truk_pays'])) {
739
            if($db) {
741
            if($db) {
740
                $pays= $db->query(sprintf(
742
                $pays= $db->query(sprintf(
741
                    "SELECT cmlv_nom FROM coel_meta_liste_valeur ".
743
                    "SELECT cmlv_nom FROM coel_meta_liste_valeur ".
742
                    "WHERE cmlv_ce_parent = 1074 AND cmlv_id_valeur = %d",
744
                    "WHERE cmlv_ce_parent = 1074 AND cmlv_id_valeur = %d",
743
                    intval($in['cs_ce_truk_pays'])))->fetchColumn();
745
                    intval($in['cs_ce_truk_pays'])))->fetchColumn();
744
            }
746
            }
745
        }
747
        }
746
        else $pays = @trim($in['cs_ce_truk_pays']);
748
        else $pays = @trim($in['cs_ce_truk_pays']);
747
 
749
 
748
		// pas de précision au n°, mais Nominatim peine avec des préfixes trop élaborés
750
		// pas de précision au n°, mais Nominatim peine avec des préfixes trop élaborés
749
		// coupons jusqu'à un élément reconnaissable s'il existe
751
		// coupons jusqu'à un élément reconnaissable s'il existe
750
		$adresse = @trim($in['cs_adresse_01']);
752
		$adresse = @trim($in['cs_adresse_01']);
751
		$adresse = substr($adresse, stripos($adresse, "ville de "));
753
		$adresse = substr($adresse, stripos($adresse, "ville de "));
752
		$adresse = substr($adresse, stripos($adresse, "impasse"));
754
		$adresse = substr($adresse, stripos($adresse, "impasse"));
753
		$adresse = substr($adresse, stripos($adresse, "chemin"));
755
		$adresse = substr($adresse, stripos($adresse, "chemin"));
754
		$adresse = substr($adresse, stripos($adresse, "route"));
756
		$adresse = substr($adresse, stripos($adresse, "route"));
755
		$adresse = substr($adresse, stripos($adresse, "rue"));
757
		$adresse = substr($adresse, stripos($adresse, "rue"));
756
		$adresse = substr($adresse, stripos($adresse, "avenue"));
758
		$adresse = substr($adresse, stripos($adresse, "avenue"));
757
		$adresse = substr($adresse, stripos($adresse, "boulevard"));
759
		$adresse = substr($adresse, stripos($adresse, "boulevard"));
758
		$adresse = substr($adresse, stripos($adresse, "place"));
760
		$adresse = substr($adresse, stripos($adresse, "place"));
759
		$adresse = substr($adresse, stripos($adresse, "promenade"));
761
		$adresse = substr($adresse, stripos($adresse, "promenade"));
760
		$adresse = substr($adresse, stripos($adresse, "allée"));
762
		$adresse = substr($adresse, stripos($adresse, "allée"));
761
		$adresse = substr($adresse, stripos($adresse, "cours"));
763
		$adresse = substr($adresse, stripos($adresse, "cours"));
762
		$adresse = preg_replace("/[\r\n].*/", "", $adresse);
764
		$adresse = preg_replace("/[\r\n].*/", "", $adresse);
763
 
765
 
764
		$ville = preg_replace('/cedex.*/i', '', @trim($in['cs_ville']));
766
		$ville = preg_replace('/cedex.*/i', '', @trim($in['cs_ville']));
765
		return array(
767
		return array(
766
			'adresse' => $adresse,
768
			'adresse' => $adresse,
767
			'cp' => @trim($in['cs_code_postal']) ? $in['cs_code_postal'] : '',
769
			'cp' => @trim($in['cs_code_postal']) ? $in['cs_code_postal'] : '',
768
			'ville' => $ville,
770
			'ville' => $ville,
769
			'pays' =>  $pays !== FALSE ? $pays : 'France'
771
			'pays' =>  $pays !== FALSE ? $pays : 'France'
770
		);
772
		);
771
	}
773
	}
772
}
774
}
773
?>
-
 
774
775
?>
-
 
776