Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev 6 Rev 15
Line 1... Line 1...
1
<?php
1
<?php
2
/**
2
/**
3
* Description :
3
* Description :
4
* Classe ZoneGeo.php fournit des informations sur un ensemble de lieux à une échelle donnée.
4
* Classe ZoneGeo.php fournit des informations sur un ensemble de lieux à une échelle donnée.
5
* Le but étant de fournir un ensemble minimal d'information comprenant : 
5
* Le but étant de fournir un ensemble minimal d'information comprenant :
6
* un identifiant (numérique ou alphanumérique sous forme de ChatMot si possible), un nom, une region et 
6
* un identifiant (numérique ou alphanumérique sous forme de ChatMot si possible), un nom, une region et
7
* éventuellement une relation hiérarchique avec un autre terme (=classe).
7
* éventuellement une relation hiérarchique avec un autre terme (=classe).
8
* Si l'url finit par /zone-geo on retourne une liste de zones (seulement les 100 premières par défaut).
8
* Si l'url finit par /zone-geo on retourne une liste de zones (seulement les 100 premières par défaut).
9
* L'url peut contenir des paramètres optionnels passés après le ? : /zone-geo?param1=val1&param2=val2&...
9
* L'url peut contenir des paramètres optionnels passés après le ? : /zone-geo?param1=val1&param2=val2&...
10
* 
10
*
11
* Les paramètres de requête disponibles sont : masque, masque.code, masque.nom, masque.region , recherche, 
11
* Les paramètres de requête disponibles sont : masque, masque.code, masque.nom, masque.region , recherche,
12
* distinct, retour.format, navigation.depart et navigation.limite.
12
* distinct, retour.format, 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
*/
Line 24... Line 24...
24
 
24
 
25
class ZoneGeo extends Commun {
25
class ZoneGeo extends Commun {
26
	 
26
 
27
	protected $service = 'zone-geo';
27
	protected $service = 'zone-geo';
28
	
28
 
29
	/**
29
	/**
30
	 * Permet de stocker la requete formulée : /zone-geo | /zone-geo/#id | /zone-geo/#id/champ | /zone-geo/#id/relations
30
	 * Permet de stocker la requete formulée : /zone-geo | /zone-geo/#id | /zone-geo/#id/champ | /zone-geo/#id/relations
31
	 * Est remplit au cours de l'analyse des ressources (traiterRessources()), par défaut, a la valeur du service. 
31
	 * Est remplit au cours de l'analyse des ressources (traiterRessources()), par défaut, a la valeur du service.
32
	 * Est utilisée principalement pr déterminer le format du tableau à retourner.	 */
32
	 * Est utilisée principalement pr déterminer le format du tableau à retourner.	 */
33
	protected $format_reponse = 'zone-geo';
33
	protected $format_reponse = 'zone-geo';
34
	
34
 
35
	/** Variables constituant les parametres de la requete SQL (champ, condition, group by, limit) remplie 
35
	/** Variables constituant les parametres de la requete SQL (champ, condition, group by, limit) remplie
36
	 * selon ressources et paramètres	 */
36
	 * selon ressources et paramètres	 */
37
	protected $requete_champ = ' * ';
37
	protected $requete_champ = ' * ';
38
	protected $requete_condition = '';
38
	protected $requete_condition = '';
39
	protected $limite_requete 	 = array(
39
	protected $limite_requete = array(
40
		'depart' => 0,
40
		'depart' => 0,
41
		'limite' => 100
41
		'limite' => 100
42
	);
42
	);
43
	
43
 
44
	/** Stockage des ressources et paramétres */
44
	/** Stockage des ressources et paramétres */
45
	protected $table_ressources = array();
45
	protected $table_ressources = array();
46
	protected $table_param = array();
46
	protected $table_param = array();
47
	/**
47
	/**
48
	 * Precise la contenance plus ou moins précise du tableau à retourner : 
48
	 * Precise la contenance plus ou moins précise du tableau à retourner :
49
	 *  - min = les données présentes dans la table 
49
	 *  - min = les données présentes dans la table
50
	 *  - max = les données de la table + les informations complémentaires (pour les identifiants et les codes)
50
	 *  - max = les données de la table + les informations complémentaires (pour les identifiants et les codes)
51
	 *  - oss = la liste des nom_sci (uniquement pour noms et taxons) 
51
	 *  - oss = la liste des nom_sci (uniquement pour noms et taxons)
52
	 */
52
	 */
53
	protected $retour_format = 'max';
53
	protected $retour_format = 'max';
54
	/** Valeur du paramètre de requete recherche : 
54
	/** Valeur du paramètre de requete recherche :
55
	 *  - stricte : le masque est passé tel quel à l'opérateur LIKE. 
55
	 *  - stricte : le masque est passé tel quel à l'opérateur LIKE.
56
	 *  - etendue : ajout automatique du signe % à la place des espaces et en fin de masque avec utilisation de LIKE. 
56
	 *  - etendue : ajout automatique du signe % à la place des espaces et en fin de masque avec utilisation de LIKE.
57
	 *  - floue : recherche tolérante vis-à-vis d'approximations ou d'erreurs (fautes d'orthographe par exemple) */
57
	 *  - floue : recherche tolérante vis-à-vis d'approximations ou d'erreurs (fautes d'orthographe par exemple) */
58
	protected $recherche;
58
	protected $recherche;
59
	
59
 
60
	/** Permet de stocker le tableau de résultat (non encodé en json) */
60
	/** Permet de stocker le tableau de résultat (non encodé en json) */
61
	protected $table_retour = array();
61
	protected $table_retour = array();
62
	/** Stocke le nombre total de résultats de la requete principale. Est calculée lors de l'assemblage de la requete */
62
	/** Stocke le nombre total de résultats de la requete principale. Est calculée lors de l'assemblage de la requete */
63
	protected $total_resultat;
-
 
64
	
-
 
65
// +-------------------------------------------------------------------------------------------------------------------+	
-
 
66
	public function consulter($ressources, $parametres) {
-
 
67
		$this->traiterParametres($parametres);
-
 
68
		$this->traiterVersionProjet($ressources);
-
 
69
		$this->traiterRessources($ressources);
-
 
70
		$resultat_formate = '';
-
 
71
		
-
 
72
		if ($this->corps_http == '' && $this->entete_http == '') {
-
 
73
		foreach ($this->table_version as $version) {
-
 
74
				$this->table = $version; //on stocke le nom de la table correspondant à la version du projet en cours
-
 
75
				$requete = $this->assemblerLaRequete(); //print_r($requete);
-
 
76
				$resultat = $this->getBdd()->recupererTous($requete);
-
 
77
				$res_version = $this->testerResultat($resultat, $requete);
-
 
78
			}
-
 
79
			if ($this->corps_http == '' && $this->entete_http == '') {
-
 
80
				if (isset($res_version)) {
-
 
81
					$resultat_formate = json_encode($res_version);
-
 
82
				}
-
 
83
			}
-
 
84
		}
-
 
85
		return $this->formerReponseHTTP($resultat_formate);
-
 
86
	}
-
 
87
	
-
 
88
	public function testerResultat($resultat, $requete) {
-
 
89
		if ($resultat == '') { //cas ou la requete comporte des erreurs
-
 
90
			$s = 'La requête SQL formée comporte une erreur !!';
-
 
91
			Debug::printr($requete);
-
 
92
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $s);
-
 
93
		} elseif ($resultat) {
-
 
94
			if (count($this->table_version) > 1) {
-
 
95
				$res_version[$version] = $this->retournerResultatFormate($resultat);
-
 
96
			} else {
-
 
97
				$res_version = $this->retournerResultatFormate($resultat);
-
 
98
			}
-
 
99
		} else {
-
 
100
			$d = 'Données recherchées introuvables dans la base';
-
 
101
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $d);
-
 
102
			Debug::printr($requete);
-
 
103
		}
-
 
104
		return $res_version;
-
 
105
	}
63
	protected $total_resultat;
106
	
64
 
107
// +-------------------------------------------------------------------------------------------------------------------+
65
	// +-----------------------------------------------------------------------------------------------------+
108
	public function traiterParametres($parametres) {
66
	public function traiterParametres() {
109
		if (isset($parametres) && !empty($parametres)) {
67
		if (isset($this->parametres) && !empty($this->parametres)) {
110
			$this->table_param = $parametres;
68
			$this->table_param = $this->parametres;
111
			
69
 
112
		//	masque : filtre la liste en fonction d'un masque de recherche portant sur le code, le nom ou la region.
70
			//	masque : filtre la liste en fonction d'un masque de recherche portant sur le code, le nom ou la region.
113
		//	masque.code : filtre uniquement sur le code. masque.nom : filtre uniquement sur le nom.
71
			//	masque.code : filtre uniquement sur le code. masque.nom : filtre uniquement sur le nom.
114
		//	masque.region : filtre uniquement sur la region.
72
			//	masque.region : filtre uniquement sur la region.
115
			if (isset($parametres['recherche']) && $parametres['recherche'] != '') {
73
			if (isset($this->parametres['recherche']) && $this->parametres['recherche'] != '') {
116
				$this->recherche = $parametres['recherche']; 
74
				$this->recherche = $this->parametres['recherche'];
117
			}
75
			}
118
			
76
 
119
			foreach ($parametres as $param => $valeur) {
77
			foreach ($this->parametres as $param => $valeur) {
-
 
78
				switch ($param) {
120
				switch ($param) {
79
					case 'masque' :
-
 
80
						$this->ajouterLeFiltreMasque('masque', $valeur);
-
 
81
						break;
121
					case 'masque'				: $this->ajouterLeFiltreMasque('masque', $valeur);				break;
82
					case 'masque.code' :
-
 
83
						$this->ajouterLeFiltreMasque('codet', $valeur);
-
 
84
						break;
122
					case 'masque_code'			: $this->ajouterLeFiltreMasque('codet', $valeur);				break;
85
					case 'masque.nom' :
-
 
86
						$this->ajouterLeFiltreMasque('nom', $valeur);
-
 
87
						break;
123
					case 'masque_nom'			: $this->ajouterLeFiltreMasque('nom', $valeur);					break;
88
					case 'masque.statut' :
-
 
89
						$this->ajouterLeFiltreMasque('codet_statut', $valeur);
-
 
90
						break;
124
					case 'masque_statut'		: $this->ajouterLeFiltreMasque('codet_statut', $valeur);		break;
91
					case 'retour.format' :
-
 
92
						$this->retour_format = $valeur;
-
 
93
						break;
125
					case 'retour_format'		: $this->retour_format = $valeur;								break;
94
					case 'navigation.depart' :
-
 
95
						$this->limite_requete['depart'] = $valeur;
-
 
96
						break;
126
					case 'navigation_depart'	: $this->limite_requete['depart'] = $valeur;					break;
97
					case 'navigation.limite' :
-
 
98
						$this->limite_requete['limite'] = $valeur;
127
					case 'navigation_limite'	: $this->limite_requete['limite'] = $valeur;					break;
99
						break;
-
 
100
					case 'recherche' :
-
 
101
						break;
128
					case 'recherche'			:																break;
102
					default						:
129
					default						:  $p = 'Erreur dans les paramètres de recherche de votre requête : '.
103
						$p = 'Erreur dans les paramètres de recherche de votre requête : '.
130
													'</br> Le paramètre " '.$param.' " n\'existe pas.';
104
							'</br> Le paramètre " '.$param.' " n\'existe pas.';
131
												$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $p);	break;
105
							$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $p);	break;
132
				}
106
				}
133
			}
107
			}
134
		}
108
		}
135
	}
109
	}
136
	
110
 
137
	public function ajouterLeFiltreMasque($nom_champ, $valeur) {
111
	public function ajouterLeFiltreMasque($nom_champ, $valeur) {
138
		if ($nom_champ == 'codet') {
112
		if ($nom_champ == 'codet') {
139
			$this->requete_condition[] .= $nom_champ.' = '.$this->getBdd()->proteger($valeur);
113
			$this->requete_condition[] .= $nom_champ.' = '.$this->getBdd()->proteger($valeur);
140
		} else {
114
		} else {
Line 148... Line 122...
148
						.' OR ( SOUNDEX(codet_statut) = SOUNDEX(\''.$valeur.'\')'
122
						.' OR ( SOUNDEX(codet_statut) = SOUNDEX(\''.$valeur.'\')'
149
						.' OR SOUNDEX(REVERSE(codet_statut)) = SOUNDEX(REVERSE(\''.$valeur.'\')) '
123
						.' OR SOUNDEX(REVERSE(codet_statut)) = SOUNDEX(REVERSE(\''.$valeur.'\')) '
150
						.')) ';
124
						.')) ';
151
				} elseif ($nom_champ == 'nom') {
125
				} elseif ($nom_champ == 'nom') {
152
					$this->requete_condition[] = '(SOUNDEX(nom_francais) = SOUNDEX(\''.$valeur.'\')'
126
					$this->requete_condition[] = '(SOUNDEX(nom_francais) = SOUNDEX(\''.$valeur.'\')'
153
						.' OR SOUNDEX(REVERSE(nom_francais)) = SOUNDEX(REVERSE(\''.$valeur.'\'))) OR 
127
						.' OR SOUNDEX(REVERSE(nom_francais)) = SOUNDEX(REVERSE(\''.$valeur.'\'))) OR
154
						(SOUNDEX(nom_anglais) = SOUNDEX(\''.$valeur.'\')'
128
						(SOUNDEX(nom_anglais) = SOUNDEX(\''.$valeur.'\')'
155
						.' OR SOUNDEX(REVERSE(nom_anglais)) = SOUNDEX(REVERSE(\''.$valeur.'\'))) ';
129
						.' OR SOUNDEX(REVERSE(nom_anglais)) = SOUNDEX(REVERSE(\''.$valeur.'\'))) ';
156
				} else {
130
				} else {
157
					$this->requete_condition[] = '(SOUNDEX('.$nom_champ.') = SOUNDEX(\''.$valeur.'\')'
131
					$this->requete_condition[] = '(SOUNDEX('.$nom_champ.') = SOUNDEX(\''.$valeur.'\')'
158
						.' OR SOUNDEX(REVERSE('.$nom_champ.')) = SOUNDEX(REVERSE(\''.$valeur.'\'))) ';
132
						.' OR SOUNDEX(REVERSE('.$nom_champ.')) = SOUNDEX(REVERSE(\''.$valeur.'\'))) ';
Line 160... Line 134...
160
			} else {
134
			} else {
161
				if ($this->recherche == 'etendue') {
135
				if ($this->recherche == 'etendue') {
162
					$valeur = str_replace(' ','%', $valeur);
136
					$valeur = str_replace(' ','%', $valeur);
163
					$valeur .= '%';
137
					$valeur .= '%';
164
				}
138
				}
165
				
139
 
166
				if ($nom_champ == 'masque') {
140
				if ($nom_champ == 'masque') {
167
					$this->requete_condition[] = '(codet = '.$this->getBdd()->proteger($valeur)
141
					$this->requete_condition[] = '(codet = '.$this->getBdd()->proteger($valeur)
168
						.' OR nom_francais LIKE '.$this->getBdd()->proteger($valeur)
142
						.' OR nom_francais LIKE '.$this->getBdd()->proteger($valeur)
169
						.' OR nom_anglais LIKE '.$this->getBdd()->proteger($valeur)
143
						.' OR nom_anglais LIKE '.$this->getBdd()->proteger($valeur)
170
						.' OR codet_statut LIKE '.$this->getBdd()->proteger($valeur).')';
144
						.' OR codet_statut LIKE '.$this->getBdd()->proteger($valeur).')';
Line 175... Line 149...
175
					$this->requete_condition[] = $nom_champ.' LIKE '.$this->getBdd()->proteger($valeur);
149
					$this->requete_condition[] = $nom_champ.' LIKE '.$this->getBdd()->proteger($valeur);
176
				}
150
				}
177
			}
151
			}
178
		}
152
		}
179
	}
153
	}
180
	
154
 
181
// +-------------------------------------------------------------------------------------------------------------------+		
155
	// +-----------------------------------------------------------------------------------------------------+
182
	public function traiterRessources(&$ressources) {
156
	public function traiterRessources() {
183
		if (isset($ressources) && !empty($ressources)) {
157
		if (isset($this->ressources) && !empty($this->ressources)) {
184
			$this->table_ressources = $ressources;
158
			$this->table_ressources = $this->ressources;
185
			if (isset($this->table_ressources[0]) && !empty($this->table_ressources[0])) {
159
			if (isset($this->table_ressources[0]) && !empty($this->table_ressources[0])) {
186
				//requete = /zone-geo/#id
160
				//requete = /zone-geo/#id
187
				$this->traiterRessourceId();
161
				$this->traiterRessourceId();
188
				if (isset($this->table_ressources[1]) && !empty($this->table_ressources[1])) {
162
				if (isset($this->table_ressources[1]) && !empty($this->table_ressources[1])) {
189
					//requete = /zone-geo/#id/#champ ou /zone-geo/#id/relations
163
					//requete = /zone-geo/#id/#champ ou /zone-geo/#id/relations
190
					$this->traiterRessourceChampOuRelations();
164
					$this->traiterRessourceChampOuRelations();
191
				}
165
				}
192
			}
166
			}
193
		}
167
		}
194
	}
168
	}
195
	
169
 
196
	public function traiterRessourceId() {
170
	public function traiterRessourceId() {
197
		//requete : /zone-geo/#id (ex : /zone-geo/7)
171
		//requete : /zone-geo/#id (ex : /zone-geo/7)
198
		if ($this->table_ressources[0]) {
172
		if ($this->table_ressources[0]) {
199
			$this->requete_condition[] = ' codet = '.$this->getBdd()->proteger($this->table_ressources[0]);
173
			$this->requete_condition[] = ' codet = '.$this->getBdd()->proteger($this->table_ressources[0]);
200
			$this->format_reponse .= '/id';
174
			$this->format_reponse .= '/id';
201
		} else {
175
		} else {
202
			$r = 'Erreur dans les ressources de votre requête : </br> La ressource " '.$this->table_ressources[0].
176
			$r = 'Erreur dans les ressources de votre requête : </br> La ressource " '.$this->table_ressources[0].
203
				' " n\'existe pas.';
177
				' " n\'existe pas.';
204
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $r);	
178
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $r);
205
		}
179
		}
206
	}
180
	}
207
	
181
 
208
	
182
 
209
	public function traiterRessourceChampOuRelations() {
183
	public function traiterRessourceChampOuRelations() {
210
		if ($this->table_ressources[1] == 'relations') {
184
		if ($this->table_ressources[1] == 'relations') {
211
			$r = 'Erreur dans les ressources de votre requête : </br> La ressource " '.$this->table_ressources[1].
185
			$r = 'Erreur dans les ressources de votre requête : </br> La ressource " '.$this->table_ressources[1].
212
				' " n\'existe pas.';
186
				' " n\'existe pas.';
213
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $r);
187
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $r);
214
		} else {
188
		} else {
215
			$this->format_reponse .= '/champ';
189
			$this->format_reponse .= '/champ';
216
		}
190
		}
217
	}
191
	}
218
	
192
 
219
// +-------------------------------------------------------------------------------------------------------------------+	
193
// +-------------------------------------------------------------------------------------------------------------------+
220
	public function assemblerLaRequete() {
194
	public function assemblerLaRequete() {
221
		//assemblage de la requete : 
195
		//assemblage de la requete :
222
		$requete = 	' SELECT '.$this->requete_champ.
196
		$requete = 	' SELECT '.$this->requete_champ.
223
			' FROM '.$this->table
197
			' FROM '.$this->table
224
			.$this->formerRequeteCondition()
198
			.$this->formerRequeteCondition()
225
			.$this->formerRequeteLimite();
199
			.$this->formerRequeteLimite();
226
		return $requete;
200
		return $requete;
227
	}
201
	}
228
	
202
 
229
	//ajout d'une limite seulement pour les listes (pas plus de 100 resultats retournés pr les requetes 
203
	//ajout d'une limite seulement pour les listes (pas plus de 100 resultats retournés pr les requetes
230
	// suivantes : /zone-geo et /zone-geo/#id/relations)
204
	// suivantes : /zone-geo et /zone-geo/#id/relations)
231
	public function formerRequeteLimite() {
205
	public function formerRequeteLimite() {
232
		if ($this->format_reponse != 'zone-geo') {
206
		if ($this->format_reponse != 'zone-geo') {
233
			$this->requete_limite = ''; 
207
			$this->requete_limite = '';
234
		} elseif (($depart = $this->limite_requete['depart']) > ($this->total_resultat = $this->recupererTotalResultat())) {
208
		} elseif (($depart = $this->limite_requete['depart']) > ($this->total_resultat = $this->recupererTotalResultat())) {
235
			//cas ou la requete presente un navigation.depart supérieur au nb total de resultats. 
209
			//cas ou la requete presente un navigation.depart supérieur au nb total de resultats.
236
			$this->limite_requete['depart'] = 
210
			$this->limite_requete['depart'] =
237
				(($nb - $this->limite_requete['limite']) < 0) ? 0 : ($nb - $this->limite_requete['limite']);
211
				(($nb - $this->limite_requete['limite']) < 0) ? 0 : ($nb - $this->limite_requete['limite']);
238
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
212
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
239
		} else {
213
		} else {
240
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
214
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
241
		}
215
		}
242
		return $this->requete_limite;
216
		return $this->requete_limite;
243
	}
217
	}
244
	
218
 
245
	public  function formerRequeteCondition() {
219
	public  function formerRequeteCondition() {
246
		$condition = '';
220
		$condition = '';
247
		if ($this->requete_condition != null) { 
221
		if ($this->requete_condition != null) {
248
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
222
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
249
		} 
223
		}
250
		return $condition;
224
		return $condition;
251
	}
225
	}
252
	
226
 
253
	public function recupererTotalResultat() {
227
	public function recupererTotalResultat() {
254
		//on récupère le nombre total de résultats de la requete (ex : le nombre d'id contenu dans la liste /zone-geo)
228
		//on récupère le nombre total de résultats de la requete (ex : le nombre d'id contenu dans la liste /zone-geo)
255
		$requete = 'SELECT count(*) as nombre FROM '
229
		$requete = 'SELECT count(*) as nombre FROM '
256
			.$this->table
230
			.$this->table
257
			.$this->formerRequeteCondition();
231
			.$this->formerRequeteCondition();
258
		$res = $this->getBdd()->recuperer($requete);
232
		$res = $this->getBdd()->recuperer($requete);
259
		
233
 
260
		if ($res) {
234
		if ($res) {
261
			$total = $res['nombre'];
235
			$total = $res['nombre'];
262
		} else {
236
		} else {
263
			$t = 'Fonction recupererTotalResultat() : <br/>Données introuvables dans la base';
237
			$t = 'Fonction recupererTotalResultat() : <br/>Données introuvables dans la base';
264
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $t);
238
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $t);
265
		}
239
		}
266
		return $total;
240
		return $total;
267
	}
241
	}
268
	
242
 
269
// +-------------------------------------------------------------------------------------------------------------------+	
243
// +-------------------------------------------------------------------------------------------------------------------+
270
	// determine en fct du service appelé (/zone-geo | /zone-geo/#id | /zone-geo/#id/champ | 
244
	// determine en fct du service appelé (/zone-geo | /zone-geo/#id | /zone-geo/#id/champ |
271
	// /zone-geo/#id/relations) le format du tableau à retourner. Encode en json
245
	// /zone-geo/#id/relations) le format du tableau à retourner. Encode en json
272
	public function retournerResultatFormate($resultat) {
246
	public function retournerResultatFormate($resultat) {
273
		$this->recupererTableConfig('correspondance_champs');
247
		$this->recupererTableConfig('correspondance_champs');
274
		switch ($this->format_reponse) {
248
		switch ($this->format_reponse) {
275
			case 'zone-geo'				: $reponse = $this->formaterZoneGeo($resultat);				break;
249
			case 'zone-geo'				: $reponse = $this->formaterZoneGeo($resultat);				break;
Line 277... Line 251...
277
			case 'zone-geo/id/champ'	: $reponse = $this->formaterZoneGeoIdChamp($resultat[0]);	break;
251
			case 'zone-geo/id/champ'	: $reponse = $this->formaterZoneGeoIdChamp($resultat[0]);	break;
278
			default						:															break;
252
			default						:															break;
279
		}
253
		}
280
		return $reponse;
254
		return $reponse;
281
	}
255
	}
282
	
256
 
283
	public function formaterZoneGeo($resultat) {
257
	public function formaterZoneGeo($resultat) {
284
		//on remplit la table $table_retour_json['entete']
258
		//on remplit la table $table_retour_json['entete']
285
		$this->table_retour['depart'] = $this->limite_requete['depart'];
259
		$this->table_retour['depart'] = $this->limite_requete['depart'];
286
		$this->table_retour['limite'] = $this->limite_requete['limite'];
260
		$this->table_retour['limite'] = $this->limite_requete['limite'];
287
		$this->table_retour['total']  = $this->total_resultat;
261
		$this->table_retour['total']  = $this->total_resultat;
288
		$url = $this->formulerUrl($this->total_resultat, '/zone-geo');
262
		$url = $this->formulerUrl($this->total_resultat, '/zone-geo');
-
 
263
		if (isset($url['precedent']) && $url['precedent'] != '') {
289
		if ($url['precedent'] != '')	{ $this->table_retour['href.precedent'] = $url['precedent'];	}
264
			$this->table_retour['href.precedent'] = $url['precedent'];
-
 
265
		}
-
 
266
		if (isset($url['suivant']) && $url['suivant'] != '') {
290
		if ($url['suivant'] != '')		{ $this->table_retour['href.suivant'] = $url['suivant'];		}
267
			$this->table_retour['href.suivant'] = $url['suivant'];
-
 
268
		}
291
		$table_retour_json['entete'] = $this->table_retour;
269
		$table_retour_json['entete'] = $this->table_retour;
292
		
270
 
293
		//on remplit la table $table_retour_json['resultat']
271
		//on remplit la table $table_retour_json['resultat']
294
		$this->table_retour = array();
272
		$this->table_retour = array();
295
		if (isset($this->table_param['masque_nom'])) $resultat = $this->trierRechercheFloue($this->table_param['masque_nom'], $resultat, 'nom_francais');
273
		if (isset($this->table_param['masque_nom'])) $resultat = $this->trierRechercheFloue($this->table_param['masque_nom'], $resultat, 'nom_francais');
296
		foreach ($resultat as $tab) {
274
		foreach ($resultat as $tab) {
297
			foreach ($tab as $key => $valeur) {
275
			foreach ($tab as $key => $valeur) {
Line 313... Line 291...
313
			$this->table_retour = array();
291
			$this->table_retour = array();
314
		}
292
		}
315
		$table_retour_json['resultat'] = $resultat_json;
293
		$table_retour_json['resultat'] = $resultat_json;
316
		return $table_retour_json;
294
		return $table_retour_json;
317
	}
295
	}
318
	
296
 
319
	public function formaterZoneGeoId($resultat) {
297
	public function formaterZoneGeoId($resultat) {
320
		foreach ($resultat as $key => $valeur) {
298
		foreach ($resultat as $key => $valeur) {
321
			if ($valeur != '') {
299
			if ($valeur != '') {
322
				$this->afficherDonnees($key, $valeur);
300
				$this->afficherDonnees($key, $valeur);
323
			} 
301
			}
324
		}
302
		}
325
		unset($this->table_retour['href']);
303
		unset($this->table_retour['href']);
326
		return $this->table_retour;
304
		return $this->table_retour;
327
	}
305
	}
328
	
306
 
329
	public function formaterZoneGeoIdChamp($resultat) {
307
	public function formaterZoneGeoIdChamp($resultat) {
330
		//on recupère tous les resultats possibles
308
		//on recupère tous les resultats possibles
331
		$reponse = $this->formaterZoneGeoId($resultat);
309
		$reponse = $this->formaterZoneGeoId($resultat);
332
		$this->table_retour = array();
310
		$this->table_retour = array();
333
		//on recupère les résultats demandés à partir du tableau de résultat complet
311
		//on recupère les résultats demandés à partir du tableau de résultat complet
Line 348... Line 326...
348
				}
326
				}
349
			}
327
			}
350
		}
328
		}
351
		return $this->table_retour;
329
		return $this->table_retour;
352
	}
330
	}
353
	
331
 
354
	public function verifierValiditeChamp($champ) {
332
	public function verifierValiditeChamp($champ) {
355
		preg_match('/^([^.]+)(\.([^.]+))?$/', $champ, $match);
333
		preg_match('/^([^.]+)(\.([^.]+))?$/', $champ, $match);
356
		$champs_possibles = $this->correspondance_champs;
334
		$champs_possibles = $this->correspondance_champs;
357
		$champs_possibles[] = 'nom.*';
335
		$champs_possibles[] = 'nom.*';
358
		
336
 
359
		if (in_array($match[1], $champs_possibles)) {
337
		if (in_array($match[1], $champs_possibles)) {
360
			$validite = true;
338
			$validite = true;
361
		} elseif (in_array($match[0], $champs_possibles)) {
339
		} elseif (in_array($match[0], $champs_possibles)) {
362
			$validite = true;
340
			$validite = true;
363
		} else {
341
		} else {
Line 366... Line 344...
366
				'Les champs disponibles sont : <li>'.$champs_possibles.'</li>';
344
				'Les champs disponibles sont : <li>'.$champs_possibles.'</li>';
367
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $c);
345
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $c);
368
		}
346
		}
369
		return $validite;
347
		return $validite;
370
	}
348
	}
371
	
349
 
372
	public function afficherPointEtoile($champ, $reponse) {
350
	public function afficherPointEtoile($champ, $reponse) {
373
		preg_match('/^([^.]+\.)\*$/', $champ, $match);
351
		preg_match('/^([^.]+\.)\*$/', $champ, $match);
374
		foreach ($reponse as $chp => $valeur) {
352
		foreach ($reponse as $chp => $valeur) {
375
			if (strrpos($chp, $match[1]) !== false) {
353
			if (strrpos($chp, $match[1]) !== false) {
376
				if ($valeur != '') {
354
				if ($valeur != '') {
Line 379... Line 357...
379
					$this->table_retour[$chp] = null;
357
					$this->table_retour[$chp] = null;
380
				}
358
				}
381
			}
359
			}
382
		}
360
		}
383
	}
361
	}
384
	
362
 
385
	public function afficherDonnees($champ, $valeur) {
363
	public function afficherDonnees($champ, $valeur) {
386
		if ($this->retour_format == 'max') {
364
		if ($this->retour_format == 'max') {
387
			if ($champ == 'codet_statut') {
365
			if ($champ == 'codet_statut') {
388
				$this->table_retour[$this->correspondance_champs[$champ]] = $valeur;
366
				$this->table_retour[$this->correspondance_champs[$champ]] = $valeur;
389
				$this->table_retour[$this->correspondance_champs[$champ].'.href'] = 
367
				$this->table_retour[$this->correspondance_champs[$champ].'.href'] =
390
					$this->ajouterHref('ontologies', 'masque.nom=Codet '.$valeur, '?');
368
					$this->ajouterHref('ontologies', 'masque.nom=Codet '.$valeur, '?');
391
			} else {
369
			} else {
392
				$this->table_retour[$this->correspondance_champs[$champ]] = $valeur;
370
				$this->table_retour[$this->correspondance_champs[$champ]] = $valeur;
393
			}
371
			}
394
		} else {
372
		} else {
Line 396... Line 374...
396
		}
374
		}
397
	}
375
	}
Line 398... Line 376...
398
 
376
 
399
// +-------------------------------------------------------------------------------------------------------------------+
377
// +-------------------------------------------------------------------------------------------------------------------+
400
	/** Permet de retourner l'url http://tela-botanica.org/service:eflore:0.1/[projet]/[version_projet]/[service]/[ressource]:[valeur]
378
	/** Permet de retourner l'url http://tela-botanica.org/service:eflore:0.1/[projet]/[version_projet]/[service]/[ressource]:[valeur]
401
	 * @param $service : correspond au nom de la ressource à laquelle on souhaite acceder 
379
	 * @param $service : correspond au nom de la ressource à laquelle on souhaite acceder
402
	 * @param $val : correspond au paramètre de la ressource (ex : 
380
	 * @param $val : correspond au paramètre de la ressource (ex :
403
	 * @param $projet : est remplit dans les cas suivants :
381
	 * @param $projet : est remplit dans les cas suivants :
404
	 * 	- si le projet dans lequel se trouve l'information est différent de celui du service appelé 
382
	 * 	- si le projet dans lequel se trouve l'information est différent de celui du service appelé
405
	 *  - si on souhaite rappeler le meme projet avec la meme ressource mais un parametre de ressource différent
383
	 *  - si on souhaite rappeler le meme projet avec la meme ressource mais un parametre de ressource différent
406
	 */
384
	 */
407
	public function ajouterHref($service, $val, $separation = '/') {
385
	public function ajouterHref($service, $val, $separation = '/') {
408
		$val = $this->encoderUrl($val);
386
		$val = $this->encoderUrl($val);
Line 411... Line 389...
411
		} else {
389
		} else {
412
			$url = Config::get('url_service_base').Config::get('nom_projet').'/'.$this->version_projet.'/'.$service.$separation.$val;
390
			$url = Config::get('url_service_base').Config::get('nom_projet').'/'.$this->version_projet.'/'.$service.$separation.$val;
413
		}
391
		}
414
		return $url;
392
		return $url;
415
	}
393
	}
416
	
394
 
417
	public function encoderUrl($url) {
395
	public function encoderUrl($url) {
418
		$url = str_replace(' ', '%20', $url);
396
		$url = str_replace(' ', '%20', $url);
419
		$url = str_replace('?', urlencode('?'), $url);
397
		$url = str_replace('?', urlencode('?'), $url);
420
		return $url;
398
		return $url;
421
	}
399
	}