Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1100 | Rev 1105 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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