Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev 529 Rev 548
Line 1... Line 1...
1
<?php
1
<?php
Line 2... Line 2...
2
 
2
 
-
 
3
/**
-
 
4
* Classe Informations.php interroge la table Index   
3
/**
5
* et redirige vers une autre classe si besoin 
-
 
6
* d'interroger une autre table (comme baseflor ou baseflor_rang_sup)
4
* Classe Informations.php redirige vers le web service pour baseflor ou pour les rangs supérieurs
7
* elle traite également le retour du web service : /informations
5
*  
8
*  
6
* Encodage en entrée : utf8
9
* Encodage en entrée : utf8
7
* Encodage en sortie : utf8
10
* Encodage en sortie : utf8
8
* @package eflore-projets
11
* @package eflore-projets
9
* @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org>
12
* @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org>
10
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
12
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
13
* @version 1.0
16
* @version 1.0
14
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
17
* @copyright 1999-2012 Tela Botanica (accueil@tela-botanica.org)
15
* 
18
* 
16
* 
19
* 
Line 17... Line -...
17
*/
-
 
-
 
20
*/
Line 18... Line 21...
18
 
21
 
Line 19... Line 22...
19
//to do : éliminer l'heritage (->traitement version et commun::formulerUrl (oblige à utiliser this->limite_requete ))
22
 
20
 
23
 
21
class Informations extends Commun {
24
class Informations extends Commun {
22
	
-
 
23
	protected $limite_requete = array( 'depart' => 0, 'limite' => 10);
25
	
-
 
26
	protected $limite_requete = array( 'depart' => 0, 'limite' => 10);
-
 
27
	private $table = "";
24
	private $table = "";
28
	private $champs_recherches = '*';
Line 25... Line 29...
25
	private $champs_recherches = '*';
29
	private $requete_jointure = "";
26
	private $requete_condition = "";
30
	private $requete_condition = "";
27
	private $requete_jointure = "";
31
	private $total_resultat;
28
	protected $serviceNom = 'informations';
32
	protected $serviceNom = 'informations';
29
	
33
	
30
	public function consulter($ressources, $parametres) {
34
	public function consulter($ressources, $parametres) {
31
			$this->ressources = $ressources;
35
			$this->ressources = $ressources;
32
			$this->parametres =  $parametres;
36
			$this->parametres =  $parametres;
33
			$versionResultat = null;
37
			$versionResultat = null;
34
			if (empty($this->ressources)){
38
			if (empty($this->ressources)){
35
				$this->traiterParametres();
39
				$this->traiterParametres();
36
			}
40
			}
37
			$this->traiterRessources();
41
			$this->traiterRessources();
38
			$requete = $this->Requete_assemblage->assemblerLaRequete($this->Requete);
42
			$requete = $this->assemblerLaRequete();
39
			$resultat = $this->Bdd->recupererTous($requete);
43
			$resultat = $this->Bdd->recupererTous($requete);
40
			$versionResultat = $this->analyserResultat($resultat);
44
			$versionResultat = $this->renvoyerResultat($resultat);
41
			if ($versionResultat == null) {
45
			if ($versionResultat == null) {
42
				$message = 'Les données recherchées sont introuvables.';
46
				$message = 'Les données recherchées sont introuvables.';
43
				$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
47
				$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
44
				throw new Exception($message, $code);
48
				throw new Exception($message, $code);
45
			}
49
			}
46
		return $versionResultat;
50
		return $versionResultat;
-
 
51
	}
47
	}
52
 
-
 
53
	public function __construct() {
48
	
54
		$Conteneur = new Conteneur();
-
 
55
		$this->Bdd = $Conteneur ->getBdd();
49
	public function __construct() {
56
		$prefixe_table = array ('index' => config::get('bdd_table_index'),
Line 50... Line 57...
50
		$this->Conteneur = new Conteneur();
57
								'baseflor' => config::get('bdd_table'),
51
		$this->Bdd = $this->Conteneur ->getBdd();
58
								'rangSup' => config::get('bdd_table_rang_sup'));
52
		$this->Requete = new Requete();
59
		$this->tables = $this->definirTables($prefixe_table);
53
		$this->Requete_assemblage = $this->Conteneur->getRequetesAssemblage();
60
		$this->table = $this->tables['index'];
54
	}
61
	}
55
	
62
	
Line 67... Line 74...
67
	
74
	
Line 68... Line -...
68
	
-
 
-
 
75
	
69
	
76
	
70
	//+--------------------------traitement ressources ou paramètres  -------------------------------------+
-
 
71
	
-
 
72
	//spécifiques à /informations
-
 
73
	public function traiterRessources() {
-
 
74
		$prefixe_table = array ('index' => config::get('bdd_table_index'),
77
	//+--------------------------traitement ressources ou paramètres  -------------------------------------+
-
 
78
	
75
								'baseflor' => config::get('bdd_table'),
79
 
76
								'rangSup' => config::get('bdd_table_rang_sup'));
80
	public function traiterRessources() {
77
		$tables = $this->definirTables($prefixe_table);
81
		if (empty($this->ressources)) {	
78
		if (empty($this->ressources)) {
82
			
79
			$this->Requete->limite_besoin = true;
83
			$this->requete_jointure = array(
-
 
84
				'LEFT JOIN '. $this->tables['baseflor'].' ON '
80
			$this->Requete->table = $tables['index'];
85
				.$this->tables['baseflor'].".cle =".$this->table.".baseflor",
81
			$baseflor = $tables['baseflor'];
86
				'LEFT JOIN '. $this->tables['rangSup'].' ON '
82
			$rangSup = $tables['rangSup'];
87
				.$this->tables['rangSup'].".cle = ".$this->table.".RangSup");
83
			$this->Requete->requete_jointure = array(
88
			
84
			array('type' => 'LEFT JOIN', 'table' => $baseflor,
-
 
85
					'on' => array("{$baseflor}.cle = {$this->Requete->table}.baseflor")),
89
			$this->champs_recherches = " {$this->tables['baseflor']}.num_nomen as 'baseflor.nn',
86
			array('type' => 'LEFT JOIN', 'table' => $rangSup ,
-
 
87
					'on' => array("{$rangSup}.cle = {$this->Requete->table}.RangSup"))
90
						{$this->tables['baseflor']}.BDNT as 'baseflor.bdnt', 
88
			);
91
						{$this->tables['baseflor']}.catminat_code,
89
			$this->Requete->champs_recherches = " {$baseflor}.num_nomen as 'baseflor.nn',
92
						{$this->tables['baseflor']}.num_taxon , 
90
						{$baseflor}.BDNT as 'baseflor.bdnt', {$baseflor}.catminat_code, {$baseflor}.num_taxon , 
93
						{$this->tables['rangSup']}.num_nomen as 'rangSup.nn', 
91
						{$rangSup}.num_nomen as 'rangSup.nn', {$rangSup}.bdnt as 'rangSup.bdnt',
-
 
92
						{$this->Requete->table}.cle as 'index.cle' ";
94
						{$this->tables['rangSup']}.bdnt as 'rangSup.bdnt',
93
		} else {
95
						{$this->table}.cle as 'index.cle' ";
94
			if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[0], $retour)){
96
		} else {
95
				$this->Requete->table = $tables['index'];
97
			if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[0], $retour)){
96
				$this->Requete->champs_recherches = " baseflor, rangSup ";
98
				$this->champs_recherches = " baseflor, rangSup ";
97
				$this->Requete->requete_condition[] = " `bdnt.nn` = '{$retour[0]}'  ";
99
				$this->requete_condition[] = " `bdnt.nn` = '{$retour[0]}'  ";
98
			} else {
100
			} else {
99
				$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
101
				$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
100
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
102
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
Line 101... Line -...
101
				break;
-
 
-
 
103
				break;
-
 
104
			}
102
			}
105
		}		
103
		}		
106
	}
104
	}
107
	
105
	
108
	
106
	//paramètres spécifiques à /informations
109
	
107
	public function traiterParametres() {
-
 
108
		if (isset($this->parametres) && !empty($this->parametres) ) {
-
 
109
			foreach ($this->parametres as $param => $valeur) {
-
 
110
				switch ($param) {
110
	public function traiterParametres() {
111
					case 'navigation.depart'  :
111
		if (isset($this->parametres) && !empty($this->parametres) ) {
112
						if (isset($this->parametres['navigation.limite'])) {
-
 
113
							if(preg_match('/^([0-9]+)$/', $valeur)){
-
 
114
								$this->Requete->limite_requete['depart'] = $valeur;
-
 
115
								$this->limite_requete['depart'] = $valeur;
-
 
116
								break;
-
 
117
							} else {
-
 
118
								$e = "Erreur : valeur erronnée pour le paramètre navigation.depart.";
-
 
119
								throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
120
							}
112
			foreach ($this->parametres as $param => $valeur) {
121
						} else {
-
 
122
							$e = "indiquez également la valeur pour le paramètre navigation.limite.";
-
 
123
							throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
124
						}
113
				switch ($param) {
125
					case 'navigation.limite'  :
114
					case 'navigation.depart'  :
126
						if (isset($this->parametres['navigation.depart'])) {
-
 
127
							if(preg_match('/^([0-9]+)$/', $valeur) && $valeur != 0){
-
 
128
								$this->Requete->limite_requete['limite'] = $valeur;
-
 
129
								$this->limite_requete['limite'] = $valeur;
-
 
130
								break;
-
 
131
							} else {
-
 
132
								$e = "Erreur : valeur erronnée pour le paramètre navigation.limite.";
-
 
133
								throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
134
							}
115
						$this->definirNavigationDepart($valeur);
135
						} else {
116
						break;
136
							$e = "indiquez également la valeur pour le paramètre navigation.depart.";
117
					case 'navigation.limite'  :
137
							throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
118
						$this->definirNavigationLimite($valeur);
138
						}
119
						break;
Line 146... Line 127...
146
				}
127
				}
147
			}
128
			}
148
		}
129
		}
149
	}
130
	}
Line -... Line 131...
-
 
131
	
-
 
132
	public function definirNavigationLimite($valeur){
-
 
133
		if (isset($this->parametres['navigation.depart'])) {
-
 
134
			if(preg_match('/^([0-9]+)$/', $valeur) && $valeur != 0){
-
 
135
					$this->limite_requete['limite'] = $valeur;
-
 
136
			} else {
-
 
137
					$e = "Erreur : valeur erronnée pour le paramètre navigation.limite.";
-
 
138
					throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
139
			}
-
 
140
		} else {
-
 
141
				$e = "indiquez également la valeur pour le paramètre navigation.depart.";
-
 
142
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
143
		}
-
 
144
	}
-
 
145
	
-
 
146
	public function definirNavigationDepart($valeur){
-
 
147
		if (isset($this->parametres['navigation.limite'])) {
-
 
148
			if(preg_match('/^([0-9]+)$/', $valeur)){
-
 
149
				$this->limite_requete['depart'] = $valeur;
-
 
150
			} else {
-
 
151
					$e = "Erreur : valeur erronnée pour le paramètre navigation.depart.";
-
 
152
					throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
153
					}
-
 
154
		} else {
-
 
155
				$e = "indiquez également la valeur pour le paramètre navigation.limite.";
-
 
156
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
157
		}
-
 
158
	}
150
	
159
	
Line 151... Line 160...
151
	//+++------------------------------traitement des versions----------------------------------------++
160
	//+++------------------------------traitement des versions----------------------------------------++
152
	
161
	
153
	public function traiterVersion($valeur) {
162
	public function traiterVersion($valeur) {
Line 186... Line 195...
186
	public function retournerResultatFormate($resultat) {
195
	public function retournerResultatFormate($resultat) {
187
		$resultat_json = array();
196
		$resultat_json = array();
188
		$resultat_json['entete'] = $this->ajouterEnteteResultat();
197
		$resultat_json['entete'] = $this->ajouterEnteteResultat();
189
		foreach ($resultat as $ligne => $tab) {
198
		foreach ($resultat as $ligne => $tab) {
190
			$num = $tab['index.cle'];
199
			$num = $tab['index.cle'];
-
 
200
			
191
			$resultat_json['resultats'][$num]['num_nomen'] = 
201
			$resultat_json['resultats'][$num]['num_nomen'] = 
192
				(empty ($tab['baseflor.nn'])) ? $tab['rangSup.nn'] : $tab['baseflor.nn'];
202
				(empty ($tab['baseflor.nn'])) ? $tab['rangSup.nn'] : $tab['baseflor.nn'];
-
 
203
			
193
			$resultat_json['resultats'][$num]['bdnt'] =
204
			$resultat_json['resultats'][$num]['bdnt'] =
194
			(empty ($tab['baseflor.bdnt'])) ? $tab['rangSup.bdnt'] : $tab['baseflor.bdnt'];
205
				(empty ($tab['baseflor.bdnt'])) ? $tab['rangSup.bdnt'] : $tab['baseflor.bdnt'];
-
 
206
			
195
			$resultat_json['resultats'][$num]['catminat_code'] =
207
			$resultat_json['resultats'][$num]['catminat_code'] =
196
			(empty ($tab['catminat_code'])) ? '' : $tab['catminat_code'];
208
				(empty ($tab['catminat_code'])) ? '' : $tab['catminat_code'];
-
 
209
			
197
			$resultat_json['resultats'][$num]['num_taxon'] =
210
			$resultat_json['resultats'][$num]['num_taxon'] =
198
			(empty ($tab['num_taxon'])) ? '' : $tab['num_taxon'];
211
				(empty ($tab['num_taxon'])) ? '' : $tab['num_taxon'];
Line 199... Line 212...
199
			
212
			
200
				if ($resultat_json['resultats'][$num]['num_nomen'] != 0) {
213
			if ($resultat_json['resultats'][$num]['num_nomen'] != 0) {
201
					$bdnt = strtolower($resultat_json['resultats'][$num]['bdnt']);
214
				$bdnt = strtolower($resultat_json['resultats'][$num]['bdnt']);
202
					$nn = $resultat_json['resultats'][$num]['num_nomen'];
215
				$nn = $resultat_json['resultats'][$num]['num_nomen'];
203
					$resultat_json['resultats'][$num]['href'] =
216
				$resultat_json['resultats'][$num]['href'] =
204
						$this->ajouterHref('informations',$bdnt.".nn:".$nn);
217
				$this->ajouterHref('informations',$bdnt.".nn:".$nn);
205
				}
218
				}
206
		}
219
		}
207
		return $resultat_json;
220
		return $resultat_json;
Line 208... Line 221...
208
	}
221
	}
209
	
222
	
210
	
223
	
211
	public function ajouterEnteteResultat() {
224
	public function ajouterEnteteResultat() {
212
		$entete['depart'] = $this->Requete->limite_requete['depart'];
225
		$entete['depart'] = $this->limite_requete['depart'];
213
		$entete['limite'] = $this->Requete->limite_requete['limite'];
226
		$entete['limite'] = $this->limite_requete['limite'];
214
		$entete['total']  =  $this->Requete_assemblage->getTotal_resultat();
227
		$entete['total']  =  $this->total_resultat;
215
		$entete['version']  = $this->version_projet;
228
		$entete['version']  = $this->version_projet;
216
		$url = $this->formulerUrl($this->Requete_assemblage->getTotal_resultat(), '/informations');
229
		$url = $this->formulerUrl($this->total_resultat, '/informations');
217
		if (isset($url['precedent']) && $url['precedent'] != '') {
230
		if (isset($url['precedent']) && $url['precedent'] != '') {
218
			$entete['href.precedent'] = $url['precedent'];
231
			$entete['href.precedent'] = $url['precedent'];
219
		}
232
		}
220
		if (isset($url['suivant']) && $url['suivant'] != '') {
233
		if (isset($url['suivant']) && $url['suivant'] != '') {
221
			$entete['href.suivant']   = $url['suivant'];
234
			$entete['href.suivant']   = $url['suivant'];
-
 
235
		}
-
 
236
		return $entete;
-
 
237
	}
-
 
238
	
-
 
239
	
-
 
240
	//+-------------------------------------assemblage de requête------------------------------------//
-
 
241
	
-
 
242
	
-
 
243
	public function assemblerLaRequete() {
-
 
244
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
-
 
245
		.$this->retournerRequeteJointure().' '.$this->retournerRequeteCondition().
-
 
246
		' '.$this->delimiterResultatsRequete();
-
 
247
		return $requete;
-
 
248
	}
-
 
249
	
-
 
250
	public function retournerRequeteCondition() {
-
 
251
		$condition = '';
-
 
252
		if ($this->requete_condition !== "") {
-
 
253
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
-
 
254
		}
-
 
255
		return $condition;
-
 
256
	}
-
 
257
	
-
 
258
	
-
 
259
	public function calculerTotalResultat() {
-
 
260
		$requete = 'SELECT count(*) as nombre FROM '.$this->table;
-
 
261
		$res = $this->getBdd()->recuperer($requete);
-
 
262
		if ($res) {
-
 
263
			$this->total_resultat = $res['nombre'];
-
 
264
		} else { 
-
 
265
			$this->total_resultat = 0;
-
 
266
			$e = 'Données introuvables dans la base';
-
 
267
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
-
 
268
		}
-
 
269
	}
-
 
270
	
-
 
271
	public function delimiterResultatsRequete() {
-
 
272
		$this->calculerTotalResultat();
-
 
273
		$requete_limite = '';
-
 
274
			if (($this->limite_requete['depart'] <=  $this->total_resultat) ){
-
 
275
				if (($this->limite_requete['limite'] + $this->limite_requete['depart'] )
-
 
276
				< $this->total_resultat  ){
-
 
277
					$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
-
 
278
					.$this->limite_requete['limite'];
-
 
279
				}
-
 
280
			} else {
-
 
281
				$e = "Erreur : la valeur pour le paramètre navigation.départ est supérieure".
-
 
282
					" au nombre total de résultats.";
-
 
283
				throw new Exception($e, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
222
		}
284
			}
-
 
285
		return $requete_limite;
-
 
286
	}
-
 
287
	
-
 
288
	public  function retournerRequeteJointure() {
-
 
289
		$jointure = '';
-
 
290
		if ($this->requete_jointure !== "") {
-
 
291
			$jointure = implode(' ', $this->requete_jointure);
Line 223... Line 292...
223
		return $entete;
292
		}
224
	}
293
		return $jointure;