Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev 396 Rev 402
Line 1... Line 1...
1
<?php
1
<?php
2
/**
2
/**
3
* Classe Graphiques.php permet de 
3
* Classe Graphiques.php permet d'afficher des graphiques en svg remplis avec des données écologiques
4
*  fin d'url possibles :
4
*  fin d'url possibles :
5
*  graphiques/#bdnt.nn:#num_nomen --> renvoie une graphique avec les données connues 
5
*  graphiques/#typegraphique/#bdnt.nn:#num_nomen --> renvoie une graphique avec les données connues 
6
*  
6
*  
7
* Encodage en entrée : utf8
7
* Encodage en entrée : utf8
8
* Encodage en sortie : utf8
8
* Encodage en sortie : utf8
9
* @package eflore-projets
9
* @package eflore-projets
10
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
Line 14... Line 14...
14
* @version 1.0
14
* @version 1.0
15
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
15
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
16
*/
16
*/
Line 17... Line 17...
17
 
17
 
18
class Graphiques {
18
class Graphiques {
19
	
19
 
20
	private $parametres = array();
20
	private $parametres = array();
-
 
21
	private $ressources = array();
-
 
22
	private $metadonnees;
-
 
23
	private $version;
-
 
24
	private $Bdd;
-
 
25
	private $nomGraphique = array();
-
 
26
	private $table = "";
-
 
27
	private $requete_condition = "";
-
 
28
	private $requete_champs;
21
	private $ressources = array();
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,
Line 22... Line 38...
22
	private $sousService;
38
									"dix" => 1 );
23
	
-
 
24
	public function consulter($ressources, $parametres) {
39
	
-
 
40
	public function consulter($ressources, $parametres) {
-
 
41
		$this->ressources = $ressources;
-
 
42
		$this->parametres = $parametres;
25
		$this->parametres = $parametres;
43
		$this->initialiserConfiguration();
-
 
44
		$resultats = '';
26
		$this->ressources = $ressources;
45
 
-
 
46
		$this->table = Config::get('bdd_table')."_v".$this->version;
27
	
47
		$this->traiterRessources();
-
 
48
		$requete = $this->assemblerLaRequete();
-
 
49
		$resultat = $this->Bdd->recupererTous($requete);
-
 
50
		$versionResultat = $this->obtenirResultat($resultat);
Line -... Line 51...
-
 
51
		return $versionResultat;
-
 
52
	}
-
 
53
	
-
 
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();
-
 
65
	}
-
 
66
	
-
 
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;
28
		$this->traiterRessources();
93
			throw new Exception($message, $code);
29
		$resultat = $this->executerSousService();
94
		}
Line -... Line 95...
-
 
95
	
-
 
96
		$this->metadonnees = $resultats;
30
	
97
	}
-
 
98
	
-
 
99
	//+--------------------------traitement ressources ou paramètres  -------------------------------------------+	
-
 
100
	
-
 
101
	public function traiterRessources() {
-
 
102
		$this->traiterRessources_NomService();
31
		return $resultat;
103
		$this->traiterRessources_TypeGraphique();
32
	}
104
	}
33
	
105
	
-
 
106
	public function traiterRessources_TypeGraphique(){
-
 
107
		if (isset($this->ressources) && !empty($this->ressources[1])) {
34
	public function traiterRessources() {
108
			if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[1], $retour)==1){
-
 
109
				switch ($retour[1]) {
35
		if (isset($this->ressources) && !empty($this->ressources[0])) {
110
					case 'bdtfx' :
-
 
111
						$this->requete_condition[]= "num_nomen = ".$retour[2]." AND BDNT = 'BDTFX' ";
-
 
112
						break;
36
			if ($this->ressources[0] == 'climat' ){
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' ";
37
				$this->sousService = 'Climat';
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;
38
			  }
124
				}
39
			 elseif ($this->ressources[0] == 'sol' ){
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
			}
40
			 	$message = "non encore implémenté : graphique des données climatiques";
130
		} else {
Line 41... Line 131...
41
			 	$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
131
			throw new Exception( "Erreur dans l\'url de votre requête :".
Line 42... Line 132...
42
			 	throw new Exception($message, $code);
132
					"preciser le référentiel et le numéro nomenclatural sous la forme {bdnt}.nn:{nn}.",
-
 
133
			RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
43
			 }
134
		}
-
 
135
		
-
 
136
	}
-
 
137
	
-
 
138
	public function traiterRessources_NomService(){
-
 
139
		if (isset($this->ressources) && !empty($this->ressources[0])) {
-
 
140
			switch ($this->ressources[0]) {
-
 
141
				case  'climat' :
44
		}
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
	
45
		
164
 
-
 
165
	//+-------------------------- formatage du résultat  -------------------------------------------+
46
	}
166
 
-
 
167
	
47
	
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]);
48
	private function executerSousService() {
176
				$i = 0;
49
		if (isset($this->sousService)) {
177
				$svg = $this->genererSVG();
50
			$classe = $this->sousService.'Graph';
178
				$resultat = new ResultatService();
51
			require_once dirname(__FILE__).DS.'graphiques'.DS.$classe.'.php';
179
				$resultat->corps = $svg;
52
			$sousService = new $classe(new Conteneur());
180
				$resultat->mime = 'image/svg+xml';
53
			$resultat = $sousService->consulter($this->ressources, $this->parametres);
181
			}
54
		} else {
182
		} else {
Line -... Line 183...
-
 
183
			$message = 'Les données recherchées sont introuvables.';
-
 
184
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
-
 
185
			throw new Exception($message, $code);
-
 
186
		}
-
 
187
		return $resultat;
-
 
188
	}
-
 
189
	
-
 
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 !== "") {
55
			$message = "L'analyse des ressources n'a pu aboutir à déterminer le sous service à executer.";
243
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
56
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
244
		}
57
			throw new Exception($message, $code);
245
		return $condition;