Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 236 | Rev 251 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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