Subversion Repositories eFlore/Projets.eflore-projets

Rev

Details | Last modification | View Log | RSS feed

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