Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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