Subversion Repositories eFlore/Applications.moissonnage

Rev

Rev 26 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 26 Rev 31
1
<?php
1
<?php
2
 
2
 
3
 
3
 
4
/**
4
/**
5
 * Classe commune a tous les services de ce projet qui va analyser et rechercher des erreurs
5
 * Classe commune a tous les services de ce projet qui va analyser et rechercher des erreurs
6
 * sur les valeurs passees en parametres lors d'un appel a ces web services.
6
 * sur les valeurs passees en parametres lors d'un appel a ces web services.
7
 *
7
 *
8
 * Les parametres suivants sont traites :
8
 * Les parametres suivants sont traites :
9
 *   - zoom : le niveau de zoom sur la carte (API cartographique client)
9
 *   - zoom : le niveau de zoom sur la carte (API cartographique client)
10
 *     On va verifier que c'est un nombre entier compris entre une valeur minimale et une valeur maximale
10
 *     On va verifier que c'est un nombre entier compris entre une valeur minimale et une valeur maximale
11
 *
11
 *
12
 *   - bbox : rectangle dont les bords delimitent en coordonnees l'espace de recherche de donnees spatiales
12
 *   - bbox : rectangle dont les bords delimitent en coordonnees l'espace de recherche de donnees spatiales
13
 *     L'ordre des valeurs est le suivant : ouest, sud, est, nord
13
 *     L'ordre des valeurs est le suivant : ouest, sud, est, nord
14
 *     On va verifier que c'est une serie de quatre nombre decimaux delimites par des virgules
14
 *     On va verifier que c'est une serie de quatre nombre decimaux delimites par des virgules
15
 *     et compris dans l'espace representant le monde a partir du systeme de projection WGS84 (EPSG:4326)
15
 *     et compris dans l'espace representant le monde a partir du systeme de projection WGS84 (EPSG:4326)
16
 *
16
 *
17
 *   - longitude et latitude : representent les coordonnees d'un point dans l'espace
17
 *   - longitude et latitude : representent les coordonnees d'un point dans l'espace
18
 *     On va verifier que ces coordonnees soient valides dans le systeme de projection utilise
18
 *     On va verifier que ces coordonnees soient valides dans le systeme de projection utilise
19
 *
19
 *
20
 *   - referentiel : referentiel taxonomique a utiliser. On peut passer aussi bien en parametres
20
 *   - referentiel : referentiel taxonomique a utiliser. On peut passer aussi bien en parametres
21
 *     son nom court que son nom complet (incluant le numero de version)
21
 *     son nom court que son nom complet (incluant le numero de version)
22
 *     On va verifier la disponibilite du referentiel pour ce service
22
 *     On va verifier la disponibilite du referentiel pour ce service
23
 *
23
 *
24
 *   - num_taxon : numero taxonomique d'une espece
24
 *   - num_taxon : numero taxonomique d'une espece
-
 
25
 *   - nn : numero nomenclatural d'une espece
25
 *     On va rechercher sa presence dans les referentiels disponibles
26
 *     On va rechercher sa presence dans les referentiels disponibles
26
 *     (les informations principales sur ce taxon seront renvoyees)
27
 *     (les informations principales sur ce taxon seront renvoyees)
27
 *
28
 *
28
 *   - dept : une liste de numeros de departements separees entre eux par des virgules
29
 *   - dept : une liste de numeros de departements separees entre eux par des virgules
29
 *     On va verifier que chaque numero est un nombre entier et represente un code de departement valide
30
 *     On va verifier que chaque numero est un nombre entier et represente un code de departement valide
30
 *
31
 *
31
 *   - auteur : l'auteur de l'observation
32
 *   - auteur : l'auteur de l'observation
32
 *
33
 *
-
 
34
 *   - type_site : pour les observations, le type de point correspondant a la station cliquee
-
 
35
 *     (STATION ou COMMUNE). Cela indique le niveau de precision ramene aux coordonnees des observations
-
 
36
 *
-
 
37
 *   - date_debut et date_fin : intervalle de dates d'observation. On verifie que ce sont des dates valides
-
 
38
 *     et que date_debut <= date_fin. Le programme peut accepter la presence d'un seul de ces deux
-
 
39
 *     parametres : soit une date de debut, soit une date de fin
-
 
40
 *
33
 * La fonction principale de verification des parametres va parcourir tous les parametres, et verifier
41
 * La fonction principale de verification des parametres va parcourir tous les parametres, et verifier
34
 * pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee
42
 * pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee
35
 * ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur
43
 * ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur
36
 * sera generee et mise a jour.
44
 * sera generee et mise a jour.
37
 * 
45
 * 
38
 * Le resultat final de la verfication peut entrainer deux cas d'utilisation possibles. Si des messages
46
 * Le resultat final de la verfication peut entrainer deux cas d'utilisation possibles. Si des messages
39
 * d'erreurs ont ete generes durant la verification, ils sont regroupes en un seul message pour lever
47
 * d'erreurs ont ete generes durant la verification, ils sont regroupes en un seul message pour lever
40
 * une exception qui sera interpretee par la classe appelante. Dans le cas ou la verification n'a rien
48
 * une exception qui sera interpretee par la classe appelante. Dans le cas ou la verification n'a rien
41
 * rencontre d'anormal, une fonction renverra la liste des parametres valides utilisables
49
 * rencontre d'anormal, une fonction renverra la liste des parametres valides utilisables
42
 * pour des recherches de donnees pour la suite du traitement pour le service.
50
 * pour des recherches de donnees pour la suite du traitement pour le service.
43
 *
51
 *
44
 * @package framework-0.3
52
 * @package framework-0.3
45
 * @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>
53
 * @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>
46
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
54
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
47
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
55
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
48
 * @version $Id$
56
 * @version $Id$
49
 * @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
57
 * @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
50
 *
58
 *
51
 */
59
 */
52
 
60
 
53
class VerificateurParametres {
61
class VerificateurParametres {
54
	
62
	
55
	private $parametres = array();
63
	private $parametres = array();
56
	private $validation = null;
64
	private $validation = null;
57
	private $erreurs = array();
65
	private $erreurs = array();
-
 
66
	private $dateTraitee = false;
58
	
67
	
59
	private $bboxMonde = null;
68
	private $bboxMonde = null;
60
	
69
	
61
	
70
	
62
	public function __construct($parametres) {
71
	public function __construct($parametres) {
63
		foreach ($parametres as $nomParametre => $valeur) {
72
		foreach ($parametres as $nomParametre => $valeur) {
64
			if ($nomParametre != 'source') {
73
			if ($nomParametre != 'source') {
65
				$this->parametres[$nomParametre] = $valeur;
74
				$this->parametres[$nomParametre] = $valeur;
66
			}
75
			}
67
		}
76
		}
68
		$this->bboxMonde = array(
77
		$this->bboxMonde = array(
69
			'ouest' => floatval(Config::get('carte.limite_ouest')),
78
			'ouest' => floatval(Config::get('carte.limite_ouest')),
70
			'est'   => floatval(Config::get('carte.limite_est')),
79
			'est'   => floatval(Config::get('carte.limite_est')),
71
			'sud'   => floatval(Config::get('carte.limite_sud')),
80
			'sud'   => floatval(Config::get('carte.limite_sud')),
72
			'nord'  => floatval(Config::get('carte.limite_nord'))
81
			'nord'  => floatval(Config::get('carte.limite_nord'))
73
		);
82
		);
74
		$this->validation = new StdClass();
83
		$this->validation = new StdClass();
75
	}
84
	}
76
	
85
	
77
	public function verifierParametres() {
86
	public function verifierParametres() {
78
		foreach ($this->parametres as $nomParametre => $valeur) {
87
		foreach ($this->parametres as $nomParametre => $valeur) {
79
			switch ($nomParametre) {
88
			switch ($nomParametre) {
80
				case 'zoom' : $this->traiterParametreZoom($valeur);
89
				case 'zoom' : $this->traiterParametreZoom($valeur);
81
					break;
90
					break;
82
				case 'bbox' : $this->traiterParametreBbox($valeur);
91
				case 'bbox' : $this->traiterParametreBbox($valeur);
83
					break;
92
					break;
84
				case 'longitude' :
93
				case 'longitude' :
85
				case 'latitude'  : $this->traiterParametresCoordonnees($this->parametres['longitude'],
94
				case 'latitude'  : $this->traiterParametresCoordonnees($this->parametres['longitude'],
86
					$this->parametres['latitude']);
95
					$this->parametres['latitude']);
87
					break;
96
					break;
88
				case 'dept' : $this->traiterParametreDepartement($valeur);
97
				case 'dept' : $this->traiterParametreDepartement($valeur);
89
					break;
98
					break;
90
				case 'auteur' : $this->traiterParametreAuteur($valeur);
99
				case 'auteur' : $this->traiterParametreAuteur($valeur);
91
					break;
100
					break;
92
				case 'referentiel' : $this->traiterParametreReferentiel($valeur);
101
				case 'referentiel' : $this->traiterParametreReferentiel($valeur);
93
					break;
102
					break;
94
				case 'num_taxon' : $this->traiterParametreTaxon($valeur);
103
				case 'num_taxon' : $this->traiterParametreTaxon($valeur);
95
					break;
104
					break;
-
 
105
				case 'nn' : $this->traiterParametreNomenclatural($valeur);
-
 
106
					break;
-
 
107
				case 'type_site' : $this->traiterParametreTypeSite($valeur);
-
 
108
					break;
-
 
109
				case 'nb_jours' : $this->traiterParametreNbJours($valeur);
-
 
110
					break;
-
 
111
				case 'date_debut' :
-
 
112
				case 'date_fin'  : {
-
 
113
					$dateDebut = isset($this->parametres['date_debut']) ? $this->parametres['date_debut'] : null;
-
 
114
					$dateFin = isset($this->parametres['date_fin']) ? $this->parametres['date_fin'] : null;
-
 
115
					if (!$this->dateTraitee) {
-
 
116
						$this->traiterParametresDate($dateDebut, $dateFin);
-
 
117
						$this->dateTraitee = true;
-
 
118
					}
-
 
119
					break;
-
 
120
				}
96
				// autres parametres ==> les ignorer
121
				// autres parametres ==> les ignorer
97
				default : break;
122
				default : break;
98
			}
123
			}
99
		}
124
		}
100
		$this->verifierPresenceParametreSpatial();
125
		$this->verifierPresenceParametreSpatial();
101
	}
126
	}
102
	
127
	
103
	private function ajouterErreur($messageErreur) {
128
	private function ajouterErreur($messageErreur) {
104
		$this->erreurs[] = $messageErreur;
129
		$this->erreurs[] = $messageErreur;
105
	}
130
	}
106
	
131
	
107
	public function renvoyerResultatVerification() {
132
	public function renvoyerResultatVerification() {
108
		return $this->validation;
133
		return $this->validation;
109
	}
134
	}
110
	
135
	
111
	public function contienterreurs() {
136
	public function contienterreurs() {
112
		return count($this->erreurs);
137
		return count($this->erreurs);
113
	}
138
	}
114
	
139
	
115
	public function leverException() {
140
	public function leverException() {
116
		$messagesErreur = "Les erreurs suivantes ont été rencontrées : \n".
141
		$messagesErreur = "Les erreurs suivantes ont été rencontrées : \n".
117
			implode("\n", $this->erreurs);
142
			implode("\n", $this->erreurs);
118
		throw new Exception($messagesErreur, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
143
		throw new Exception($messagesErreur, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
119
	}
144
	}
120
	
145
	
121
	
146
	
122
	
147
	
123
	// ------------------------------------------------------------------------- //
148
	// ------------------------------------------------------------------------- //
124
	// Fonctions de verification de parametres et detection de valeurs anormales //
149
	// Fonctions de verification de parametres et detection de valeurs anormales //
125
	// ------------------------------------------------------------------------- //
150
	// ------------------------------------------------------------------------- //
126
	
151
	
127
	private function traiterParametreZoom($zoom) {
152
	private function traiterParametreZoom($zoom) {
128
		$zoom = intval($zoom);
153
		$zoom = intval($zoom);
129
		$mondeZoom = array(
154
		$mondeZoom = array(
130
				'min' => intval(Config::get('carte.zoom_minimal')),
155
				'min' => intval(Config::get('carte.zoom_minimal')),
131
				'max' => intval(Config::get('carte.zoom_maximal'))
156
				'max' => intval(Config::get('carte.zoom_maximal'))
132
		);
157
		);
133
		if ($zoom < $mondeZoom['min'] || $zoom > $mondeZoom['max']) {
158
		if ($zoom < $mondeZoom['min'] || $zoom > $mondeZoom['max']) {
134
			$message = 'Niveau de zoom non reconnu par le service. Il doit être compris entre '.
159
			$message = 'Niveau de zoom non reconnu par le service. Il doit être compris entre '.
135
				$mondeZoom['min'].' et '.$mondeZoom['max'];
160
				$mondeZoom['min'].' et '.$mondeZoom['max'];
136
			$this->ajouterErreur($message);
161
			$this->ajouterErreur($message);
137
		} else {
162
		} else {
138
			$this->validation->zoom = $zoom;
163
			$this->validation->zoom = $zoom;
139
		}
164
		}
140
	}
165
	}
141
	
166
	
142
	private function traiterParametreBbox($bbox) {
167
	private function traiterParametreBbox($bbox) {
143
		// verifier que la chaine de caracteres $bbox est une serie de chaque nombre decimaux
168
		// verifier que la chaine de caracteres $bbox est une serie de chaque nombre decimaux
144
		// separes entre eux par une virgule
169
		// separes entre eux par une virgule
145
		if (preg_match('/^(-?\d{1,3}(.\d+)?,){3}(-?\d{1,3}(.\d+)?)$/', $bbox) == 0) {
170
		if (preg_match('/^(-?\d{1,3}(.\d+)?,){3}(-?\d{1,3}(.\d+)?)$/', $bbox) == 0) {
146
			$message = "Format de saisie des coordonnees de la bounding box non valide.  Le service ".
171
			$message = "Format de saisie des coordonnees de la bounding box non valide.  Le service ".
147
				"n'accepte seulement qu'une serie de 4 nombre décimaux séparés par des virgules.";
172
				"n'accepte seulement qu'une serie de 4 nombre décimaux séparés par des virgules.";
148
			$this->ajouterErreur($message);
173
			$this->ajouterErreur($message);
149
		} else {
174
		} else {
150
			$coordonnees = explode(',', $bbox);
175
			$coordonnees = explode(',', $bbox);
151
			// index du tableau des coordonnees : ouest/sud/est/nord
176
			// index du tableau des coordonnees : ouest/sud/est/nord
152
			$nomsIndexBbox = array("ouest", "sud", "est", "nord");
177
			$nomsIndexBbox = array("ouest", "sud", "est", "nord");
153
			$bbox = array();
178
			$bbox = array();
154
			for ($i = 0; $i < count($coordonnees); $i ++) {
179
			for ($i = 0; $i < count($coordonnees); $i ++) {
155
				$bbox[$nomsIndexBbox[$i]] = $coordonnees[$i];
180
				$bbox[$nomsIndexBbox[$i]] = $coordonnees[$i];
156
			}
181
			}
157
			// verifier que les coordonnees de chaque bord de la bbox sont valides
182
			// verifier que les coordonnees de chaque bord de la bbox sont valides
158
			if ($this->estUneBboxValide($bbox)) {
183
			if ($this->estUneBboxValide($bbox)) {
159
				$this->validation->bbox = $bbox;
184
				$this->validation->bbox = $bbox;
160
			} else {
185
			} else {
161
				$message = "Certaines coordonnées de la bounding box sont situés en dehors des limites ".
186
				$message = "Certaines coordonnées de la bounding box sont situés en dehors des limites ".
162
					"de notre monde";
187
					"de notre monde";
163
				$this->ajouterErreur($message);
188
				$this->ajouterErreur($message);
164
			}
189
			}
165
		}
190
		}
166
	}
191
	}
167
	
192
	
168
	private function estUneBboxValide($bbox) {
193
	private function estUneBboxValide($bbox) {
169
		$monde = $this->bboxMonde;
194
		$monde = $this->bboxMonde;
170
		return (floatval($bbox['ouest']) >= $monde['ouest']  && floatval($bbox['ouest']) <= $monde['est']
195
		return (floatval($bbox['ouest']) >= $monde['ouest']  && floatval($bbox['ouest']) <= $monde['est']
171
		&& floatval($bbox['est'])   >= $monde['ouest']  && floatval($bbox['est'])   <= $monde['est']
196
		&& floatval($bbox['est'])   >= $monde['ouest']  && floatval($bbox['est'])   <= $monde['est']
172
		&& floatval($bbox['nord'])  >= $monde['sud']    && floatval($bbox['nord'])  <= $monde['nord']
197
		&& floatval($bbox['nord'])  >= $monde['sud']    && floatval($bbox['nord'])  <= $monde['nord']
173
		&& floatval($bbox['sud'])   >= $monde['sud']    && floatval($bbox['sud'])   <= $monde['nord']);
198
		&& floatval($bbox['sud'])   >= $monde['sud']    && floatval($bbox['sud'])   <= $monde['nord']);
174
	}
199
	}
175
	
200
	
176
	private function traiterParametresCoordonnees($longitude, $latitude) {
201
	private function traiterParametresCoordonnees($longitude, $latitude) {
177
		if ($this->sontDesCoordonneesValides($longitude, $latitude)) {
202
		if ($this->sontDesCoordonneesValides($longitude, $latitude)) {
178
			$this->validation->latitude = $latitude;
203
			$this->validation->latitude = $latitude;
179
			$this->validation->longitude = $longitude;
204
			$this->validation->longitude = $longitude;
180
		} else {
205
		} else {
181
			$message = "Les coordonnees du point passées en parametres sont en dehors des limites de ".
206
			$message = "Les coordonnees du point passées en parametres sont en dehors des limites de ".
182
				"notre monde";
207
				"notre monde";
183
			$this->ajouterErreur($message);
208
			$this->ajouterErreur($message);
184
		}
209
		}
185
	}
210
	}
186
	
211
	
187
	private function sontDesCoordonneesValides($longitude, $latitude) {
212
	private function sontDesCoordonneesValides($longitude, $latitude) {
188
		$monde = $this->bboxMonde;
213
		$monde = $this->bboxMonde;
189
		return (floatval($longitude) >= $monde['ouest'] && floatval($longitude) <= $monde['est']
214
		return (floatval($longitude) >= $monde['ouest'] && floatval($longitude) <= $monde['est']
190
			&& floatval($latitude)  >= $monde['sud']   && floatval($latitude)  <= $monde['nord']);
215
			&& floatval($latitude)  >= $monde['sud']   && floatval($latitude)  <= $monde['nord']);
191
	}
216
	}
192
	
217
	
193
	private function traiterParametreDepartement($numeroDepartement) {
218
	private function traiterParametreDepartement($numeroDepartement) {
194
		if ($numeroDepartement != '*') {
219
		if ($numeroDepartement != '*') {
195
			$departements = explode(',', trim($numeroDepartement));
220
			$departements = explode(',', trim($numeroDepartement));
196
			foreach ($departements as $departement) {
221
			foreach ($departements as $departement) {
197
				if($this->estUnCodeDepartementValide($departement)) {
222
				if($this->estUnCodeDepartementValide($departement)) {
198
					$this->validation->departement[] = $departement;
223
					$this->validation->departement[] = $departement;
199
				} else {
224
				} else {
200
					$message = "Code de département non valide";
225
					$message = "Code de département non valide";
201
					$this->ajouterErreur($message);
226
					$this->ajouterErreur($message);
202
				}
227
				}
203
			}
228
			}
204
		}
229
		}
205
	}
230
	}
206
	
231
	
207
	private function estUnCodeDepartementValide($departement) {
232
	private function estUnCodeDepartementValide($departement) {
208
		// expression reguliere pour verifier que c'est un nombre entier a 2 ou 3 chiffres
233
		// expression reguliere pour verifier que c'est un nombre entier a 2 ou 3 chiffres
209
		$estUnDepartementValide = true;
234
		$estUnDepartementValide = true;
-
 
235
		if ($departement == '2A' || $departement == '2B') {
-
 
236
		 	$estUnDepartementValide = true;
210
		if (preg_match('/^\d{2,3}$/', $departement) != 1) {
237
		} elseif (preg_match('/^\d{2,3}$/', $departement) != 1) {
211
			$estUnDepartementValide = false;
238
			$estUnDepartementValide = false;
212
		} else {
239
		} else {
213
			if ((intval($departement) < 1 || intval($departement) > 95)
240
			if ((intval($departement) < 1 || intval($departement) > 95)
214
				&& (intval($departement) < 971 || intval($departement) > 978)) {
241
				&& (intval($departement) < 971 || intval($departement) > 978)) {
215
				$estUnDepartementValide = false;
242
				$estUnDepartementValide = false;
216
			}
243
			}
217
		}
244
		} 
218
		return $estUnDepartementValide;
245
		return $estUnDepartementValide;
219
	}
246
	}
220
	
247
	
221
	private function traiterParametreAuteur($auteur) {
248
	private function traiterParametreAuteur($auteur) {
222
		if ($auteur != '*') {
249
		if ($auteur != '*') {
223
			$this->validation->auteur = trim($auteur);
250
			$this->validation->auteur = trim($auteur);
224
		}
251
		}
225
	}
252
	}
-
 
253
	
-
 
254
	private function traiterParametreTypeSite($typeSite) {
-
 
255
		$this->validation->typeSite = strtolower(trim($typeSite));
-
 
256
	}
226
	
257
	
227
	private function traiterParametreReferentiel($referentiel)  {
258
	private function traiterParametreReferentiel($referentiel)  {
228
		if (!isset($this->validation->referentiel) && $referentiel != '*') {
259
		if (!isset($this->validation->referentiel) && $referentiel != '*') {
229
			$referentielAUtiliser = $this->affecterNomCompletReferentiel($referentiel);
260
			$referentielAUtiliser = $this->affecterNomCompletReferentiel($referentiel);
230
			if (is_null($referentielAUtiliser)) {
261
			if (is_null($referentielAUtiliser)) {
231
				$message = "Le référentiel demandé n'est pas reconnu par le service.";
262
				$message = "Le référentiel demandé n'est pas reconnu par le service.";
232
				$this->ajouterErreur($message);
263
				$this->ajouterErreur($message);
233
			} else {
264
			} else {
234
				$this->validation->referentiel = $referentielAUtiliser;
265
				$this->validation->referentiel = $referentielAUtiliser;
235
			}
266
			}
236
		}
267
		}
237
	}
268
	}
238
	
269
	
239
	private function affecterNomCompletReferentiel($referentiel) {
270
	private function affecterNomCompletReferentiel($referentiel) {
240
		$referentielAUtiliser = null;
271
		$referentielAUtiliser = null;
241
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
272
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
242
		foreach ($listeReferentiels as $nomReferentiel) {
273
		foreach ($listeReferentiels as $nomReferentiel) {
243
			$nomCourtReferentiel = current(explode('_', $nomReferentiel));
274
			$nomCourtReferentiel = current(explode('_', $nomReferentiel));
244
			if ($referentiel == $nomCourtReferentiel || $referentiel == $nomReferentiel) {
275
			if ($referentiel == $nomCourtReferentiel || $referentiel == $nomReferentiel) {
245
				$referentielAUtiliser = $nomReferentiel;
276
				$referentielAUtiliser = $nomReferentiel;
246
				break;
277
				break;
247
			}
278
			}
248
		}
279
		}
249
		return $referentielAUtiliser;
280
		return $referentielAUtiliser;
250
	}
281
	}
251
	
282
	
252
	private function traiterParametreTaxon($numeroTaxon) {
283
	private function traiterParametreTaxon($numeroTaxon) {
253
		if ($numeroTaxon != '*') {
284
		if ($numeroTaxon != '*') {
-
 
285
			$listeTaxons = explode(',', $numeroTaxon);
-
 
286
			foreach ($listeTaxons as $nt) {
254
			$taxon = null;
287
				$taxon = null;
255
			if (isset($this->validation->referentiel)) {
288
				if (isset($this->validation->referentiel)) {
256
				$taxon = $this->renvoyerTaxonDansReferentiel($numeroTaxon, $this->validation->referentiel);
289
					$taxon = $this->renvoyerTaxonDansReferentiel($nt, 'nt', $this->validation->referentiel);
257
			} else {
290
				} else {
-
 
291
					$taxon = $this->rechercherTaxonDansReferentiels($nt, 'nt');
-
 
292
				}
-
 
293
				if (is_null($taxon)) {
258
				// parcours de tous les referentiels jusqu'a retrouver le taxon dans sa liste
294
					$message = "Le numéro de taxon n'a pas permis de retrouver le taxon associé.";
-
 
295
					$this->ajouterErreur($message);
-
 
296
				} else {
259
				$taxon = $this->rechercherTaxonDansReferentiels($numeroTaxon);
297
					$this->ajouterTaxonAListe($taxon);
-
 
298
					$this->validation->referentiel = $taxon['referentiel'];
-
 
299
				}
260
			}
300
			}
-
 
301
		}
-
 
302
	}
261
			
303
	
-
 
304
	private function traiterParametreNomenclatural($numeroNomenclatural) {
-
 
305
		if ($numeroNomenclatural != '*') {
-
 
306
			$listeTaxons = explode(',', $numeroNomenclatural);
-
 
307
			foreach ($listeTaxons as $nn) {
-
 
308
				$taxon = null;
-
 
309
				if (isset($this->validation->referentiel)) {
-
 
310
					$taxon = $this->renvoyerTaxonDansReferentiel($nn, 'nn', $this->validation->referentiel);
-
 
311
				} else {
-
 
312
					$taxon = $this->rechercherTaxonDansReferentiels($nn, 'nn');
-
 
313
				}
262
			if (is_null($taxon)) {
314
				if (is_null($taxon)) {
263
				$message = "Le numéro de taxon n'a pas permis de retrouver le taxon associé.";
315
					$message = "Le numéro nomenclatural n'a pas permis de retrouver le taxon associé.";
264
				$this->ajouterErreur($message);
316
					$this->ajouterErreur($message);
265
			} else {
317
				} else {
266
				$this->validation->taxon = $taxon;
318
					$this->ajouterTaxonAListe($taxon);
267
				$this->validation->referentiel = $taxon['referentiel'];
319
					$this->validation->referentiel = $taxon['referentiel'];
-
 
320
				}
268
			}
321
			}
269
		}
322
		}
270
	}
323
	}
271
	
324
	
272
	private function rechercherTaxonDansReferentiels($numeroTaxon) {
325
	private function rechercherTaxonDansReferentiels($numeroTaxon, $typeNumero) {
273
		$taxon = null;
326
		$taxon = null;
274
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
327
		$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles();
275
		foreach ($listeReferentiels as $nomReferentiel) {
328
		foreach ($listeReferentiels as $nomReferentiel) {
276
			$taxon = $this->renvoyerTaxonDansReferentiel($numeroTaxon, $nomReferentiel);
329
			$taxon = $this->renvoyerTaxonDansReferentiel($numeroTaxon, $typeNumero, $nomReferentiel);
277
			if (!is_null($taxon)) {
330
			if (!is_null($taxon)) {
278
				break;
331
				break;
279
			}
332
			}
280
		}
333
		}
281
		return $taxon;
334
		return $taxon;
282
	}
335
	}
283
	
336
	
284
	private function renvoyerTaxonDansReferentiel($numeroTaxon, $nomReferentiel) {
337
	private function renvoyerTaxonDansReferentiel($numeroTaxon, $typeNumero, $nomReferentiel) {
285
		$referentiel = new Referentiel($nomReferentiel);
338
		$referentiel = new Referentiel($nomReferentiel);
286
		$referentiel->chargerTaxon($numeroTaxon);
339
		$referentiel->chargerTaxon($typeNumero, $numeroTaxon);
287
		$taxon = $referentiel->renvoyerTaxon();
340
		$taxon = $referentiel->renvoyerTaxon();
288
		return $taxon;
341
		return $taxon;
289
	}
342
	}
-
 
343
	
-
 
344
	private function ajouterTaxonAListe($taxon) {
-
 
345
		if (!isset($this->validation->taxon)) {
-
 
346
			$this->validation->taxon = array($taxon);
-
 
347
		} elseif (!in_array($taxon, $this->validation->taxon)) {
-
 
348
			$this->validation->taxon[] = $taxon;
-
 
349
		}
-
 
350
	}
-
 
351
	
-
 
352
	private function traiterParametresDate($dateDebut, $dateFin) {
-
 
353
		$statutValidite = $this->verifierValiditeDate($dateDebut, 'début')
-
 
354
			+ $this->verifierValiditeDate($dateFin, 'fin');
-
 
355
		if ($statutValidite == 2) {
-
 
356
			if (!is_null($dateDebut) && !is_null($dateFin) && $dateDebut > $dateFin) {
-
 
357
				$message = "Intervalle de dates incorrect : date de fin avant la date de début";
-
 
358
				$this->ajouterErreur($message);
-
 
359
			} else {
-
 
360
				$this->validation->dateDebut = $dateDebut;
-
 
361
				$this->validation->dateFin   = $dateFin;
-
 
362
			}
-
 
363
		}
-
 
364
	}
-
 
365
	
-
 
366
	private function verifierValiditeDate(& $date, $position) {
-
 
367
		$statutValidite = is_null($date) ? 1 : 0;
-
 
368
		$moisParDefaut = $position == 'début' ? 1 : 12;
-
 
369
		$jourParDefaut = $position == 'début' ? 1 : 31;
-
 
370
		if (!is_null($date)) {
-
 
371
			$split = explode("-", $date);
-
 
372
			$annee = intval($split[0]);
-
 
373
			$mois  = isset($split[1]) ? intval($split[1]) : $moisParDefaut;
-
 
374
			$jour  = isset($split[2]) ? intval($split[2]) : $jourParDefaut;
-
 
375
			if (!$this->estDateValide($jour, $mois, $annee)) {
-
 
376
				$message = "Date de {$position} saisie non valide";
-
 
377
				$this->ajouterErreur($message);
-
 
378
			} else {
-
 
379
				$date = $annee."-".(($mois<10)?"0".$mois:$mois)."-".(($jour<10)?"0".$jour:$jour);
-
 
380
				$dateDuJour = date('Y-m-d');
-
 
381
				if ($date > $dateDuJour) {
-
 
382
					$message = "La date de {$position} saisie postérieure à la date du jour : {$dateDuJour}";
-
 
383
					$this->ajouterErreur($message);
-
 
384
				} else {
-
 
385
					$statutValidite = 1;
-
 
386
				}
-
 
387
			}
-
 
388
		}
-
 
389
		return $statutValidite;
-
 
390
	}
-
 
391
	
-
 
392
	private function estDateValide($jour, $mois, $annee) {
-
 
393
		$estBissextile = (($annee % 4 == 0 && $annee % 100 != 0) || ($annee % 400 == 0));
-
 
394
		$dureeFevrier = $estBissextile ? 29 : 28;
-
 
395
		$dureeMois = array(1 => 31, 2 => $dureeFevrier, 3 => 31, 4 => 30, 5 => 31, 6 => 30, 7 => 31,
-
 
396
			8 => 31, 9 => 30, 10 => 31, 11 => 30, 12 => 31);
-
 
397
		return ($annee >= 1900 && $mois >= 1 && $mois <= 12 && $jour >= 1 && $jour <= $dureeMois[$mois]); 
-
 
398
	}
290
	
399
	
291
	private function verifierPresenceParametreSpatial() {
400
	private function verifierPresenceParametreSpatial() {
292
		$presenceParametreSpatial = false;
401
		$presenceParametreSpatial = false;
293
		if (isset($this->parametres['bbox'])
402
		if (isset($this->parametres['bbox'])
294
			|| (isset($this->parametres['longitude']) && isset($this->parametres['latitude']))) {
403
			|| (isset($this->parametres['longitude']) && isset($this->parametres['latitude']))) {
295
			$presenceParametreSpatial = true;
404
			$presenceParametreSpatial = true;
296
		}
405
		}
297
		if ($presenceParametreSpatial == false) {
406
		if ($presenceParametreSpatial == false) {
298
			$message = "Aucune coordonnée n'a été saisie";
407
			$message = "Aucune coordonnée n'a été saisie";
299
			$this->ajouterErreur($message);
408
			$this->ajouterErreur($message);
300
		}
409
		}
-
 
410
	}
-
 
411
	
-
 
412
	private function traiterParametreNbJours($nbJours) {
-
 
413
		// verifier que c'est un nombre entier positif (avec expression reguliere)
-
 
414
		if (preg_match('/^\d+$/', $nbJours) != 1) {
-
 
415
			$message = "La valeur passée pour le nombre de jours doit être un entier positif.";
-
 
416
			$this->ajouterErreur($message);
-
 
417
		} elseif ($nbJours > 0) {
-
 
418
			$this->validation->nbJours = intval($nbJours);
-
 
419
		}
301
	}
420
	}
302
	
421
	
303
}
422
}
304
 
423
 
305
?>
424
?>