Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev Author Line No. Line
396 mathilde 1
<?php
2
/**
402 mathilde 3
* Classe Graphiques.php permet d'afficher des graphiques en svg remplis avec des données écologiques
396 mathilde 4
*  fin d'url possibles :
402 mathilde 5
*  graphiques/#typegraphique/#bdnt.nn:#num_nomen --> renvoie une graphique avec les données connues
396 mathilde 6
*
7
* Encodage en entrée : utf8
8
* Encodage en sortie : utf8
9
* @package eflore-projets
10
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
* @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org>
12
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
* @version 1.0
15
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
16
*/
17
 
18
class Graphiques {
402 mathilde 19
 
396 mathilde 20
	private $parametres = array();
21
	private $ressources = array();
402 mathilde 22
	private $metadonnees;
23
	private $version;
24
	private $Bdd;
25
	private $nomGraphique = array();
26
	private $table = "";
27
	private $requete_condition = "";
28
	private $requete_champs;
29
	private $config;
30
	private $convertisseur;
31
	private $cheminGraphBase;
32
	private $serviceNom = 'Graphiques';
33
	private $valeurs_en_pourcentage ;
34
	private $dom;
35
	private $largeurSVG;
36
	private $graduations_id = array ("zero" => 0 ,"un"=> 0.1, "deux" => 0.2 , "trois" => 0.3, "quatre" => 0.4,
37
									"cinq" => 0.5, "six" => 0.6 ,"sept" => 0.7, "huit" => 0.8, "neuf" => 0.9,
38
									"dix" => 1 );
396 mathilde 39
 
40
	public function consulter($ressources, $parametres) {
402 mathilde 41
		$this->ressources = $ressources;
396 mathilde 42
		$this->parametres = $parametres;
402 mathilde 43
		$this->initialiserConfiguration();
44
		$resultats = '';
45
 
46
		$this->table = Config::get('bdd_table')."_v".$this->version;
396 mathilde 47
		$this->traiterRessources();
402 mathilde 48
		$requete = $this->assemblerLaRequete();
49
		$resultat = $this->Bdd->recupererTous($requete);
50
		$versionResultat = $this->obtenirResultat($resultat);
51
		return $versionResultat;
52
	}
396 mathilde 53
 
402 mathilde 54
//+--------------------------initialisation de paramètres  -------------------------------------------+
55
 
56
	public function initialiserConfiguration() {
57
		$conteneur = new Conteneur();
58
		$this->Bdd = $conteneur->getBdd();
59
		$this->config = $conteneur->getParametre('Graphiques');
60
		$this->convertisseur = $this->config['convertisseur'];
61
		$this->cheminGraphBase = $this->config['chemin'];
62
		$this->chargerVersions();
63
		$this->definirVersion();
64
		$this->definirTailleSVG();
396 mathilde 65
	}
66
 
402 mathilde 67
	//on n'affiche qu'une version de graphique à la fois ( la dernière ou celle demandée )
68
	private function definirVersion() {
69
		if( (!isset($this->parametres['version.projet']) ) || ((isset($this->parametres['version.projet']) )&&
70
		(($this->parametres['version.projet'] == '+') || ($this->parametres['version.projet'] == '')))){
71
			$this->version = $this->metadonnees[0]['version'];
72
		} else {
73
			$this->version = $this->parametres['version.projet'];
74
		}
75
	}
76
 
77
	private function definirTailleSVG() {
78
		if (!isset($this->parametres['retour.format']) ){
79
			$this->largeurSVG="500";
80
		} else {
81
			$this->largeurSVG= $this->parametres['retour.format'];
82
		}
83
	}
84
 
85
	private function chargerVersions() {
86
		$requete = "SELECT version ".
87
				"FROM ".Config::get('bdd_table_meta')." ".
88
				"ORDER BY date_creation DESC ";
89
		$resultats = $this->Bdd->recupererTous($requete);
90
		if (!is_array($resultats) || count($resultats) <= 0) {
91
			$message = "Les méta-données n'ont pu être chargée pour la ressource demandée";
92
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
93
			throw new Exception($message, $code);
94
		}
95
 
96
		$this->metadonnees = $resultats;
97
	}
98
 
99
	//+--------------------------traitement ressources ou paramètres  -------------------------------------------+
100
 
396 mathilde 101
	public function traiterRessources() {
402 mathilde 102
		$this->traiterRessources_NomService();
103
		$this->traiterRessources_TypeGraphique();
104
	}
105
 
106
	public function traiterRessources_TypeGraphique(){
107
		if (isset($this->ressources) && !empty($this->ressources[1])) {
108
			if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[1], $retour)==1){
109
				switch ($retour[1]) {
110
					case 'bdtfx' :
111
						$this->requete_condition[]= "num_nomen = ".$retour[2]." AND BDNT = 'BDTFX' ";
112
						break;
113
					case  'bdafx' :
114
						$this->requete_condition[] = "num_nomen = ".$retour[2]." AND BDNT = 'BDAFX' ";
115
						break;
116
					case  'bdbfx' :
117
						$this->requete_condition[] = "num_nomen = ".$retour[2]." AND BDNT = 'BDBFX' ";
118
						break;
119
					default :
120
						$e = 'Erreur dans l\'url de votre requête : </br> La ressource " '
121
					.$retour[1].' " n\'existe pas.';
122
					throw new Exception( $e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
123
					break;
124
				}
125
 
126
			}else {
127
				$e = 'Erreur dans l\'url de votre requête : </br> La ressource  n\'existe pas.';
128
				throw new Exception( $e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
129
			}
130
		} else {
131
			throw new Exception( "Erreur dans l\'url de votre requête :".
132
					"preciser le référentiel et le numéro nomenclatural sous la forme {bdnt}.nn:{nn}.",
133
			RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
396 mathilde 134
		}
135
 
136
	}
137
 
402 mathilde 138
	public function traiterRessources_NomService(){
139
		if (isset($this->ressources) && !empty($this->ressources[0])) {
140
			switch ($this->ressources[0]) {
141
				case  'climat' :
142
					$this->requete_champs = ' ve_lumiere , ve_temperature, ve_continentalite, ve_humidite_atmos' ;
143
					$this->nomGraphique= 'climat';
144
					break;
145
				case 'sol' :
146
					$this->requete_champs = ' ve_humidite_edaph , ve_reaction_sol, ve_nutriments_sol, ve_salinite,'
147
					.'ve_texture_sol, ve_mat_org_sol' ;
148
					$this->nomGraphique = 'sol';
149
					break;
150
				default :
151
					$e = 'Erreur dans l\'url de votre requête : </br> La ressource " '
152
				.$retour[1].' " n\'existe pas.';
153
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
154
				break;
155
			}
156
		}else {
157
			throw new Exception("Erreur dans l\'url de votre requête :".
158
			"</br> precisez le graphique -> \"sol\" ou \"climat\".", RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
159
		}
160
	}
161
 
162
 
163
 
164
 
165
	//+-------------------------- formatage du résultat  -------------------------------------------+
166
 
167
 
168
	public function obtenirResultat($resultat) {
169
		if ($resultat == ""){
170
			$message = 'La requête SQL formée comporte une erreur!';
171
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
172
			throw new Exception($message, $code);
173
		}elseif ($resultat) {
174
			if ((count($this->ressources)) != 0) {
175
				$this->traiterValeursEcologiques($resultat[0]);
176
				$i = 0;
177
				$svg = $this->genererSVG();
178
				$resultat = new ResultatService();
179
				$resultat->corps = $svg;
180
				$resultat->mime = 'image/svg+xml';
181
			}
396 mathilde 182
		} else {
402 mathilde 183
			$message = 'Les données recherchées sont introuvables.';
396 mathilde 184
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
185
			throw new Exception($message, $code);
186
		}
187
		return $resultat;
188
	}
189
 
402 mathilde 190
 
191
	public function traiterValeursEcologiques($valeurs){
192
		//humidite edaphique sur echelle de 12
193
		foreach($valeurs as $cle => $val){
194
			if ($cle == 've_humidite_edaph'){
195
				$this->valeurs_en_pourcentage[$cle] = round($val/12,1);
196
			}else{
197
				//salinite commence à 0
198
				if($val == 0){
199
					$this->valeurs_en_pourcentage[$cle] = 0;
200
				}else{
201
					$this->valeurs_en_pourcentage[$cle] = round($val/9,1);
202
				}
203
			}
204
		}
205
	}
206
 
207
	public function genererSVG(){
208
		$this->dom = new DOMDocument('1.0', 'UTF-8');
209
		//verifie que le xml est bien formé
210
		$this->dom->validateOnParse = true;
211
		$fichierSvg = $this->cheminGraphBase."".$this->nomGraphique.".svg";
212
		$res=$this->dom->load($fichierSvg);
213
		$this->changerValeursSVG();
214
		$svg = $this->dom->saveXML();
215
		return $svg;
216
	}
217
 
218
 
219
 
220
	public function changerValeursSVG(){
221
		foreach ($this->valeurs_en_pourcentage as $cle => $val){
222
			$grad_id = array_search($val,$this->graduations_id);
223
			$Dompath = new DOMXPath($this->dom);
224
 			$element = $Dompath->query("//*[@id='".$grad_id."']")->item(0);
225
			$pos_x = $element->getAttribute('x1');
226
 			$curseur = $Dompath->query("//*[@id='".$cle."']")->item(0);
227
 			$curseur->setAttribute('cx', $pos_x);
228
 			$svg = $this->dom->getElementsByTagName("svg")->item(0);
229
 			$svg->setAttribute('width',$this->largeurSVG);
230
		}
231
	}
232
 
233
	//+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
234
 
235
	public function assemblerLaRequete() {
236
		$requete = 	' SELECT '.$this->requete_champs.'  FROM '.$this->table.' '.$this->retournerRequeteCondition();
237
		return $requete;
238
	}
239
 
240
	public  function retournerRequeteCondition() {
241
		$condition = '';
242
		if ($this->requete_condition !== "") {
243
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
244
		}
245
		return $condition;
246
	}
247
 
248
 
249
 
396 mathilde 250
}
251
?>