Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 466 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
452 mathilde 1
<?php
2
 
3
/**
4
* Classe InformationsBaseflor.php permet de faire des requetes de baseflor en fonction d'un référentiel
5
*( BDTFX, BDAFX, BDBFX ) et d'un numéro nomenclatural ( différent de 0 ).
6
*  fin d'url possibles :
7
*  /informations/#bdnt.nn:#num_nomen --> retourne tous les champs pour un BDNT et un num_nomen
8
*  /informations/#bdnt.nn:#num_nomen?champs=description --> retourne champs description pour un BDNT et un num_nomen
9
*  /informations/#bdnt.nn:#num_nomen?champs=ecologie --> retourne champs ecologiques pour un BDNT et un num_nomen
10
*  /informations --> retourne les 10 premiers résultats
11
*  /informations?navigation.limite=..&navigation.depart=.. --> retourne les 10 premiers résultats avec limites
12
*
13
* Encodage en entrée : utf8
14
* Encodage en sortie : utf8
15
* @package eflore-projets
16
* @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org>
17
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
18
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
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>
21
* @version 1.0
22
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
23
*/
24
 
25
class InformationsBaseflor extends Commun{
26
 
27
	protected $table = "";
28
	private $requete_condition = "";
29
	private $format_reponse = 'informations';
30
	private $total_resultat;
31
	private $retour_format = 'max';
32
	protected $limite_requete = array( 'depart' => 0, 'limite' => 10);
33
	private $champs_recherches = '*';
34
	private $champs_ontologiques = array();
35
	protected $serviceNom = 'informations';
36
 
37
 
38
 
39
	public function consulter($ressources, $parametres) {
40
 
41
		$this->ressources = $ressources;
42
		$this->parametres = $parametres;
43
		$this->traiterParametres();
44
		$this->traiterVersionProjet();
45
		$resultats = null;
46
		foreach ($this->table_version as $version) {
47
			$this->table = $version;
48
			$this->recupererNomChamp($this->table);
49
			$this->traiterRessources();
50
			$requete = $this->assemblerLaRequete();
51
			$resultat = $this->getBdd()->recupererTous($requete);
52
 
53
			$versionResultat = $this->traiterResultat($resultat, $version, $requete);
54
			if (count($this->table_version) > 1) {
55
				$resultats[$version] = $versionResultat;
56
			} else {
57
				$resultats = $versionResultat;
58
			}
59
		}
60
 
61
		return $resultats;
62
	}
63
 
64
 
65
 
66
	public function traiterResultat($resultat, $version, $requete) {
67
		$versionResultat = null;
68
		if ($resultat == '') {
69
			$message = 'La requête SQL formée comporte une erreur!';
70
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
71
			throw new Exception($message, $code);
72
		} elseif ($resultat) {
73
			$versionResultat = $this->retournerResultatFormate($resultat, $version);
74
		}
75
		return $versionResultat;
76
	}
77
 
78
//+--------------------------traitement ressources ou paramètres  -------------------------------------------+
79
	public function traiterParametres() {
80
		if (isset($this->parametres) && !empty($this->parametres)) {
81
			foreach ($this->parametres as $param => $valeur) {
82
				switch ($param) {
83
					case 'navigation.depart'  :
84
						 $this->limite_requete['depart'] = $valeur;	 break;
85
					case 'navigation.limite'  :  $this->limite_requete['limite'] = $valeur;	  break;
86
					case 'champs'  :
87
						if ($valeur == "description") {
88
							$this->champs_recherches = "num_nomen, BDNT, chorologie, inflorescence,"
89
							." sexualite, ordre_maturation, "
90
							."pollinisation, fruit, dissemination, couleur_fleur, macule, floraison, type_bio, "
91
						 	."form_vegetale ";
92
						}elseif ($valeur == "ecologie"){
93
							$this->champs_recherches = "num_nomen, BDNT, ve_lumiere , ve_temperature,"
94
							." ve_continentalite, ve_humidite_atmos, ve_humidite_edaph, ve_reaction_sol,"
95
							." ve_nutriments_sol, ve_salinite, ve_texture_sol, ve_mat_org_sol ";
96
						}else {
97
							$e = 'Valeur de paramètre inconnue  pour \'test\'. ';
98
							$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
99
						}
100
						break;
101
					case 'retour.format'  :
102
						$this->retour_format = $valeur;
103
						break;
104
					default :
105
						$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " '
106
							.$param.' " n\'existe pas.';
107
						$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);	break;
108
				}
109
			}
110
		}
111
	}
112
 
113
	public function traiterRessources() {
114
		if (isset($this->ressources) && !empty($this->ressources[0])) {
115
			if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[0], $retour)==1){
116
				switch ($retour[1]) {
117
					case 'bdtfx' :
118
						$this->requete_condition[] = "num_nomen = ".$retour[2]." AND BDNT = 'BDTFX' ";
119
						break;
120
					case  'bdafx' :
121
						$this->requete_condition[] = "num_nomen = ".$retour[2]." AND BDNT = 'BDAFX' ";
122
						break;
123
					case  'bdbfx' :
124
						$this->requete_condition[] = "num_nomen = ".$retour[2]." AND BDNT = 'BDBFX' ";
125
						break;
126
					default :
127
						$e = 'Erreur dans l\'url de votre requête : </br> La ressource " '
128
							.$retour[1].' " n\'existe pas.';
129
						$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
130
						break;
131
				}
132
 
133
			}
134
		} else {
135
			$this->champs_recherches=" cle, catminat_code, BDNT, num_taxon, num_nomen ";
136
		}
137
	}
138
 
139
//+--------------------------formatages de resultats  -------------------------------------------+
140
	public function retournerResultatFormate($resultat) {
141
		if ((count($this->ressources)) == 0) {
142
			$table_retour_json['resultat'] = $this->formaterResultatsInformations($resultat);
143
		} else {
144
			$table_retour_json = $this->formaterResultatsInformationsBDNTnn($resultat);
145
		}
146
		return $table_retour_json;
147
	}
148
 
149
	public function formaterResultatsInformationsBDNTnn($resultat){
150
	$resultat_json = $resultat[0];
151
	if ($this->retour_format == 'max'){
152
		if (!isset($this->parametres['champs']) ) {
153
			$resultat_json = $this->formaterResultatsTousChamps($resultat_json);
154
		} elseif ($this->parametres['champs'] == 'ecologie') {
155
			$resultat_json = $this->formaterResultatsChampsEcologie($resultat_json);
156
		} elseif ($this->parametres['champs'] == 'description') {
157
			$resultat_json = $this->formaterResultatsChampsDescription($resultat_json);
158
		}
159
	}
160
	return $resultat_json;
161
	}
162
 
163
 
164
	public function formaterResultatsTousChamps($resultat) {
165
		$resultat_json = $resultat;
166
 
167
		if ($resultat_json['type_bio'] != ""){
168
			$tab_ontologie = $this->recupererOntologiePrTypeBio($resultat_json['type_bio']);
169
			unset($resultat_json['type_bio']);
170
			$resultat_json= array_merge($resultat_json,$tab_ontologie);
171
		}
172
		$this->champs_ontologiques = $this->recupererTableauConfig('champs_ontologiques');
173
 
174
		foreach ($this->champs_ontologiques as $cle => $valeur){
175
			if ($resultat_json[$cle] != ""){
176
				$tab_ontologie = $this->recupererOntologies($resultat_json[$cle], $cle);
177
				unset($resultat_json[$cle]);
178
				$resultat_json = array_merge($resultat_json,$tab_ontologie);
179
			}
180
		}
181
			$resultat_json['graphique_climat']['libelle'] = 'climat';
182
			$resultat_json['graphique_climat']['href'] = $this->ajouterHref('graphiques/climat', strtolower($resultat_json['BDNT']).'.nn:'.$resultat_json['num_nomen']);
183
			$resultat_json['graphique_sol']['libelle'] = 'sol';
184
			$resultat_json['graphique_sol']['href'] = $this->ajouterHref('graphiques/sol', strtolower($resultat_json['BDNT']).'.nn:'.$resultat_json['num_nomen']);
185
 
186
		return $resultat_json ;
187
	}
188
 
189
	public function formaterResultatsChampsEcologie($resultat) {
190
		$resultat_json = $resultat;
191
		$this->champs_ontologiques = $this->recupererTableauConfig('champs_ontologiques');
192
		foreach ($this->champs_ontologiques as $cle => $valeur){
193
			if ($resultat_json[$cle] != ""){
194
				$tab_ontologie = $this->recupererOntologies($resultat_json[$cle], $cle);
195
				unset($resultat_json[$cle]);
196
				$resultat_json= array_merge($resultat_json,$tab_ontologie);
197
			}
198
		}
199
		$resultat_json['graphique_climat']['libelle'] = 'climat';
200
		$resultat_json['graphique_climat']['href'] = $this->ajouterHref('graphiques/climat', strtolower($resultat_json['BDNT']).'.nn:'.$resultat_json['num_nomen']);
201
		$resultat_json['graphique_sol']['libelle'] = 'sol';
202
		$resultat_json['graphique_sol']['href'] = $this->ajouterHref('graphiques/sol', strtolower($resultat_json['BDNT']).'.nn:'.$resultat_json['num_nomen']);
203
		return $resultat_json ;
204
	}
205
 
206
	public function formaterResultatsChampsDescription($resultat) {
207
		$resultat_json = $resultat;
208
		if ($resultat_json['type_bio'] != ""){
209
			$tab_ontologie = $this->recupererOntologiePrTypeBio($resultat_json['type_bio']);
210
			unset($resultat_json['type_bio']);
211
			$resultat_json = array_merge($resultat_json,$tab_ontologie);
212
		}
213
		return $resultat_json ;
214
	}
215
	public function formaterResultatsInformations($resultat) {
216
		$resultat_json = array();
217
		$resultat_json['entete'] = $this->ajouterEnteteResultat();
218
		foreach ($resultat as $tab) {
219
			if ($tab['BDNT'] != 'nc'){
220
				$num = $tab['cle'];
221
				unset($tab['cle']);
222
				foreach ($tab as $param => $valeur) {
223
					$resultat_json[$num][$param] = $valeur;
224
				}
225
				$resultat_json[$num]['href'] = $this->ajouterHref('informations',strtolower($tab['BDNT']).".nn:".$tab['num_nomen']);
226
			}
227
		}
228
		return $resultat_json;
229
	}
230
 
231
 
232
 
233
	public function ajouterEnteteResultat() {
234
		$entete['depart'] = $this->limite_requete['depart'];
235
		$entete['limite'] = $this->limite_requete['limite'];
236
		$entete['total']  =  $this->total_resultat;
237
		$entete['version']  = $this->version_projet;
238
		$url = $this->formulerUrl($this->total_resultat, '/informations');
239
		if (isset($url['precedent']) && $url['precedent'] != '') {
240
			$entete['href.precedent'] = $url['precedent'];
241
		}
242
		if (isset($url['suivant']) && $url['suivant'] != '') {
243
			$entete['href.suivant']   = $url['suivant'];
244
		}
245
		return $entete;
246
	}
247
 
248
 
249
//+--------------------------traitement ontologies -------------------------------------------+
250
	public function recupererOntologies($valeur, $champs){
251
		$url = $this->ajouterHref('ontologies',$this->champs_ontologiques[$champs].':'.urlencode(urlencode($valeur)));
252
		$val = $this->consulterHref($url);
253
		$resultat_json[$champs.'.libelle'] = $val->nom;
254
		$resultat_json[$champs.'.code'] = $valeur;
255
		$resultat_json[$champs.'.href'] = $url;
256
		return $resultat_json;
257
	}
258
 
259
 
260
 
261
	public function recupererOntologiePrTypeBio($type_a_traiter){
262
		$resultat_typeBio = "";
263
		if ($type_a_traiter != ""){
264
			$resultat_typeBio['type_bio.code'] = $type_a_traiter;
265
			$types_prim_sec = $this->separerTypesPrimairesSecondaires($type_a_traiter);
266
			foreach ($types_prim_sec as $cle => $tb){
267
				$types_sstypes[$cle]= $this->separerTypes_SousTypes($tb, $cle);
268
			}
269
			switch (count($types_sstypes)){
270
				case 1 :
271
					$types_sstypes = $types_sstypes['principal'];
272
					break;
273
				case 2 :
274
					$types_sstypes = array_merge($types_sstypes['principal'],$types_sstypes['secondaire']);
275
					break;
276
				case 3 :
277
					$types_sstypes = array_merge($types_sstypes['principal'],
278
												$types_sstypes['secondaire'],
279
												$types_sstypes['special']);
280
					break;
281
			  default :
282
			  	break;
283
 
284
			}
285
 
286
			foreach ($types_sstypes as $cle => $tb){
287
				if (($cle == 'type.principal') || ($cle == 'type.secondaire')){
288
					$url = $this->ajouterHref('ontologies','TB:'.urlencode(urlencode($tb)));
289
					$val = $this->consulterHref($url);
290
					$libelle[$cle]= $val->nom;
291
					$detail[$cle]['libelle'] = $val->nom;
292
					$detail[$cle]['code'] = $val->code;
293
					$detail[$cle]['href'] = $url;
294
				}
295
				if ( ($cle == 'sous_type.principal') || ($cle == 'sous_type.secondaire') || ($cle == 'sous_type.special') ){
296
					$i = 0;
297
					foreach ($tb as $sstypes){
298
						$url = $this->ajouterHref('ontologies','ssTT:'.urlencode(urlencode($sstypes)));
299
						$val = $this->consulterHref($url);
300
						$libelle[$cle]=$val->nom;
301
						$detail[$cle][$i]['libelle'] = $val->nom;
302
						$detail[$cle][$i]['code'] = $val->code;
303
						$detail[$cle][$i]['href'] = $url;
304
						$i++;
305
					}
306
				}
307
			}
308
		$resultat_typeBio['type_bio.libelle']= $this->formaterTypeBioPrLibelle($libelle);
309
		$resultat_typeBio['type_bio.detail'] = $detail;
310
		}
311
		return $resultat_typeBio;
312
	}
313
 
314
 
315
	public function formaterTypeBioPrLibelle($info){
316
		$libelle = $info['type.principal']." ";
317
		$libelle .= isset($info['sous_type.principal']) ? " (".$info['sous_type.principal'].") " : "";
318
		$libelle .= isset($info['type.secondaire']) ? ", ".$info['type.secondaire']." " : "";
319
		$libelle .= isset($info['sous_type.secondaire']) ? "(".$info['sous_type.secondaire'].") " : "";
320
		$libelle .= isset($info['sous_type.special']) ? "(".$info['sous_type.special'].") " : "";
321
		return $libelle;
322
	}
323
 
324
 
325
	public function separerTypesPrimairesSecondaires($type){
326
		$types = array();
327
		//séparation des principaux et des secondaires
328
		if (( preg_match("/(.+)\((.+)\)\-{0,1}(.+){0,1}/", $type,$retour) == 1  )){
329
			$types['principal'] = $retour[1];
330
			$types['secondaire'] = $retour[2];
331
			if (isset($retour[3])){$types['special'] = $retour[3];}
332
		}else {
333
			$types['principal'] = $type;
334
		}
335
		return $types;
336
	}
337
 
338
	public function separerTypes_SousTypes($type_a_traiter, $typePrimOuSec){
339
		$types = array();
340
		if(( preg_match("/^([a-zA-Zé]+)\-(.+)$|^([a-zA-Zé]+[^\-])$/", $type_a_traiter, $retour) == 1  )){
341
    		//recupère le type unique
342
 
343
			$type = (isset($retour[3]) && ($typePrimOuSec != 'special') ) ? $retour[3] : $retour[1] ;
344
			$types['type.'.$typePrimOuSec]= $type;
345
    		//recupère le ou les sous-types
346
    		if ((isset($retour[3]) && ($typePrimOuSec == 'special') )){
347
    			$ss_types[0] = (isset($retour[3]) && ($typePrimOuSec == 'special') ) ? $retour[3] : "" ;
348
    		}elseif(isset($retour[2]) && ($retour[2] != "")){
349
    			$ss_types[0]= (isset($retour[2]) && ($retour[2] != "") ) ? $retour[2] : "" ;
350
    		}
351
     		if (isset($ss_types[0])){
352
    			if (( preg_match("/\-/", $ss_types[0])) == 1 ){
353
    				$ss_types = preg_split("/\-/", $ss_types[0]);
354
    			}
355
				for($i = 0 ; $i < count($ss_types); $i++){
356
    				$types['sous_type.'.$typePrimOuSec][$i] = $ss_types[$i];
357
        			}
358
    		}
359
    	}
360
 
361
 		return $types;
362
	}
363
 
364
 
365
//+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
366
 
367
	public function assemblerLaRequete() {
368
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
369
		.$this->retournerRequeteCondition().' '
370
		.$this->delimiterResultatsRequete();
371
		return $requete;
372
	}
373
 
374
 
375
 
376
	public  function retournerRequeteCondition() {
377
		$condition = '';
378
		if ($this->requete_condition !== "") {
379
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
380
		}
381
		return $condition;
382
	}
383
 
384
 
385
 
386
	public function calculerTotalResultat() {
387
		//on récupère le nombre total de résultats de la requete
388
		$requete = 'SELECT count(*) as nombre FROM '.$this->table.' '
389
		.$this->retournerRequeteCondition();
390
		$res = $this->getBdd()->recuperer($requete);
391
		if ($res) {
392
			$this->total_resultat = $res['nombre'];
393
		} else {
394
			$this->total_resultat = 0;
395
			$e = 'Données introuvables dans la base';
396
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
397
			Debug::printr($requete);
398
		}
399
	}
400
 
401
	public function delimiterResultatsRequete() {
402
		$this->calculerTotalResultat();
403
		if ((count($this->ressources)) == 0)  {
404
			if (($this->limite_requete['depart'] <  $this->total_resultat) &&
405
				(($this->limite_requete['depart'] + $this->limite_requete['limite'])
406
				< $this->total_resultat  )){
407
					$this->requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
408
					.$this->limite_requete['limite'];
409
			}else {
410
				$e = 'Données introuvables dans la base. ';
411
				$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
412
				}
413
		}else {
414
			$this->requete_limite='';
415
		}
416
		return $this->requete_limite;
417
	}
418
}
419
?>