Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev Author Line No. Line
6 jpm 1
<?php
2
/**
3
* Description :
4
* Classe Observations.php permettant de fournir des informations sur les observations.
5
* Si l'url finit par /observations on retourne une liste d'observations (seulement les 100 premières par défaut) :
6
* espèce, lieu, date, observateur.
7
* L'url peut contenir des paramètres optionnels passés après le ? : /observations?param1=val1&param2=val2&...
8
*
9
* Les paramètres de requête disponibles sont : masque, masque.type (type d'observation : chorologie),
10
* masque.date_observation (date d'observation), masque.station (département), masque.determination (nom scientifique de l'espèce)
11
* masque.observateur (prénom, nom), masque.nn (identifiant du nom), recherche, distinct, retour.format,
12
* navigation.depart et navigation.limite.
13
*
14
* Encodage en entrée : utf8
15
* Encodage en sortie : utf8
16
* @package framework-v3
17
* @author Delphine Cauquil <delphine@tela-botanica.org>
18
* @author Jennifer Dhé <jennifer.dhe@tela-botanica.org>
19
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
20
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
21
* @version 1.0
22
* @copyright 1999-${year} Tela Botanica (accueil@tela-botanica.org)
23
*/
24
 
25
class Observations extends Commun {
26
 
236 delphine 27
	protected $serviceNom = 'observations';
6 jpm 28
 
29
	/** Stockage des paramétres */
30
	protected $table_param = array();
31
	/** Valeur du paramètre de requete recherche :
32
	 *  - stricte : le masque est passé tel quel à l'opérateur LIKE.
33
	 *  - etendue : ajout automatique du signe % à la place des espaces et en fin de masque avec utilisation de LIKE.
34
	 *  - floue : recherche tolérante vis-à-vis d'approximations ou d'erreurs (fautes d'orthographe par exemple) */
35
	protected $recherche = 'stricte';
36
	/** Valeur du paramètre de requete distinct (=0|1)
37
	 * Indique que l'on veut les noms distincts (par défaut tous les noms, même semblable, sont renvoyés)	 */
38
	protected $distinct = null;
39
	protected $retour_format = 'max';
40
	protected $presenceChorologie = '';
41
 
42
	/** Variables constituant les parametres de la requete SQL (champ, condition, group by, limit) remplie
43
	 * selon ressources et paramètres	 */
44
	protected $requete_champ = ' id, num_nom, nom_sci ';
45
	protected $requete_condition = array();
46
	/** Une observation est défini par départ qui correspont à un num_nom et dept qui correspond à un departement	 */
47
	protected $limite_requete 	 = array(
48
		'depart' => 0,
49
		'dept' => 01,
50
		'limite' => 20
51
	);
52
 
53
	/**
54
	 * Permet de stocker la requete formulée :
55
	 *   - noms | noms/#id | noms/#id/#champ+#champ
56
	 *   - noms/#id/relations | noms/#id/relations/synonymie | noms/#id/relations/homonymie | noms/#id/relations/flores
57
	 *   - noms/stats/rangs | noms/stats/annees | noms/stats/initiales
58
	 * Est remplit au cours de l'analyse des ressources (traiterRessources()).
59
	 * Est utilisée principalement pr déterminer le format du tableau à retourner.
60
	 */
61
	protected $format_reponse = 'observations';
62
 
63
// +-------------------------------------------------------------------------------------------------------------------+
64
	public function consulter($ressources, $parametres) {
251 delphine 65
		$this->parametres = $parametres;
6 jpm 66
		$this->traiterVersionProjet($ressources);
67
		$this->traiterRessources($ressources);
68
		$resultat_formate = '';
69
 
70
		if ($this->corps_http == '' && $this->entete_http == '') {
71
			foreach ($this->table_version as $version) {
72
				$this->table = $version; //on stocke le nom de la table correspondant à la version du projet en cours
73
				$this->traiterParametres($parametres);
74
				$requete = $this->assemblerLaRequete(); //print_r($requete);
75
				$resultat = $this->getBdd()->recupererTous($requete);
262 delphine 76
				$res_version = $this->testerResultat($resultat, $requete);
6 jpm 77
			}
78
			if ($this->corps_http == '' && $this->entete_http == '') {
79
				if (isset($res_version)) {
236 delphine 80
					$resultat_formate = $res_version;
6 jpm 81
				}
82
			}
83
		}
236 delphine 84
		return $resultat_formate;
6 jpm 85
	}
86
 
262 delphine 87
	public function testerResultat($resultat, $requete) {
6 jpm 88
		if ($resultat == '') { //cas ou la requete comporte des erreurs
262 delphine 89
			$s = 'La requête SQL resultat formée comporte une erreur !!';
6 jpm 90
			Debug::printr($requete);
91
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $s);
92
		} elseif ($resultat) {
93
			if (count($this->table_version) > 1) {
94
				$res_version[$version] = $this->retournerResultatFormate($resultat);
95
			} else {
96
				$res_version = $this->retournerResultatFormate($resultat);
97
			}
98
		} else {
99
			if ($this->format_reponse == 'zone-geo/id/relations') {
100
			//si aucune relations n'existe, la valeur null est retournée
101
				$res_version = null;
102
			} else {
103
				$d = 'Données recherchées introuvables dans la base';
104
				$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $d);
105
				Debug::printr($requete);
106
			}
107
		}
108
		return $res_version;
109
	}
110
 
111
	public function assemblerLaRequete() {
112
		$requete = "SELECT ".$this->formerRequeteChamp().
113
			" FROM ".$this->table.$this->formerRequeteCondition().
251 delphine 114
			' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];//echo $requete;
6 jpm 115
		return $requete;
116
	}
117
 
118
	public function formerRequeteChamp() {
119
		if (!isset($this->table_ressources)) {
120
			if (!isset($this->table_param['masque_station']) && !isset($this->table_param['masque_contributeur']) ) {
121
				$champ = ' * ';
122
			} else {
123
				$champ = $this->requete_champ;
124
			}
125
		} else {
126
			$champ = $this->requete_champ;
127
		}
128
		return $champ;
129
	}
130
 
131
	public  function formerRequeteCondition() {
132
		$condition = '';
133
		if ($this->requete_condition != null) {
134
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
135
		}
136
		return $condition;
137
	}
138
 
139
// +-------------------------------------------------------------------------------------------------------------------+
140
	public function traiterRessources(&$ressources) {
141
		if (isset($ressources) && !empty($ressources)) {
142
			$this->table_ressources = $ressources;
143
			if (isset($this->table_ressources[0]) && !empty($this->table_ressources[0])) {
144
				$this->traiterRessourceId();
145
				if (isset($this->table_ressources[1]) && !empty($this->table_ressources[1])) {
146
					$this->traiterRessourceChamp;
147
				}
148
			}
149
		}
150
	}
151
 
152
	public function traiterRessourceId() {
153
		//requete : /observations/#num_nom:#dept (ex : /observations/10:34)
154
		if (preg_match('/^([0-9]*):([0-9]{2})$/', $this->table_ressources[0], $conditions)) {
155
			$this->requete_condition[] = ' num_nom = '.$this->getBdd()->proteger($conditions[1]).' AND `'.$conditions[2]."` != '' ";
156
			$this->requete_champ .= ' ,catminat, rang, num_tax, freq_abs, freq_rel, rare_nat, `'.$conditions[2].'`';
157
			$this->format_reponse .= '/id';
158
 
159
		//requete : /observations/nom:#dept (ex : /observations/coquelicot:30)
160
		} elseif (preg_match('/^(.*):([0-9]{2})$/', $this->table_ressources[0], $conditions)) {
161
			$this->requete_condition[] = ' nom_sci like '.$this->getBdd()->proteger($conditions[1].'%').' AND `'.$conditions[2]."` != '' ";
162
			$this->requete_champ .= ' ,catminat, rang, num_tax, freq_abs, freq_rel, rare_nat, `'.$conditions[2].'`';
163
			$this->format_reponse .= '/id';
164
		//requete : /observations/num_nom:#num_nom (ex : /observations/num_nom:290) ??
165
		} elseif (strrpos($this->table_ressources[0], ':') !== false) {
166
 
167
		} else {
168
			$r = 'Erreur dans les ressources de votre requête : </br> La ressource " '.$this->table_ressources[0].
169
				' " n\'existe pas.';
170
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $r);
171
		}
172
	}
173
 
174
// +-------------------------------------------------------------------------------------------------------------------+
175
	public function traiterParametres($parametres) {
176
		if (isset($parametres) && !empty($parametres)) {
177
			$this->table_param = $parametres;
178
 
179
			if (isset($parametres['recherche']) && $parametres['recherche'] != '') {
180
				$this->recherche = $parametres['recherche'];
181
			}
182
			foreach ($parametres as $param => $valeur) {
183
				switch ($param) {
184
					case 'masque' 				: $this->ajouterLeFiltreMasque($valeur);						break;
246 delphine 185
					case 'masque.date.observation' : 															break;
186
					case 'masque.station'		: $this->limite_requete['dept'] = $valeur;
6 jpm 187
													$this->ajouterUnFiltre('station', $valeur);					break;
246 delphine 188
					case 'masque.determination'	: $this->ajouterUnFiltre('nom_sci', $valeur);					break;
189
					case 'masque.determination.nn' :
6 jpm 190
							$this->requete_condition[] = '`num_nom` = '.$this->getBdd()->proteger($valeur);		break;
246 delphine 191
					case 'masque.observateur'	: $this->ajouterLeFiltreContributeur($valeur);					break;
192
					case 'masque.valeur' 		: $this->presenceChorologie = $valeur;							break;
193
					case 'retour.format'		: $this->retour_format = $valeur;								break;
194
					case 'navigation.depart'	: $this->ajouterLimiteDepart($valeur);							break;
195
					case 'navigation.limite'	: $this->limite_requete['limite'] = $valeur;					break;
6 jpm 196
					case 'recherche'			: 																break;
197
					default						:  $p = 'Erreur dans les paramètres de recherche de votre requête : '.
198
													'</br> Le paramètre " '.$param.' " n\'existe pas.';
199
												$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $p); break;
200
				}
201
			}
202
		}
203
	}
204
 
205
	/** fonction d'ajout dans la requete SQL des conditions (WHERE ...) en fonctions des parametres demandés
206
	 * @param $nom_champ
207
	 * @param $valeur
208
	 * @param $masque
209
	 */
210
	public function ajouterUnFiltre($nom_champ, $valeur) {
211
		if ($nom_champ == 'station') {
212
			if (!preg_match('/^\s*([0-9]{2})\s*$/', $valeur, $colonne)) { // si le nom est passé
213
				$this->requete_condition[] = '1';
214
						/*	$url = $this->ajouterHrefAutreProjet('zone-geo',$key,'INSEE-D');// d'apres nom
215
				$dept = $this->rest_client->consulter($url);
216
				$entete = $this->rest_client->getReponseEntetes();
217
				if (isset($entete['wrapper_data'])) {
218
					$colonne = json_decode($relation);
219
				} else {
220
					$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,
221
						'Le service '.$this->service.' de ce projet comporte des erreurs. url lancée : '.$url);
222
				}*/
223
			} else {
224
				$this->requete_condition[] = '`'.$valeur."` != '' ";
225
				$this->requete_champ .= ', `'.$valeur.'` ';
226
			}
227
		} else {
228
		// recherche floue
229
			if ($this->recherche == 'floue') {//ajout_soundex
230
				$this->requete_condition[] = '(SOUNDEX('.$nom_champ.') = SOUNDEX(\''.$valeur.'\')'
231
					.' OR SOUNDEX(REVERSE('.$nom_champ.')) = SOUNDEX(REVERSE(\''.$valeur.'\'))) ';
232
		// recherche étendue
233
			} elseif ($this->recherche == 'etendue') {
234
				$valeur = str_replace(' ','%', $valeur);
235
				$valeur .= '%';
236
			}
237
		// recherche stricte
238
			$this->requete_condition[] = $nom_champ.' LIKE '.$this->getBdd()->proteger($valeur);
239
		}
240
	}
241
 
242
	/** fonction d'ajout dans la requete SQL des conditions (WHERE ...) quand le paramètre passé est masque
243
	 * @param $valeur
244
	 */
245
	public function ajouterLeFiltreMasque($valeur) {
246
		$this->ajouterUnfiltre('station', $valeur);
247
		$condition = '(( '.array_pop($this->requete_condition);
248
		$this->ajouterUnfiltre('num_nom', $valeur);
249
		$condition .= ' ) OR ('.array_pop($this->requete_condition);
250
		$condition = str_replace('( 1 ) OR', '', $condition); // si la valeur passée est une varchar supprime le filtre station
251
		$this->ajouterUnfiltre('nom_sci', $valeur);
252
		$this->requete_condition[] = $condition.' ) OR ('.array_pop($this->requete_condition).' )) ';
253
	}
254
 
255
	/** fonction d'ajout dans la requete SQL des conditions (WHERE ...) quand le paramètre passé est masque.contributeur
256
	 * @param $valeur
257
	 */
258
	public function ajouterLeFiltreContributeur($valeur) {
259
		$requete_contr = $this->creerRequeteContributeur($valeur);
260
		$res = $this->getBdd()->recupererTous($requete_contr);
261
		if ($res == '') { //cas ou la requete comporte des erreurs
262
			$c = 'La requête SQL formée comporte une erreur !!';
263
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $c);
264
			Debug::printr($requete_contr);
265
		} elseif ($res) {
266
			unset($res[0]['id'],$res[0]['nom'],$res[0]['prenom'],$res[0]['courriel']);
267
			// si il y a un masque station et que le contributeur n'a pas de données dans ce dept
268
			if (isset($this->table_param['masque_station']) && isset($res[0][$this->table_param['masque_station']])) {
269
				if ($res[0][$this->table_param['masque_station']] != 1) {
270
					$d = "Les données recherchées sont introuvables pour l'observateur ".$valeur." dans le département "
271
						.$this->table_param['masque_station'];
272
					$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $d);
273
				}
274
			} else {
275
				foreach ($res[0] as $dept=>$presence) {
276
					if ($presence == 1) {
277
						$this->ajouterUnfiltre('station', $dept);
278
						$requete_condition[] = array_pop($this->requete_condition); // recupere le filtre créé précédement
279
					}
280
				}
281
				$this->requete_condition[] = '(( '.implode(' ) OR ( ', $requete_condition).' ))'; // créé un filtre sur les dept
282
			}
283
		} else {
284
			$i = "Les données recherchées sont introuvables pour l'observateur ".$valeur;
285
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $i);
286
		}
287
	}
288
 
289
	public function creerRequeteContributeur($valeur) {
290
		$condition = '';
291
		if (preg_match('/(.*@[a-z]+\.[a-z]{2,3})/', $valeur, $match)) {// cherche sur le mail
292
			$condition = 'courriel = '.$this->getBdd()->proteger($match[1]);
293
		} elseif (preg_match('/^(\w+)\s+(\w+)$/', $valeur, $match)) {// cherche sur les nom prenom
294
			$condition = ' ((nom = '.$this->getBdd()->proteger($match[1]).' OR prenom = '.$this->getBdd()->proteger($match[1]).
295
				' ) AND (nom = '.$this->getBdd()->proteger($match[2]).' OR prenom = '.$this->getBdd()->proteger($match[2]).'))'.
296
				' OR ( nom LIKE '.$this->getBdd()->proteger($valeur.'%').')';
297
		} else {// cherche si nom association
298
			$condition = 'nom LIKE '.$this->getBdd()->proteger($valeur.'%');
299
		}
300
		list($table, $version) = explode('_v',$this->table);
301
		$requete_contr = "SELECT * FROM chorodep_contributeurs_v$version WHERE ".$condition;
302
	}
303
 
304
	public function ajouterLimiteDepart($id) {
305
		$d = explode(":", $id);
306
		$this->limite_requete['depart'] = 0;
307
		$this->limite_requete['dept'] = $d[1];
308
		$requete_condition = (is_numeric($d[0])) ? '`num_nom` = '.$d[0]  : '`nom_sci` like "'.urldecode($d[0]).'%"';
251 delphine 309
		$requete = "SELECT id FROM $this->table WHERE ".$requete_condition;
6 jpm 310
		$res = $this->getBdd()->recuperer($requete);
311
		if ($res == '') { //cas ou la requete comporte des erreurs
312
			$r = 'La requête SQL formée comporte une erreur !!';
313
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r);
314
			Debug::printr($requete);
315
		} elseif ($res) {
316
			$this->limite_requete['depart'] = $res['id'] - 1;
317
		} else {
318
			$i = "Les données recherchées sont introuvables";
319
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $i);
320
		}
321
	}
322
 
323
// +-------------------------------------------------------------------------------------------------------------------+
324
	public function retournerResultatFormate($resultat) {
325
		$this->table_retour = array(); // stocke les données générales d'une observation et écrase les données d'un dep
326
		$this->chargerInfosGenerales();
327
		switch ($this->format_reponse) {
328
			case 'observations' 		: $reponse = $this->formaterObservations($resultat); 			 break;
329
			case 'observations/id' 		: $reponse = $this->formaterObservationsId($resultat[0]); 	 break;
330
			case 'observations/id/champ': $reponse = $this->formaterObservationsIdChamp($resultat[0]); break;
331
			default : break;
332
		}
333
		return $reponse;
334
	}
335
 
336
 
337
	public function formaterObservations($resultat) {
338
		$num = 0; // compte le nombre d'observations pour retourner le nombre d'obs indiqué
339
		$depart = false; //le depart du resultat est noté ss forme #ligne:#departement $depart indique le departement est correct
340
		//on remplit la table $table_retour_json['resultat']
262 delphine 341
		$this->table_retour = array();
6 jpm 342
		foreach ($resultat as $tab) {
343
			foreach ($tab as $key => $valeur) {
344
				switch ($key) {
345
					case 'id'		: break;
346
					case 'catminat' : break;
347
					case 'rang'		: break;
348
					case 'num_tax'	: break;
349
					case 'freq_abs'	: break;
350
					case 'freq_rel'	: break;
351
					case 'rare_nat'	: break;
352
					case 'num_nom'	: ($valeur == 'nc')? $num_nom = urlencode($tab['nom_sci']) : $num_nom = $valeur ; break;
353
					case 'nom_sci'	: $this->table_retour['determination.nom_sci'] = $valeur;	break;
354
					default			: // pour les depts
251 delphine 355
						if (isset($this->parametres['masque.station'])) {
356
							if ($key == $this->parametres['masque.station']) {
6 jpm 357
								$id = $num_nom.":".$key;
251 delphine 358
								$this->completerDonnees($key, $valeur, $id);
6 jpm 359
								$resultat_json[$id] = $this->table_retour;
360
								$num++;
361
							}
251 delphine 362
						} else {
363
							if ($depart == true && $valeur != '') {
364
								if (($this->presenceChorologie != '' && $valeur == $this->presenceChorologie) ||
365
									($this->presenceChorologie == '' && $valeur != $this->presenceChorologie)) {
366
									$id = $num_nom.":".$key;
367
									$this->completerDonnees($key, $valeur, $id);
368
									$resultat_json[$id] = $this->table_retour;
369
									$num++;
370
								}
371
							}
372
							if ($key == $this->limite_requete['dept']) $depart = true;
6 jpm 373
						}
374
						break;
375
				}
376
				if ($num == $this->limite_requete['limite']) {
377
					break;
378
				}
379
			}
380
			if ($num == $this->limite_requete['limite']) {
381
				break;
382
			}
383
			$this->table_retour = array();
384
		}
385
		//on remplit la table $table_retour_json['entete']
386
		//formuler les urls precedentes et suivantes affichées dans l'entete du resultat
236 delphine 387
		$url = $this->formulerUrlObs($id, $num, '/observations');
6 jpm 388
		if ($url['precedent'] != '') { $this->table_entete['href.precedent'] = $url['precedent']; }
389
		if ($url['suivant']   != '') { $this->table_entete['href.suivant']   = $url['suivant']; }
390
		$this->table_entete['total']  = $num;
391
		$table_retour_json['entete'] = $this->table_entete;
392
		$table_retour_json['resultat'] = $resultat_json;
393
		return $table_retour_json;
251 delphine 394
	}
6 jpm 395
 
251 delphine 396
	public function completerDonnees($key, $valeur, $id) {
397
		if ($this->retour_format == 'max' ) {
398
			$this->afficherDonneesMax($key, $valeur);
399
			$this->table_retour['href'] = $this->ajouterHref('observations',$id);
400
		} else {
401
			$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key;
402
			$this->table_retour['valeur.code'] = $valeur;
403
		}
404
	}
405
 
6 jpm 406
	public function formaterObservationsId($resultat) {
407
		foreach ($resultat as $key => $valeur) {
408
			switch ($key) {
409
				case 'id'  		: break;
410
				case 'catminat' : if ($this->retour_format == 'max') $this->table_retour['determination.catminat'] = $valeur;	break;
411
				case 'rang' 	: $this->table_retour['determination.rang'] = $valeur;					break;
412
				case 'num_tax' 	: $this->table_retour['determination.num_tax'] = $valeur;				break;
413
				case 'freq_abs'	: 																		break;
414
				case 'freq_rel'	: 																		break;
415
				case 'rare_nat'	: $this->table_retour['determination.rarete_nationale.code'] = $valeur;	break;
416
				case 'nom_sci'	: $this->table_retour['determination.nom_sci'] = $valeur;				break;
417
				case 'num_nom'	: $this->table_retour['determination.num_nom'] = $valeur;				break;
418
				default			: 	if ($this->retour_format == 'max') {
419
										$this->afficherDonneesMax($key, $valeur, true);
420
									} else {
421
										$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key;
422
										$this->table_retour['valeur.code'] = $valeur;
423
									}																	break;
424
			}
425
		}
426
		return $this->table_retour;
427
	}
428
 
429
	public function afficherDonneesMax($key, $valeur, $id = false) {
430
		if ($key != 20) { //à part la Corse
431
			$url_dep = $this->ajouterHrefAutreProjet('zone-geo','',$key, 'insee-d');
432
			$dep = $this->consulterHref($url_dep);
251 delphine 433
			if (isset($dep)) {
434
				$this->table_retour['station.departement'] = $dep->nom;
435
				$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key;
436
				$this->table_retour['station.departement.href'] = $url_dep;
437
			} else {
438
				$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key;
439
			}
6 jpm 440
		} else {
441
			$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key;
442
		}
443
		//double encodage des paramétres contre validation de Apache
444
		$url_val = $this->ajouterHref('ontologies', 'presenceChorologie:'.urlencode(urlencode($valeur)));
445
		$val = $this->consulterHref($url_val);
446
		$this->table_retour['valeur'] = $val->nom;
447
		$this->table_retour['valeur.code'] = $valeur;
448
		$this->table_retour['valeur.href'] = $url_val;
449
		if ($this->format_reponse == 'observations/id') { // si on est
450
			$contr = $this->chargerContributeurs($key);
451
			if (isset($contr['general'])) {
452
				$this->table_retour['contributeur'] = $contr['general'];
453
				$this->table_retour['contributeur.details'] = $contr['details'];
454
			}
455
			$source = $this->chargerSources($key);
456
			if (isset($source['general'])) $this->table_retour['sources'] = $source['general'];
457
			if (isset($source['autres'])) $this->table_retour['sources.autres'] = $source['autres'];
458
		}
459
	}
460
 
461
	public function chargerInfosGenerales() {
262 delphine 462
		list($table, $version) = explode('_v',$this->table);
463
		$version = str_replace('_', '.', $version);
464
		$requete = "SELECT createurs, date_creation FROM chorodep_meta WHERE version = \"$version\";";
6 jpm 465
		$resultat = $this->getBdd()->recuperer($requete); //Debug::printr($resultat);
466
 
467
		if ($resultat == '') { //cas ou la requete comporte des erreurs
262 delphine 468
			$r = 'La requête SQL metadonnees formée comporte une erreur !!';
6 jpm 469
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r);
470
			Debug::printr($requete);
471
		} elseif ($resultat) {
472
			$this->table_retour['type'] = 'chorologie';
473
			$this->table_retour['date_observation'] = $resultat['date_creation'];
474
			$this->table_retour['observateur.details'] = $this->traiterChampFormateDCSV($resultat['createurs']);
475
		}
476
	}
477
 
478
	public function chargerContributeurs($dept) {
479
		$contributeur = array();
480
		list($table, $version) = explode('_v',$this->table);
246 delphine 481
		$requete = "SELECT prenom, nom, courriel FROM chorodep_contributeurs WHERE `$dept` = '1';";
6 jpm 482
		$resultat = $this->getBdd()->recupererTous($requete); //Debug::printr($resultat);
483
 
484
		if ($resultat == '') { //cas ou la requete comporte des erreurs
262 delphine 485
			$r = 'La requête SQL contributeurs formée comporte une erreur !!';
6 jpm 486
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r);
487
			Debug::printr($requete);
488
		} elseif ($resultat) {
246 delphine 489
			$contributeur['general'] = '';
6 jpm 490
			foreach ($resultat as $res) {
491
				$contributeur['general'] .= $res['prenom'].' '.$res['nom'].', ';
492
				foreach ($res as $cle => $valeur) {
493
					if ($valeur == "") {
494
						unset($res[$cle]);
495
					}
496
				}
497
				$type = ($res['prenom'] == '') ? 'o' : 'p';
498
				$url = $this->ajouterHrefAutreProjet('ontologies', 'contactType:', $type, 'commun');
499
				$val = $this->consulterHref($url);
500
				$res['type'] = $val->nom;
501
				$res['type.code'] = $type;
502
				$res['type.href'] = $url;
503
				$contributeur['details'][] = $res;
504
			}
505
		}
506
		return $contributeur;
507
	}
508
 
509
	// prend en paramètre un champ comme createur, contributeur... sous forme p.prenom=ygggg,p.nom=fk;p.prenom=fdfs,p.nom=ek
510
	//retourne un tableau
511
	public function creerPointDetails($resultat) {
512
		$organismes = explode(';', $resultat);
513
		$num_org = 1;
514
		$general = '';
515
		foreach ($organismes as $organisme) {
516
			$infos = explode(',', $organisme);
517
		   	$t = '';
518
			$type = '.';
519
 
520
			foreach ($infos as $info) {
521
				list($key, $val) = explode('=', $info);
522
				list($type, $champ) = explode('.', trim($key));
523
				if ($type == 'p' && $champ == 'prenom') $general .= $val.' ';
524
				if (($type == 'p' || $type == 'o') && $champ == 'nom') $general .= $val.' ';
525
				$res[$num_org][$champ] = $val;
526
				$res[$num_org]['type'] = $type;// à modifier
527
			}
528
			$general = rtrim($general).', ';
529
			$num_org ++;
530
		}
531
		$this->table_retour['observateur'] = rtrim($general, ', ');
532
		$this->table_retour['observateur.details'] = $res;
533
	}
534
	/**
535
	 * Recupère à partir de la valeur du champ les différentes informations séparées par ';' (stocke ds un tableau)
536
	 * pour éditeurs, créateurs, contributeurs,...
537
	 * (ex : nom=Tela Botanica,guid=urn:lsid:tela-botanica.org,courriel=accueil@tela-botanica.org,...
538
	 */
539
	public function traiterChampFormateDCSV($val) {
540
		$tab = array();
541
		$num_entite = 0;
542
		$type = '';
543
 
544
		// découpe chaque participant
545
		$tab_entites = explode(';', $val);
546
		foreach ($tab_entites as $entite) {
547
			$tab[$num_entite] = array();
548
 
549
			if ($entite != '') {
550
				// découpe les informations du participant
551
				$entite_detail = explode(',', $entite);
552
				foreach ($entite_detail as $detail) {
553
 
554
					if ($detail != '') {
555
						if (preg_match('/^([^=]*)\.([^=]+)=([^=]*)$/', $detail, $match)) {
556
							$tab[$num_entite][$match[2]] = $match[3];
557
							if ($match[1] != $type) $type = $match[1];
558
						} else {
559
							$tab[$num_entite][] = $detail;
560
						}
561
					}
562
				}
563
				if ($type != '') {
564
					if ($this->retour_format == 'max') {
565
 
566
					}
567
				}
568
			}
569
			$num_entite++;
570
		}
571
		return $tab;
572
	}
573
 
574
	public function chargerSources($dept) {
575
		$contributeur = array();
246 delphine 576
		$requete = "SELECT biblio FROM chorodep_sources WHERE `$dept` = '1';";
6 jpm 577
		$resultat = $this->getBdd()->recupererTous($requete); //Debug::printr($resultat);
578
 
579
		if ($resultat == '') { //cas ou la requete comporte des erreurs
262 delphine 580
			$r = 'La requête SQL sources formée comporte une erreur !!';
6 jpm 581
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r);
582
			Debug::printr($requete);
583
		} elseif ($resultat) {
584
			foreach ($resultat as $cle=>$res) {
585
				if ($cle == 0) {
586
					$contributeur['general'] = $res['biblio'];
587
				} else {
588
					$contributeur['autres'][] = $res['biblio'];
589
				}
590
			}
591
		}
592
		return $contributeur;
593
	}
594
 
595
 
596
/*	public function formaterObservationsIdChamp($resultat) {
597
 
598
		//on recupère tous les resultats possibles
599
		$reponse = $this->formaterObservationsId($resultat);
600
		$this->table_retour = array();
601
 
602
		//on recupère les résultats demandés à partir du tableau de résultat complet
603
		$this->table_retour['id'] = $reponse['id'];
604
		$champs = explode(' ', $this->table_ressources[1]);
605
 
606
		foreach ($champs as $champ) {
607
 
608
			if ($this->verifierValiditeChamp($champ, $reponse)) {
609
 
610
				if (strrpos($champ, '.*') !== false) {
611
					$this->afficherPointEtoile($champ, $reponse);
612
 
613
				} else {
614
					if (isset($reponse[$champ])) {
615
						$this->table_retour[$champ] = $reponse[$champ];
616
					} else {
617
						$this->table_retour[$champ] = null;
618
					}
619
				}
620
			}
621
		}
622
		return $this->table_retour;
623
	}*/
624
 
625
// +-------------------------------------------------------------------------------------------------------------------+
626
/**
627
	 * Description :
628
	 * Est appelée pour former l'url complete des resultats precedants ou suivants.
629
	 * @param int : Permet de connaitre le nombre de noms obtenus par la requete
630
	 * @return string Retourne l'url complete des resultats precedents ou suivant sous la forme d'un tableau
631
	 */
236 delphine 632
	public function formulerUrlObs($suivant, $total, $id = null) {
6 jpm 633
		$debut_url = Config::get('url_service').$id.'?';
634
		//on recrée l'url sans les parametres de navigation qui seront rajouter ci-apres. On les enlève dc de la table des parametres
635
		$table_bis = $this->table_param;
636
		if (isset($table_bis['navigation_depart'] )) {
637
			unset($table_bis['navigation_depart']);
638
		}
639
		if (isset($table_bis['navigation_limite'])) {
640
			unset($table_bis['navigation_limite']);
641
		}
642
		$parametre_url = http_build_query($table_bis);
643
		//on recupere les limites
236 delphine 644
		$url['suivant']   = $this->recupererLesLimitesSuivantesObs($suivant, $total);
645
		$url['precedent'] = $this->recupererLesLimitesPrecedentesObs($suivant);
6 jpm 646
		//on reconstitue les deux urls avec leurs limites
647
		foreach ($url as $key => $limite) {
648
			if ($limite != '') {
649
				if ($parametre_url == '') {
650
					//si il n'y a aucun parametres, seules les limites sont à ajouter.On enleve dc le signe & du début
651
					$limite = str_replace('&navigation.depart=', 'navigation.depart=', $limite);
652
					if (strpos($limite, 'navigation.depart') == false) {
653
						$limite = str_replace('&navigation.limite=', 'navigation.limite=', $limite);
654
					}
655
				}
656
				$url_complete = $debut_url.$parametre_url.$limite;
657
				$url[$key] = $url_complete;
658
			}
659
		}
660
		return $url;
661
	}
662
 
663
	/**
664
	 * Description :
665
	 * Permet de former les limites de la requete retournant les résultats suivants.
666
	 * Cette url sera afficher dans l'entete de la reponse retournée en format JSON (retour.format=defaut).
667
	 * @param int : $nb_resultat : Permet de connaitre le nombre de résultats obtenus par la requete
668
	 * @return string : la fin de l'url decrivant les limites des resultats suivants. Si aucun résultats ne suient,
669
	 * une chaine de caractère vide est retournée
670
	 */
236 delphine 671
	public function recupererLesLimitesSuivantesObs($suivant, $total) {
6 jpm 672
		if ($this->limite_requete['limite'] <= $total) {
673
			$url_suivante = '&navigation.depart='.$suivant.'&navigation.limite='.$this->limite_requete['limite'];
674
		} else {
675
			$url_suivante = '';
676
		}
677
		return $url_suivante;
678
	}
679
 
680
	/**
681
	 * Description :
682
	 * Permet de former les limites de la requete retournant les résultats precedents.
683
	 * Cette url sera afficher dans l'entete de la taxons/105reponse retournée en format JSON (retour.format=defaut)
684
	 * @return string : la fin de l'url decrivant les limites des resultats precedents.
685
	 * Si aucun résultats ne precedent, une chaine de caractère vide est retournée
686
	 */
236 delphine 687
	public function recupererLesLimitesPrecedentesObs($suivant) {
6 jpm 688
		$url_precedente = '';
689
		if (isset($this->table_param['navigation_depart'])) { // si on utilise un parametre de départ
690
			// si l'adresse d'appel de la page est inférieur au départ
691
			$regex = '/http:\/\/.*\/service:eflore:0.1\/chorodep\/observations\?.*navigation.depart=(.*\:[0-9]*).*/';
692
			if (isset($_SERVER['HTTP_REFERER']) && preg_match($regex, $_SERVER['HTTP_REFERER'], $match)) {
693
				if ($match[1] != $this->table_param['navigation_depart'] && $match[1] != $suivant) {
694
					$url_precedente = '&navigation.depart='.$match[1].'&navigation.limite='.$this->limite_requete['limite'];
695
				}
696
			} else {
697
				$url_precedente = '&navigation.limite='.$this->limite_requete['limite'];
698
			}
699
		}
700
		return $url_precedente;
701
	}
702
 
703
}
704
?>