Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 880 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
584 mathilde 1
<?php
2
/**
3
 *
4
 *  syntaxons/relations -> retourne toutes les relations d'un syntaxon en fonction du numéro catminat
5
 *
6
 *  /syntaxons/catminat:#code_catminat/relations/niveaux_sup --> retourne les niveaux supérieurs d'un syntaxon
7
 *  /syntaxons/catminat:#code_catminat/relations/synonymie --> retourne tous les synonymes pour un code catminat
8
 *
9
 * @package eflore-projets
10
* @author mathilde Salthun-Lassalle
11
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
12
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
13
* @version 1.0
14
* @copyright 1999-2012 Tela Botanica (accueil@tela-botanica.org)
15
 *
16
 */
17
 
18
class SyntaxonsRelation  extends SyntaxonsCommun{
19
 
20
	public function consulter($ressources, $parametres) {
21
		$this->ressources = $ressources;
22
		$this->parametres = $parametres;
23
		$this->traiterRessources();
24
		$this->traiterParametres();
25
		$this->definirTables();
26
		$resultats = null;
27
		$requete = '';
28
		foreach ($this->table_version as $version) {
29
			$this->table = $version;
30
			$requete = $this->assemblerLaRequete();
31
			$resultat =  $this->Bdd->recupererTous($requete);
648 aurelien 32
			$versionResultat = $this->traiterResultat($resultat, $this->version_projet);
584 mathilde 33
			if (count($this->table_version) > 1) {
34
				$resultats[$version] = $versionResultat;
35
			} else {
36
				$resultats = $versionResultat;
37
			}
38
		}
39
		return $resultats;
40
	}
41
 
42
 
43
	function __construct(Conteneur $conteneur) {
44
		 parent::__construct($conteneur);
45
		 $this->champs_recherches = 'cle, code_catminat, syntaxon,  code_fixe_nom, code_natura_2000, niveau ';
46
	}
47
 
48
 
49
 
50
	//surchargée car  le web-service est appelé par SyntaxonsRelationsToutes.
51
	//ne doit pas renvoyer une erreur mais un résultat vide.
648 aurelien 52
	public function traiterResultat($resultat, $version) {
584 mathilde 53
		$versionResultat = null;
54
		if ($resultat == '') {
55
			$message = 'La requête SQL formée comporte une erreur!';
56
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
57
			throw new Exception($message, $code);
58
		} elseif ($resultat) {
59
			$versionResultat = $this->retournerResultatFormate($resultat);
60
		} else {
61
			$versionResultat = 'Les données recherchées sont introuvables';
62
		}
63
		return $versionResultat;
64
	}
65
 
66
 
67
//+-------------------------------------traitement des ressources et des paramètres----------------------------------------+//
68
 
69
 
70
	public function traiterRessources() {
71
		$catminat='';
72
		if(preg_match("/catminat:(([0-9]{2}\-$)|([0-9]{2}\-[0-9]\.$)|([0-9]{2}\-(?:[0-9]\.){1,5}[0-9]$)|([0-9]{2}\-(?:[0-9]\.){4,5}[0-9]\-[0-9]+(?:bis|ter|quater){0,1}$))/",$this->ressources[0], $retour)) {
73
			$this->catminat = str_replace('-', '/',$retour[1]);
74
			$this->traiterRessourcesRelations();
75
		}elseif ($this->ressources[0]) {
76
			$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
77
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
78
		}
79
		return $catminat;
80
	}
81
 
82
	public function traiterRessourcesRelations(){
83
		if($this->ressources[1] == 'relations') {
84
				switch($this->ressources[2]) {
85
					case 'niveaux-sup':
86
						$catminat_sup = $this->chercherCatminatSuperieurs();
87
						if (!empty($catminat_sup)) {
88
							if (count($catminat_sup)>1) {
89
								$this->requete_condition[] = ' code_catminat in ('.implode(',',$catminat_sup).')';
90
							} else {
91
								$this->requete_condition[] = ' code_catminat = '.$catminat_sup[0].' ';
92
							}
93
						} else  {
94
								$e = 'Erreur dans l\'url de votre requête : le code catminat est trop court.';
95
								throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
96
						}
97
						break;
98
					case 'synonymie' :
99
						$this->requete_condition[] = " niveau LIKE 'syn%' and code_catminat = '".$this->catminat."' " ;
100
						break;
101
					default :
102
						$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
103
					throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
104
				}
105
		} else {
106
			$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
107
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
108
		}
109
	}
110
 
111
	//ne renvoie que les supérieurs ( sans la valeur initiale )
112
	public function chercherCatminatSuperieurs() {
113
		$catminat_sup = array();
114
		$catminat_slash  = explode('/',$this->catminat);
115
		$catminat_slash = $this->enleverValeursVides($catminat_slash);
116
 
117
		$taille_slash = count($catminat_slash);
118
		if ($taille_slash > 1) {
119
			$catminat_sup[0] = "'".array_shift($catminat_slash)."/'";
120
			$niveaux = array_shift($catminat_slash);
121
			$unites = explode('.',trim($niveaux)); //attention explode peut renvoyer des cases vides (voir la doc php)
122
			$unites = $this->enleverValeursVides($unites);
123
			$taille = ($taille_slash == 3) ? count($unites) : count($unites)-1 ;
124
			for ($i=0; $i< $taille ; $i++) {
125
				$sup = "'".trim($catminat_sup[$i],"'");
126
				if ($i == 0) {
127
					$sup .= $unites[$i].".'";
128
				} elseif ($i == 1) {
129
					$sup .= $unites[$i]."'";
130
				} else {
131
					$sup .= ".".$unites[$i]."'";
132
				}
133
				$catminat_sup[] = $sup;
134
			}
135
		}
136
		return $catminat_sup;
137
	}
138
 
139
 
140
	public function traiterParametres() {
141
		if (isset($this->parametres) && !empty($this->parametres) ) {
142
			foreach ($this->parametres as $param => $valeur) {
143
				switch ($param) {
144
					case 'navigation.depart'  :
145
						$this->definirNavigationDepart($valeur);
146
						break;
147
					case 'navigation.limite'  :
148
						$this->definirNavigationLimite($valeur);
149
						break;
150
					case 'version.projet' :
151
						$this->traiterVersion($valeur);
152
						break;
153
					case 'masque.catminat' :
154
						$this->traiterCatminat($valeur);
155
						break;
156
					case 'masque.niveau' :
157
						$this->traiterNiveau($valeur);
158
						break;
159
					case 'masque.fixe':
160
						$this->requete_condition[] = ' code_fixe_nom = \''.$valeur.'\' ';
161
						break;
162
					case 'retour.champs' :
163
						$this->champs_recherches .= ','.$valeur.' ';
164
						break;
165
					case 'masque.retenu' :
166
						$this->traiterRetenu($valeur);
167
						break;
168
					default :
169
						$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " '
170
					.$param.' " n\'existe pas.';
171
					$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);	break;
172
				}
173
			}
174
 
175
		}
176
 
177
	}
178
 
179
	public function traiterRetenu($valeur) {
180
		if ($this->ressources[2] == 'niveaux-sup') {
181
			$valeur = trim($valeur);
182
			if( $valeur == 'true') {
183
				$this->requete_condition[] = ' niveau NOT LIKE \'syn%\' ';
184
			} elseif ( $valeur == 'false') {
185
				$this->requete_condition[] = ' niveau LIKE \'syn%\' ';
186
			}
187
		} else {
188
			$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " masque.retenu " n\'existe pas.';
189
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
190
		}
191
 
192
	}
193
 
194
	public function traiterCatminat($valeur) {
195
		if ($this->ressources[2] == 'niveaux-sup') {
196
			$valeur = trim($valeur);
197
			$valeur = str_replace('-', '/', $valeur);
198
			$this->requete_condition[] = ' code_catminat = '.$this->getBdd()->proteger($valeur).'';
199
		} else {
200
			$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " masque.catminat " n\'existe pas.';
201
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);	break;
202
		}
203
	}
204
 
205
	public function traiterNiveau($valeur) {
206
		if ($this->ressources[2] == 'niveaux-sup') {
207
			$valeur = strtoupper(trim($valeur));
208
			if (in_array($valeur,$this->niv)) {
209
				$this->requete_condition[] = ' niveau = '.$this->getBdd()->proteger($valeur).'';
210
			} else {
211
				$e = "Erreur : valeur inconnue pour masque.niveau."
212
				." valeurs possibles : ALL|ORD|CLA|SUBCLA|SUBORD|SUBALL|ASS|SUBASS|BC|DC|GRPT";
213
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
214
			}
215
		} else {
216
			$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " masque.niveau " n\'existe pas.';
217
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
218
		}
219
	}
220
 
221
 
222
	//+--------------------------formatages de resultats  -------------------------------------------+//
223
 
224
 
225
	public function retournerResultatFormate($resultat) {
226
		$resultat_json = array();
227
	$resultat_json['entete'] = $this->ajouterEnteteResultat();
228
		foreach ($resultat as $cle => $res) {
229
			$resultat[$cle]['href'] = $this->ajouterHref('syntaxons','cle:'.$res['cle']);
230
			$resultat[$cle] = array_merge($resultat[$cle],$this->traiterOntologieNiveau($res['niveau']));
231
			unset($resultat[$cle]['niveau']);
232
		}
233
		$resultat_json['resultat'] = $resultat;
234
		return $resultat_json;
235
	}
236
 
237
	public function ajouterEnteteResultat() {
238
		$entete['depart'] = $this->limite_requete['depart'];
239
		$entete['limite'] = $this->limite_requete['limite'];
240
		$entete['total']  =  $this->total_resultat;
241
		$entete['version']  = $this->version_projet;
242
		$ressources = (empty($this->ressources)) ? '/syntaxons' : '/syntaxons/' ;
243
		$url = $this->formulerUrl($this->total_resultat, $ressources.implode('/',$this->ressources));
244
		if (isset($url['precedent']) && $url['precedent'] != '') {
245
			$entete['href.precedent'] = $url['precedent'];
246
		}
247
		if (isset($url['suivant']) && $url['suivant'] != '') {
248
			$entete['href.suivant']   = $url['suivant'];
249
		}
250
		return $entete;
251
	}
252
 
253
 
254
}
255
 
256
?>