Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 490 | Rev 527 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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