Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev 531 Rev 534
1
<?php
1
<?php
2
 
2
 
3
/**
3
/**
4
* classe pour web service qui affiche les images de Coste.
4
* classe pour web service qui affiche les images de Coste.
5
* il n'existe qu'une seule version pour les images de Coste : 2.00
5
* il n'existe qu'une seule version pour les images de Coste : 2.00
6
* retour en application/json
6
* retour en application/json
7
* 
7
* 
8
* exemple d'appel du service  : 
8
* exemple d'appel du service  : 
9
* .../service:eflore:0.1/coste/images?masque.nt=1053
9
* .../service:eflore:0.1/coste/images?masque.nt=1053
10
* .../service:eflore:0.1/coste/images?masque.nn=39594,39601
10
* .../service:eflore:0.1/coste/images?masque.nn=39594,39601
11
* .../service:eflore:0.1/coste/images
11
* .../service:eflore:0.1/coste/images
12
* 
12
* 
13
* paramètres disponibles : navigation.depart, navigation.limite, masque.nn, masque.nt
13
* paramètres disponibles : navigation.depart, navigation.limite, masque.nn, masque.nt
14
* 
14
* 
15
* @package eFlore/services
15
* @package eFlore/services
16
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
16
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
17
* @author Mathilde Salthun-Lassalle <mathilde@tela-botanica.org>
17
* @author Mathilde Salthun-Lassalle <mathilde@tela-botanica.org>
18
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
18
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
19
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
* @version 1.0
20
* @version 1.0
21
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
21
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
22
*/
22
*/
23
 
23
 
24
class Images extends Commun {
24
class Images extends Commun {
25
	
25
	
26
	protected  $table ;
26
	protected  $table ;
27
	private $requete_condition = array(" image != '' ");
27
	private $requete_condition = array(" image != '' ");
28
	private $champs_recherches = " num_nom, image, flore_bdtfx_nn, flore_bdtfx_nt ";
28
	private $champs_recherches = " num_nom, image, flore_bdtfx_nn, flore_bdtfx_nt ";
29
	private $total_resultat;
29
	private $total_resultat;
30
	protected $limite_requete = array('depart' => 0, 'limite' => 100);
30
	protected $limite_requete = array('depart' => 0, 'limite' => 100);
31
	private $masque = array();
31
	private $masque = array();
32
	
32
	
33
	
33
	
34
 
34
 
35
	
35
	
36
	public function consulter($ressources, $parametres) {
36
	public function consulter($ressources, $parametres) {
37
		$this->ressources = $ressources;
37
		$this->ressources = $ressources;
38
		$this->parametres = $parametres;
38
		$this->parametres = $parametres;
39
		$this->traiterRessources();
39
		$this->traiterRessources();
40
		$this->traiterParametres();
40
		$this->traiterParametres();
41
		$this->table = config::get('bdd_table').'_v2_00'; 
41
		$this->table = config::get('bdd_table').'_v2_00'; 
42
		$requete = $this->assemblerLaRequete();
42
		$requete = $this->assemblerLaRequete();
43
		$resultat = $this->getBdd()->recupererTous($requete);
43
		$resultat = $this->getBdd()->recupererTous($requete);
44
		$resultats = $this->formaterResultat($resultat);
44
		$resultats = $this->formaterResultat($resultat);
45
		return $resultats;
45
		return $resultats;
46
	}
46
	}
47
	
47
	
48
	//+-----------------------------------traitement ressources et paramètres --------------------------------+
48
	//+-----------------------------------traitement ressources et paramètres --------------------------------+
49
	
49
	
50
	
50
	
51
	public function traiterRessources() {
51
	public function traiterRessources() {
52
			if (empty($this->ressources) ) {
52
			if (empty($this->ressources) ) {
53
				if (isset($this->parametres['masque.nn']) == false
53
				if (isset($this->parametres['masque.nn']) == false
54
				&& isset($this->parametres['masque.nt']) == false) {
54
				&& isset($this->parametres['masque.nt']) == false) {
55
				$this->requete_condition[] = " flore_bdtfx_nt != '' AND flore_bdtfx_nn != '' ";
55
				$this->requete_condition[] = " flore_bdtfx_nt != '' AND flore_bdtfx_nn != '' ";
56
				}
56
				}
57
			} else {
57
			} else {
58
				$e = "La ressource {$this->ressources[0]} n'existe pas.";
58
				$e = "La ressource {$this->ressources[0]} n'existe pas.";
59
				$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
59
				$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
60
			}
60
			}
61
	}
61
	}
62
	
62
	
63
	public function traiterParametres() {
63
	public function traiterParametres() {
64
		foreach ($this->parametres as $param => $val ) {
64
		foreach ($this->parametres as $param => $val ) {
65
			switch ($param) {
65
			switch ($param) {
66
				case 'masque.nt' :
66
				case 'masque.nt' :
67
					$this->analyserMasque($val,'nt');
67
					$this->analyserMasque($val,'nt');
68
					break;
68
					break;
69
				case 'masque.nn' :
69
				case 'masque.nn' :
70
					$this->analyserMasque($val,'nn');
70
					$this->analyserMasque($val,'nn');
71
					break;
71
					break;
72
				case 'navigation.depart' :
72
				case 'navigation.depart' :
73
					$this->limite_requete['depart'] = $val;
73
					$this->limite_requete['depart'] = $val;
74
					break;
74
					break;
75
				case 'navigation.limite' :
75
				case 'navigation.limite' :
76
					$this->limite_requete['limite'] = $val;
76
					$this->limite_requete['limite'] = $val;
77
					break;
77
					break;
78
				default : 
78
				default : 
79
					$e = 'Erreur dans les paramètres de recherche de votre requête : </br> Le parametre " '
79
					$e = 'Erreur dans les paramètres de recherche de votre requête : </br> Le parametre " '
80
					.$param.' " n\'existe pas.';
80
					.$param.' " n\'existe pas.';
81
					$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
81
					$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
82
					break;
82
					break;
83
			}
83
			}
84
		}
84
		}
85
	}
85
	}
-
 
86
	
-
 
87
	/*private function traiterVersion() {
-
 
88
		if( isset($this->parametres['version.projet']) ) {
-
 
89
			$version = $this->parametres['version.projet'];
-
 
90
			if (preg_match('/^([0-9]+(?:[._][0-9]+|))$/', $version, $retour)) {
-
 
91
					$this->version[] = $retour[0];
-
 
92
					$this->version_projet[] = 'v'.str_replace('.', '_', $this->version[0]);
-
 
93
					$this->table_version[] = Config::get('bdd_table').''.$this->version_projet[0];
-
 
94
				} elseif ($version ==  '+')  {
-
 
95
					$this->obtenirDerniereVersion();
-
 
96
				} elseif ($version ==  '*' && empty($this->ressources) == false ) {
-
 
97
					$this->chargerVersions();
-
 
98
					$total = count($this->metadonnees);
-
 
99
					for($i = 0 ; $i < $total ; $i++) {
-
 
100
						$this->version[$i] = $this->metadonnees[$i]['version'];
-
 
101
						$this->version_projet[$i] = 'v'.str_replace('.', '_',$this->version[$i]);
-
 
102
						$this->table_version[$i] = Config::get('bdd_table').''.$this->version_projet[$i];
-
 
103
					}
-
 
104
				}else {
-
 
105
					$e = 'Erreur parametre version inconnu. ';
-
 
106
					$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
-
 
107
				}
-
 
108
		} else {
-
 
109
			$this->obtenirDerniereVersion();
-
 
110
		}
-
 
111
		
-
 
112
	}
-
 
113
	
-
 
114
	private function obtenirDerniereVersion(){
-
 
115
		$this->chargerVersions();
-
 
116
		$this->version[] = $this->metadonnees[0]['version'];
-
 
117
		$this->version_projet[] ='v'.str_replace('.', '_',$this->metadonnees[0]['version']);
-
 
118
		$this->table_version[] = Config::get('bdd_table').''.$this->version_projet[0];
-
 
119
	}
-
 
120
 
-
 
121
	private function chargerVersions() {
-
 
122
		$requete = "SELECT version ".
-
 
123
							"FROM ".Config::get('bdd_table_meta')." ".
-
 
124
							"ORDER BY date_creation DESC ";
-
 
125
		$resultats = $this->Bdd->recupererTous($requete);
-
 
126
		if (!is_array($resultats) || count($resultats) <= 0) {
-
 
127
			$message = "Les méta-données n'ont pu être chargée pour la ressource demandée";
-
 
128
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
-
 
129
			throw new Exception($message, $code);
-
 
130
		}
-
 
131
	 
86
	
132
		$this->metadonnees = $resultats;
87
	
133
	}*/
88
 
134
 
89
 
135
 
90
	
136
	
91
	private function analyserMasque($valeur, $type_masque) {
137
	private function analyserMasque($valeur, $type_masque) {
92
		$this->masque[] = "$type_masque=$valeur";
138
		$this->masque[] = "$type_masque=$valeur";
93
		if (empty($valeur)) {
139
		if (empty($valeur)) {
94
			$e = 'renseignez une valeur pour masque.nn';
140
			$e = 'renseignez une valeur pour masque.nn';
95
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
141
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
96
		} elseif (preg_match('/^[0-9]+$/', $valeur)) {
142
		} elseif (preg_match('/^[0-9]+$/', $valeur)) {
97
			$this->requete_condition[] = " flore_bdtfx_".$type_masque." = $valeur";
143
			$this->requete_condition[] = " flore_bdtfx_".$type_masque." = $valeur";
98
		} elseif (preg_match('/[0-9]+/', $valeur)){
144
		} elseif (preg_match('/[0-9]+/', $valeur)){
99
			$nums = explode(',', $valeur);
145
			$nums = explode(',', $valeur);
100
			$total = count($nums);
146
			$total = count($nums);
101
			$condition = '';
147
			$condition = '';
102
			for ($i = 0; $i < $total;  $i++) {
148
			for ($i = 0; $i < $total;  $i++) {
103
				$condition .= " flore_bdtfx_".$type_masque." = {$nums[$i]}";
149
				$condition .= " flore_bdtfx_".$type_masque." = {$nums[$i]}";
104
				if ($i < ($total-1) ) {
150
				if ($i < ($total-1) ) {
105
					$condition .= " OR ";
151
					$condition .= " OR ";
106
				}
152
				}
107
			}
153
			}
108
			$this->requete_condition[] = $condition;
154
			$this->requete_condition[] = $condition;
109
		} else {
155
		} else {
110
			$e = "valeur incorrecte pour masque.".$type_masque;
156
			$e = "valeur incorrecte pour masque.".$type_masque;
111
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
157
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
112
		}
158
		}
113
	}
159
	}
114
	
160
	
115
	
161
	
116
	
162
	
-
 
163
	
-
 
164
	/*public function verifierFormat($format) {
-
 
165
		if (in_array($format, $this->formats_supportes)) {
-
 
166
			$this->format_retour = $format;
-
 
167
		} else {
-
 
168
			$e = "Le format $format demandé n'est pas disponible.";
-
 
169
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
-
 
170
		}
117
	
171
	}*/
118
 
172
	
119
	
173
	
120
//+-------------------------------------------formatage résultats---------------------------------------------+
174
//+-------------------------------------------formatage résultats---------------------------------------------+
121
 
175
 
122
	public function formaterResultat($resultat) {
176
	public function formaterResultat($resultat) {
123
		$versionResultat['entete'] = $this->formaterEnteteResultat();;
177
		$versionResultat['entete'] = $this->formaterEnteteResultat();;
124
		if ($resultat == '') {
178
		if ($resultat == '') {
125
			$message = 'La requête SQL formée comporte une erreur!';
179
			$message = 'La requête SQL formée comporte une erreur!';
126
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
180
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
127
			throw new Exception($message, $code);
181
			throw new Exception($message, $code);
128
		} elseif ($resultat) {
182
		} elseif ($resultat) {
129
			$versionResultat['resultats'] = $this->retournerResultatFormate($resultat);
183
			$versionResultat = $this->retournerResultatFormate($resultat);
130
		} else {
184
		} else {
131
			$versionResultat['resultats'] = array();
185
			$versionResultat['resultats'] = array();
132
		}
186
		}
133
		return $versionResultat;
187
		return $versionResultat;
134
	}
188
	}
135
	
189
	
136
	public function retournerResultatFormate($resultat) {
190
	public function retournerResultatFormate($resultat) {
137
		$resultat_json = array();
191
		$resultat_json = array();
138
			foreach ($resultat as $tab) {
192
			foreach ($resultat as $tab) {
139
				$num_coste = $tab['num_nom'];
193
				$num_coste = $tab['num_nom'];
140
				unset($tab['num_nom']);
194
				unset($tab['num_nom']);
141
				$resultat_json['resultats'][$num_coste]['num_nomenclatural'] = $tab['flore_bdtfx_nn'];
195
				$resultat_json['resultats'][$num_coste]['num_nomenclatural'] = $tab['flore_bdtfx_nn'];
142
				$resultat_json['resultats'][$num_coste]['num_taxonomique'] = $tab['flore_bdtfx_nt'];
196
				$resultat_json['resultats'][$num_coste]['num_taxonomique'] = $tab['flore_bdtfx_nt'];
143
				$resultat_json['resultats'][$num_coste]['binaire.href'] = $this->formaterUrlImage($tab['image']);
197
				$resultat_json['resultats'][$num_coste]['binaire.href'] = $this->formaterUrlImage($tab['image']);
144
				$resultat_json['resultats'][$num_coste]['mime'] = "images/png";
198
				$resultat_json['resultats'][$num_coste]['mime'] = "images/png";
145
			}
199
			}
146
		return $resultat_json;
200
		return $resultat_json;
147
	}
201
	}
148
	
202
	
149
	public function formaterUrlImage($fichier) {
203
	public function formaterUrlImage($fichier) {
150
		$chemin = config::get('donnees')."2.00/img/$fichier"; 
204
		$chemin = config::get('donnees')."2.00/img/$fichier"; 
151
		return $chemin;
205
		return $chemin;
152
	}
206
	}
153
	
207
	
-
 
208
 
-
 
209
	/*public function donnerVersionDuneTable($table) {
-
 
210
		$version = strstr($table,'v');
-
 
211
		$version = str_replace('v','', $version);
-
 
212
		$version = str_replace('_','.', $version);
154
 
213
		return $version;
155
	
214
	}*/
156
	
215
	
157
	public function formaterEnteteResultat() {
216
	public function formaterEnteteResultat() {
158
		$entete['depart'] = $this->limite_requete['depart'];
217
		$entete['depart'] = $this->limite_requete['depart'];
159
		$entete['limite'] = $this->limite_requete['limite'];
218
		$entete['limite'] = $this->limite_requete['limite'];
160
		$entete['total']  =  $this->total_resultat;
219
		$entete['total']  =  $this->total_resultat;
161
		$entete['masque']  = empty($this->masque) ? 'aucun' : implode('&', $this->masque);
220
		$entete['masque']  = empty($this->masque) ? 'aucun' : implode('&', $this->masque);
162
		$url = $this->formulerUrl($this->total_resultat, '/images');
221
		$url = $this->formulerUrl($this->total_resultat, '/images');
163
		if (isset($url['precedent']) && $url['precedent'] != '') {
222
		if (isset($url['precedent']) && $url['precedent'] != '') {
164
			$entete['href.precedent'] = $url['precedent'];
223
			$entete['href.precedent'] = $url['precedent'];
165
		}
224
		}
166
		if (isset($url['suivant']) && $url['suivant'] != '') {
225
		if (isset($url['suivant']) && $url['suivant'] != '') {
167
			$entete['href.suivant']   = $url['suivant'];
226
			$entete['href.suivant']   = $url['suivant'];
168
		}
227
		}
169
		return $entete;
228
		return $entete;
170
	}
229
	}
171
	
230
	
172
	//+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
231
	//+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
173
	
232
	
174
	public function assemblerLaRequete() {
233
	public function assemblerLaRequete() {
175
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
234
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
176
		.$this->retournerRequeteCondition().' '
235
		.$this->retournerRequeteCondition().' '
177
		.$this->delimiterResultatsRequete();
236
		.$this->delimiterResultatsRequete();
178
		return $requete;
237
		return $requete;
179
	}
238
	}
180
	
239
	
181
 
240
 
182
	
241
	
183
	public  function retournerRequeteCondition() {
242
	public  function retournerRequeteCondition() {
184
		$condition = '';
243
		$condition = '';
185
		if (empty($this->requete_condition) == false) {
244
		if (empty($this->requete_condition) == false) {
186
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
245
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
187
		}
246
		}
188
		return $condition;
247
		return $condition;
189
	}
248
	}
190
	
249
	
191
 
250
 
192
	
251
	
193
	public function calculerTotalResultat() {
252
	public function calculerTotalResultat() {
194
		$requete = 'SELECT count(*) as nombre FROM '.$this->table.' '
253
		$requete = 'SELECT count(*) as nombre FROM '.$this->table.' '
195
		.$this->retournerRequeteCondition();
254
		.$this->retournerRequeteCondition();
196
		$res = $this->getBdd()->recuperer($requete);
255
		$res = $this->getBdd()->recuperer($requete);
197
		if ($res) {
256
		if ($res) {
198
			$this->total_resultat = $res['nombre'];
257
			$this->total_resultat = $res['nombre'];
199
		} else { 
258
		} else { 
200
			$this->total_resultat = 0;
259
			$this->total_resultat = 0;
201
			$e = 'Données introuvables dans la base';
260
			$e = 'Données introuvables dans la base';
202
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
261
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
203
		}
262
		}
204
	}
263
	}
205
	
264
	
206
	
265
	
207
	public function delimiterResultatsRequete() {
266
	public function delimiterResultatsRequete() {
208
		$this->calculerTotalResultat();
267
		$this->calculerTotalResultat();
209
		$requete_limite = '';
268
		$requete_limite = '';
210
		if ((count($this->ressources)) == 0)  {
269
		if ((count($this->ressources)) == 0)  {
211
			if (($this->limite_requete['depart'] <=  $this->total_resultat) ){
270
			if (($this->limite_requete['depart'] <  $this->total_resultat) && 
212
				if (($this->limite_requete['limite'] + $this->limite_requete['depart'] )
271
				(($this->limite_requete['limite'] + $this->limite_requete['depart'] )
213
				 < $this->total_resultat  ) {  
272
				 < $this->total_resultat  )) {  
214
					$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
273
					$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
215
					.$this->limite_requete['limite'];
274
					.$this->limite_requete['limite'];
216
				}
-
 
217
			} else {
-
 
218
				$e = "Erreur : la valeur pour le paramètre navigation.départ est supérieure".
-
 
219
				" au nombre total de résultats.";
-
 
220
				throw new Exception($e, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
-
 
221
			}
275
			} 
222
		}
276
		}
223
		return $requete_limite;
277
		return $requete_limite;
224
	}
278
	}
225
	
279
	
226
}
280
}
227
?>
281
?>