Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 518 | Rev 548 | Go to most recent revision | Details | Compare with Previous | 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
499 jpm 5
*( BDTFX, BDAFX, BDBFX ) et d'un numéro nomenclatural ( différent de 0 ).
452 mathilde 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{
499 jpm 26
 
452 mathilde 27
	protected $table = "";
28
	private $format_reponse = 'informations';
29
	private $retour_format = 'max';
30
	private $champs_ontologiques = array();
31
	protected $serviceNom = 'informations';
525 mathilde 32
	private $Requete;
33
	private $Conteneur;
34
	private $Requete_assemblage;
35
	private $Bdd;
36
 
499 jpm 37
 
452 mathilde 38
	public function consulter($ressources, $parametres) {
39
		$this->ressources = $ressources;
40
		$this->parametres = $parametres;
41
		$this->traiterParametres();
518 mathilde 42
		$this->DefinirTables();
43
		$this->traiterRessources();
452 mathilde 44
		$resultats = null;
499 jpm 45
		foreach ($this->table_version as $version) {
525 mathilde 46
			$this->Requete->table = $version;
47
			$requete = $this->Requete_assemblage->assemblerLaRequete($this->Requete);
48
			$resultat =  $this->Bdd->recupererTous($requete);
49
			$versionResultat = $this->analyserResultat($resultat);
452 mathilde 50
			if (count($this->table_version) > 1) {
51
				$resultats[$version] = $versionResultat;
52
			} else {
53
				$resultats = $versionResultat;
54
			}
55
		}
499 jpm 56
		return $resultats;
452 mathilde 57
	}
499 jpm 58
 
525 mathilde 59
	public function __construct(Conteneur $Conteneur) {
60
		$this->Conteneur = $Conteneur;
61
		$this->Requete = new Requete();
62
		$this->Bdd = $Conteneur->getBdd();
63
		$this->Requete_assemblage = $Conteneur->getRequetesAssemblage();
64
	}
65
 
66
	public function analyserResultat($resultat) {
452 mathilde 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) {
525 mathilde 73
			$versionResultat = $this->retournerResultatFormate($resultat);
499 jpm 74
		}
452 mathilde 75
		return $versionResultat;
76
	}
499 jpm 77
 
78
//+--------------------------traitement ressources ou paramètres  -------------------------------------------+
452 mathilde 79
	public function traiterParametres() {
80
		if (isset($this->parametres) && !empty($this->parametres)) {
81
			foreach ($this->parametres as $param => $valeur) {
82
				switch ($param) {
516 mathilde 83
					case 'categorie'  :
452 mathilde 84
						if ($valeur == "description") {
525 mathilde 85
							$this->Requete->champs_recherches = "num_nomen, BDNT, chorologie, inflorescence,"
499 jpm 86
								." sexualite, ordre_maturation, "
87
								."pollinisation, fruit, dissemination, couleur_fleur, macule, floraison, type_bio, "
88
						 		."form_vegetale ";
525 mathilde 89
							$this->Requete->requete_condition[] = "( chorologie != '' OR inflorescence != '' ".
499 jpm 90
								"OR  sexualite != '' OR ordre_maturation != '' OR pollinisation != '' ".
91
								"OR fruit != '' OR dissemination != '' OR couleur_fleur != '' OR macule != '' ".
92
								"OR floraison != '' OR type_bio != '' OR form_vegetale != '' )";
93
						}elseif ($valeur == "ecologie") {
525 mathilde 94
							$this->Requete->champs_recherches = " num_nomen, BDNT, ve_lumiere , ve_temperature,"
499 jpm 95
								." ve_continentalite, ve_humidite_atmos, ve_humidite_edaph, ve_reaction_sol,"
517 mathilde 96
								." ve_nutriments_sol, ve_salinite, ve_texture_sol, ve_mat_org_sol, "
97
								." vi_lumiere, vi_temperature, vi_continentalite, vi_humidite_edaph,"
98
								." vi_reaction_sol, vi_nutriments_sol, vi_salinite ";
525 mathilde 99
							$this->Requete->requete_condition[] = "( ve_lumiere  != '' OR ve_temperature != '' ".
466 mathilde 100
								"OR ve_continentalite != '' OR ve_humidite_atmos != '' ".
101
								"OR ve_humidite_edaph != '' OR ve_reaction_sol != '' ".
102
								"OR ve_nutriments_sol != '' OR ve_salinite != '' ".
499 jpm 103
								"OR ve_texture_sol != '' OR ve_mat_org_sol != '' )";
104
						} else {
517 mathilde 105
							$e = "Valeur de paramètre inconnue pour 'categorie'.";
525 mathilde 106
							throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
452 mathilde 107
						}
108
						break;
109
					case 'retour.format'  :
517 mathilde 110
						if ($valeur == 'min' || $valeur == 'max') {
111
							$this->retour_format = $valeur;
112
							break;
113
						} else {
114
							$e = "Valeur de paramètre inconnue pour 'retour.format'.";
525 mathilde 115
							throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
517 mathilde 116
						}
518 mathilde 117
					case 'version.projet' :
118
						$this->traiterVersion($valeur);
119
						break;
452 mathilde 120
					default :
121
						$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " '
122
							.$param.' " n\'existe pas.';
525 mathilde 123
						throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
124
						break;
452 mathilde 125
				}
126
			}
127
		}
128
	}
517 mathilde 129
 
130
 
452 mathilde 131
 
132
	public function traiterRessources() {
525 mathilde 133
			if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[0], $retour)){
452 mathilde 134
				switch ($retour[1]) {
135
					case 'bdtfx' :
525 mathilde 136
						$this->Requete->requete_condition[] = "num_nomen = ".$retour[2]." AND BDNT = 'BDTFX' ";
137
 
452 mathilde 138
						break;
139
					case  'bdafx' :
525 mathilde 140
						$this->Requete->requete_condition[] = "num_nomen = ".$retour[2]." AND BDNT = 'BDAFX' ";
452 mathilde 141
						break;
142
					case  'bdbfx' :
525 mathilde 143
						$this->Requete->requete_condition[] = "num_nomen = ".$retour[2]." AND BDNT = 'BDBFX' ";
452 mathilde 144
						break;
145
					default :
516 mathilde 146
						$e = 'Erreur dans l\'url de votre requête : </br> Le référentiel " '
452 mathilde 147
							.$retour[1].' " n\'existe pas.';
525 mathilde 148
						throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
452 mathilde 149
						break;
499 jpm 150
				}
151
 
516 mathilde 152
			} else {
153
				$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
525 mathilde 154
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
516 mathilde 155
				break;
452 mathilde 156
			}
157
	}
518 mathilde 158
 
159
	//+++------------------------------traitement des versions----------------------------------------++
160
 
161
	public function traiterVersion($valeur) {
162
		if (preg_match('/^[0-9]+(?:[._][0-9]+)*$/', $valeur) || $valeur == '*' || $valeur == '+') {
163
			$this->version_projet = $valeur;
164
		} else {
165
			$e = "Erreur : La version est inconnue.";
525 mathilde 166
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
518 mathilde 167
		}
525 mathilde 168
 
518 mathilde 169
	}
170
 
171
	public function DefinirTables() {
172
		$table_num_version = $this->recupererVersionDisponible();
173
		$prefixe_table = config::get('bdd_table');
174
		if ( in_array($this->version_projet,$table_num_version) ) {
175
			$this->table_version[] = $prefixe_table.'_v'.$this->version_projet;
176
		} elseif ($this->version_projet == '+') {
177
					$derniere_version = $table_num_version[count($table_num_version) - 1];
178
					$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $derniere_version);
179
		} elseif ($this->version_projet == '*') {
180
			foreach ($table_num_version as $num_version) {
181
				$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $num_version);
182
			}
183
		} else {
184
			$e = "Erreur : La version est inconnue.";
525 mathilde 185
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
518 mathilde 186
		}
187
	}
188
 
452 mathilde 189
//+--------------------------formatages de resultats  -------------------------------------------+
525 mathilde 190
 
452 mathilde 191
	public function retournerResultatFormate($resultat) {
499 jpm 192
		$resultat_json = $resultat[0];
193
		if ($this->retour_format == 'max'){
516 mathilde 194
			if (!isset($this->parametres['categorie']) ) {
499 jpm 195
				$resultat_json = $this->formaterResultatsTousChamps($resultat_json);
516 mathilde 196
			} elseif ($this->parametres['categorie'] == 'ecologie') {
499 jpm 197
				$resultat_json = $this->formaterResultatsChampsEcologie($resultat_json);
516 mathilde 198
			} elseif ($this->parametres['categorie'] == 'description') {
499 jpm 199
				$resultat_json = $this->formaterResultatsChampsDescription($resultat_json);
200
			}
452 mathilde 201
		}
499 jpm 202
		return $resultat_json;
452 mathilde 203
	}
499 jpm 204
 
452 mathilde 205
	public function formaterResultatsTousChamps($resultat) {
206
		$resultat_json = $resultat;
207
		if ($resultat_json['type_bio'] != ""){
208
			$tab_ontologie = $this->recupererOntologiePrTypeBio($resultat_json['type_bio']);
209
			unset($resultat_json['type_bio']);
210
			$resultat_json= array_merge($resultat_json,$tab_ontologie);
211
		}
212
		$this->champs_ontologiques = $this->recupererTableauConfig('champs_ontologiques');
517 mathilde 213
		$Graphique_presence =  false;
452 mathilde 214
		foreach ($this->champs_ontologiques as $cle => $valeur){
215
			if ($resultat_json[$cle] != ""){
517 mathilde 216
				$Graphique_presence =  true;
452 mathilde 217
				$tab_ontologie = $this->recupererOntologies($resultat_json[$cle], $cle);
218
				unset($resultat_json[$cle]);
219
				$resultat_json = array_merge($resultat_json,$tab_ontologie);
220
			}
221
		}
517 mathilde 222
		if ($Graphique_presence) {
223
			$resultat_json['graphique_climat']['libelle'] = 'climat';
224
			$resultat_json['graphique_climat']['href'] = $this->ajouterHref('graphiques/climat', strtolower($resultat_json['BDNT']).'.nn:'.$resultat_json['num_nomen']);
225
			$resultat_json['graphique_sol']['libelle'] = 'sol';
226
			$resultat_json['graphique_sol']['href'] = $this->ajouterHref('graphiques/sol', strtolower($resultat_json['BDNT']).'.nn:'.$resultat_json['num_nomen']);
227
		}
452 mathilde 228
		return $resultat_json ;
229
	}
499 jpm 230
 
452 mathilde 231
	public function formaterResultatsChampsEcologie($resultat) {
232
		$resultat_json = $resultat;
233
		$this->champs_ontologiques = $this->recupererTableauConfig('champs_ontologiques');
517 mathilde 234
		$Graphique_presence =  false;
452 mathilde 235
		foreach ($this->champs_ontologiques as $cle => $valeur){
236
			if ($resultat_json[$cle] != ""){
517 mathilde 237
				$Graphique_presence =  true;
452 mathilde 238
				$tab_ontologie = $this->recupererOntologies($resultat_json[$cle], $cle);
239
				unset($resultat_json[$cle]);
517 mathilde 240
				$resultat_json = array_merge($resultat_json,$tab_ontologie);
452 mathilde 241
			}
242
		}
517 mathilde 243
	if ($Graphique_presence) {
244
			$resultat_json['graphique_climat']['libelle'] = 'climat';
245
			$resultat_json['graphique_climat']['href'] = $this->ajouterHref('graphiques/climat', strtolower($resultat_json['BDNT']).'.nn:'.$resultat_json['num_nomen']);
246
			$resultat_json['graphique_sol']['libelle'] = 'sol';
247
			$resultat_json['graphique_sol']['href'] = $this->ajouterHref('graphiques/sol', strtolower($resultat_json['BDNT']).'.nn:'.$resultat_json['num_nomen']);
248
		}
452 mathilde 249
		return $resultat_json ;
250
	}
499 jpm 251
 
452 mathilde 252
	public function formaterResultatsChampsDescription($resultat) {
253
		$resultat_json = $resultat;
254
		if ($resultat_json['type_bio'] != ""){
255
			$tab_ontologie = $this->recupererOntologiePrTypeBio($resultat_json['type_bio']);
256
			unset($resultat_json['type_bio']);
257
			$resultat_json = array_merge($resultat_json,$tab_ontologie);
258
		}
259
		return $resultat_json ;
260
	}
517 mathilde 261
 
262
 
525 mathilde 263
 
499 jpm 264
 
265
 
452 mathilde 266
//+--------------------------traitement ontologies -------------------------------------------+
518 mathilde 267
 
452 mathilde 268
	public function recupererOntologies($valeur, $champs){
518 mathilde 269
		$url = Config::get('url_service_base').Config::get('nom_projet').
270
			'/ontologies/'.$this->champs_ontologiques[$champs].':'.urlencode(urlencode($valeur));
452 mathilde 271
		$val = $this->consulterHref($url);
272
		$resultat_json[$champs.'.libelle'] = $val->nom;
273
		$resultat_json[$champs.'.code'] = $valeur;
274
		$resultat_json[$champs.'.href'] = $url;
275
		return $resultat_json;
276
	}
499 jpm 277
 
452 mathilde 278
	public function recupererOntologiePrTypeBio($type_a_traiter){
279
		$resultat_typeBio = "";
499 jpm 280
		if ($type_a_traiter != "") {
452 mathilde 281
			$resultat_typeBio['type_bio.code'] = $type_a_traiter;
282
			$types_prim_sec = $this->separerTypesPrimairesSecondaires($type_a_traiter);
499 jpm 283
			foreach ($types_prim_sec as $cle => $tb) {
452 mathilde 284
				$types_sstypes[$cle]= $this->separerTypes_SousTypes($tb, $cle);
285
			}
499 jpm 286
			switch (count($types_sstypes)) {
452 mathilde 287
				case 1 :
288
					$types_sstypes = $types_sstypes['principal'];
289
					break;
499 jpm 290
				case 2 :
452 mathilde 291
					$types_sstypes = array_merge($types_sstypes['principal'],$types_sstypes['secondaire']);
292
					break;
499 jpm 293
				case 3 :
452 mathilde 294
					$types_sstypes = array_merge($types_sstypes['principal'],
295
												$types_sstypes['secondaire'],
296
												$types_sstypes['special']);
297
					break;
298
			}
499 jpm 299
 
300
			foreach ($types_sstypes as $cle => $tb) {
301
				if (($cle == 'type.principal') || ($cle == 'type.secondaire')) {
518 mathilde 302
					$url = Config::get('url_service_base').Config::get('nom_projet').
303
					'/ontologies/TB:'.urlencode(urlencode($tb));
452 mathilde 304
					$val = $this->consulterHref($url);
305
					$libelle[$cle]= $val->nom;
306
					$detail[$cle]['libelle'] = $val->nom;
307
					$detail[$cle]['code'] = $val->code;
308
					$detail[$cle]['href'] = $url;
309
				}
499 jpm 310
				if ($cle == 'sous_type.principal' || $cle == 'sous_type.secondaire' || $cle == 'sous_type.special') {
311
					$i = 0;
312
					foreach ($tb as $sstypes) {
518 mathilde 313
						$url = Config::get('url_service_base').Config::get('nom_projet').
314
						'/ontologies/ssTT:'.urlencode(urlencode($sstypes));
452 mathilde 315
						$val = $this->consulterHref($url);
316
						$libelle[$cle]=$val->nom;
317
						$detail[$cle][$i]['libelle'] = $val->nom;
318
						$detail[$cle][$i]['code'] = $val->code;
499 jpm 319
						$detail[$cle][$i]['href'] = $url;
452 mathilde 320
						$i++;
321
					}
322
				}
323
			}
499 jpm 324
			$resultat_typeBio['type_bio.libelle']= $this->formaterTypeBioPrLibelle($libelle);
325
			$resultat_typeBio['type_bio.detail'] = $detail;
452 mathilde 326
		}
327
		return $resultat_typeBio;
328
	}
499 jpm 329
 
330
	public function formaterTypeBioPrLibelle($info) {
452 mathilde 331
		$libelle = $info['type.principal']." ";
332
		$libelle .= isset($info['sous_type.principal']) ? " (".$info['sous_type.principal'].") " : "";
333
		$libelle .= isset($info['type.secondaire']) ? ", ".$info['type.secondaire']." " : "";
334
		$libelle .= isset($info['sous_type.secondaire']) ? "(".$info['sous_type.secondaire'].") " : "";
335
		$libelle .= isset($info['sous_type.special']) ? "(".$info['sous_type.special'].") " : "";
336
		return $libelle;
337
	}
338
 
499 jpm 339
	public function separerTypesPrimairesSecondaires($type) {
340
		$types = array();
452 mathilde 341
		//séparation des principaux et des secondaires
499 jpm 342
		if (preg_match("/(.+)\((.+)\)\-{0,1}(.+){0,1}/", $type,$retour) == 1) {
343
			$types['principal'] = $retour[1];
452 mathilde 344
			$types['secondaire'] = $retour[2];
345
			if (isset($retour[3])){$types['special'] = $retour[3];}
499 jpm 346
		} else {
452 mathilde 347
			$types['principal'] = $type;
348
		}
349
		return $types;
350
	}
499 jpm 351
 
352
	public function separerTypes_SousTypes($type_a_traiter, $typePrimOuSec) {
452 mathilde 353
		$types = array();
499 jpm 354
		if (preg_match("/^([a-zA-Zé]+)\-(.+)$|^([a-zA-Zé]+[^\-])$/", $type_a_traiter, $retour) == 1) {
452 mathilde 355
    		//recupère le type unique
499 jpm 356
 
452 mathilde 357
			$type = (isset($retour[3]) && ($typePrimOuSec != 'special') ) ? $retour[3] : $retour[1] ;
358
			$types['type.'.$typePrimOuSec]= $type;
359
    		//recupère le ou les sous-types
499 jpm 360
    		if (isset($retour[3]) && $typePrimOuSec == 'special') {
452 mathilde 361
    			$ss_types[0] = (isset($retour[3]) && ($typePrimOuSec == 'special') ) ? $retour[3] : "" ;
499 jpm 362
    		} elseif (isset($retour[2]) && $retour[2] != '') {
452 mathilde 363
    			$ss_types[0]= (isset($retour[2]) && ($retour[2] != "") ) ? $retour[2] : "" ;
364
    		}
499 jpm 365
     		if (isset($ss_types[0])) {
366
    			if (preg_match("/\-/", $ss_types[0]) == 1) {
452 mathilde 367
    				$ss_types = preg_split("/\-/", $ss_types[0]);
368
    			}
499 jpm 369
				for ($i = 0 ; $i < count($ss_types); $i++) {
452 mathilde 370
    				$types['sous_type.'.$typePrimOuSec][$i] = $ss_types[$i];
499 jpm 371
        		}
452 mathilde 372
    		}
373
    	}
374
 		return $types;
375
	}
499 jpm 376
 
377
 
525 mathilde 378
 
452 mathilde 379
}
380
?>