Subversion Repositories eFlore/Applications.del

Rev

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

Rev Author Line No. Line
720 gduche 1
<?php
2
// declare(encoding='UTF-8');
3
/**
737 gduche 4
	* Le web service observations récupère toutes les observations et, pour chacune d'elle, les
5
	* images qui lui sont associées.
720 gduche 6
 *
7
 * @category	php 5.2
8
 * @package	del
9
 * @subpackage images
10
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
12
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
13
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
14
 * @version	$Id: Bdd.php 403 2012-02-22 14:35:20Z gduche $
737 gduche 15
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Observations
720 gduche 16
 */
17
 
18
class Observations {
19
 
20
	private $conteneur;
726 gduche 21
	private $navigation;
22
	private $masque;
737 gduche 23
	private $gestionBdd;
24
	private $bdd;
720 gduche 25
 
26
	public function __construct(Conteneur $conteneur = null) {
27
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
737 gduche 28
		$this->conteneur->chargerConfiguration('config_departements.ini');
726 gduche 29
		$this->navigation = $conteneur->getNavigation();
30
		$this->masque = $conteneur->getMasque();
737 gduche 31
		$this->gestionBdd = $conteneur->getGestionBdd();
32
		$this->bdd = $this->gestionBdd->getBdd();
720 gduche 33
	}
34
 
35
	/**
36
	 * Méthode principale de la classe.
37
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService
38
	 * pour l'afficher.
39
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
40
	 * @param array $parametres les paramètres situés après le ? dans l'url
41
	 * */
42
	public function consulter($ressources, $parametres) {
43
 
44
		// Gestion des configuration du script
45
		$this->configurer();
46
		$this->verifierConfiguration();
47
 
48
		// Lancement du service
49
		$liaisons = $this->chargerLiaisons();
737 gduche 50
		$total = $this->compterObservations();
726 gduche 51
		$this->navigation->setTotal($total);
737 gduche 52
		$images = $this->chargerObservations($liaisons);
53
		$images = $this->chargerImages($images);
720 gduche 54
 
55
		// Mettre en forme le résultat et l'envoyer pour affichage
56
		$resultat = new ResultatService();
57
		$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
58
		return $resultat;
59
	}
60
 
61
	/*-------------------------------------------------------------------------------
62
	 							CONFIGURATION DU SERVICE
63
	 --------------------------------------------------------------------------------*/
64
	/**
65
	 * Configuration du service en fonction du fichier de config config_del.ini
66
	 * */
67
	public function configurer() {
68
		$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
69
		$this->mappingObservation = $this->conteneur->getParametre('mapping_observation');
70
	}
71
 
72
	/**
73
	 * Vérifier que le service est bien configuré
74
	 * */
75
	public function verifierConfiguration() {
737 gduche 76
 
720 gduche 77
		$erreurs = array();
737 gduche 78
		$tableauImages = $this->conteneur->getParametre('images');
79
		if (empty($tableauImages)) {
720 gduche 80
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;';
81
		} else {
737 gduche 82
			if ($this->conteneur->getParametre('url_service') == null) {
720 gduche 83
				$erreurs[] = '- paramètre "url_service" manquant ;';
84
			}
85
 
737 gduche 86
			if ($this->conteneur->getParametre('url_images') == null) {
720 gduche 87
				$erreurs[] = '- paramètre "url_images" manquant ;';
88
			}
89
 
90
		}
91
 
92
		if (empty($this->mappingObservation)) {
93
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_observation] ou celui-ci est vide ;';
94
		} else {
95
			$champsMappingObs = array('id_observation', 'date_observation', 'date_transmission', 'famille', 'nom_sel', 'nom_sel_nn', 'nt',
737 gduche 96
								'ce_zone_geo', 'zone_geo', 'lieudit', 'station', 'courriel', 'ce_utilisateur', 'nom', 'prenom');
97
 
720 gduche 98
			foreach ($champsMappingObs as $champ) {
99
				if (!isset($this->mappingObservation[$champ])) {
100
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
101
				}
102
			}
103
		}
104
 
105
		if (empty($this->mappingFiltre)) {
106
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_masque] ou celui-ci est vide ;';
107
		} else {
108
			$champsMappingFiltre = array('famille', 'ns', 'nn', 'date', 'tag', 'commune');
109
			foreach ($champsMappingFiltre as $champ) {
110
				if (!isset($this->mappingFiltre[$champ])) {
111
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
112
				}
113
			}
114
		}
115
 
116
		if (!empty($erreurs)) {
117
			$e = 'Erreur lors de la configuration : '."\n";
118
			$e .= implode("\n", $erreurs);
119
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
737 gduche 120
		}
720 gduche 121
	}
122
 
123
 
124
 
125
	/**
126
	 * Obtenir une chaine de caractère concaténant nom et prénom séparé par une virgule
127
	 * @param String $auteurId l'identifiant de l'auteur
128
	 * @return String la chaine de concaténation
129
	 * */
130
	private function getChaineNomPrenom($auteurId) {
131
		$nomPrenom = explode(' ', $auteurId);
132
		$nomPrenom = $this->proteger($nomPrenom);
133
		$chaineNomPrenom = implode(', ', $nomPrenom);
134
		return $chaineNomPrenom;
135
	}
136
 
137
	/**
138
	* Charger la clause WHERE en fonction des paramètres de masque
139
	* */
140
	private function chargerClauseWhere() {
141
		$where = array();
737 gduche 142
		$tableauMasque = $this->masque->getMasque();
143
		// FIXME : Les communes avec une apostrophe (ex: saint michel d'euzet) arrivent dans les paramètres sans l'apostrophe
144
		if (!empty($tableauMasque)) {
145
			foreach($tableauMasque as $idMasque => $valeurMasque) {
146
 
147
				$idMasque = str_replace('masque.', '', $idMasque);
148
				switch ($idMasque) {
149
					// nom du masque => nom BDD
150
					case 'auteur' :
151
						$auteurId = $this->masque->getMasque('auteur');
152
						if (is_numeric($auteurId)) {
153
							$where[] = ' ce_utilisateur = '.$auteurId;
154
						} else {
155
							if (strpos($auteurId, '@') === false) {
156
								$chaineNomPrenom = $this->getChaineNomPrenom($auteurId);
157
								$where[] = '((nom IN ('.$chaineNomPrenom.')) OR (prenom IN ('.$chaineNomPrenom.')))';
158
							} else {
159
								$where[] = " courriel LIKE ".$this->proteger($this->masque->getMasque('auteur').'%')." ";
160
							}
161
						}
162
						break;
720 gduche 163
 
737 gduche 164
						//TODO : gérer le format de la date ?
165
						// rechercher sur LIKE DATE % ?
166
						// TODO : recherche sur JOUR MOIS ou ANNEE
167
					case 'departement' :
168
						$dept = $valeurMasque;
169
						if (is_numeric($dept)) {
170
							$where[] = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept.'%');
720 gduche 171
						} else {
737 gduche 172
 
173
							//FIXME : et les apostrophes dans les départements ?
174
 
175
							$deptId = $this->conteneur->getParametre($dept);
176
							if ($deptId != null) {
177
								$where[] = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$deptId.'%');
178
							}
720 gduche 179
						}
737 gduche 180
						break;
181
					case 'genre' :
720 gduche 182
						$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger($valeurMasque.' %');
737 gduche 183
						break;
184
					case 'tag' :
185
						$where[] = " di.mots_cles_texte LIKE ".$this->proteger($valeurMasque);
186
						break;
187
					default:
188
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->proteger($valeurMasque);
189
					break;
190
				}
191
			}
720 gduche 192
		}
193
 
194
		if (!empty($where)) {
195
			return ' WHERE '.implode('AND', $where);
196
		} else {
197
			return;
198
		}
199
	}
200
 
201
	/*-------------------------------------------------------------------------------
202
								CHARGEMENT DES IMAGES
203
	--------------------------------------------------------------------------------*/
204
	/**
205
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
206
	* */
207
	private function chargerLiaisons() {
208
 
209
		$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS * '.
737 gduche 210
						   'FROM '.$this->gestionBdd->formaterTable('del_observation', 'dob').
211
						   'INNER JOIN '.$this->gestionBdd->formaterTable('del_obs_images', 'doi').
212
						   'ON doi.id_observation = dob.id_observation '.
720 gduche 213
						   'INNER JOIN del_utilisateur du '.
737 gduche 214
						   'ON du.id_utilisateur = doi.id_utilisateur ';
720 gduche 215
		$requeteLiaisons .= $this->chargerClauseWhere();
737 gduche 216
		$requeteLiaisons .=  ' GROUP BY doi.id_observation';
217
		$requeteLiaisons .= ' ORDER BY date_transmission DESC ';
218
		$requeteLiaisons .= $this->gestionBdd->getLimitSql();
219
 
220
		echo var_dump($requeteLiaisons);
720 gduche 221
		return $this->bdd->recupererTous($requeteLiaisons);
222
	}
223
 
224
	/**
225
	* Compter le nombre total d'images dans la base pour affichage dans entete.
226
	* */
737 gduche 227
	private function compterObservations() {
720 gduche 228
		$requete = 'SELECT FOUND_ROWS() AS nbre ';
229
		$resultats = $this->bdd->recuperer($requete);
230
		return (int) $resultats['nbre'];
231
	}
232
 
233
	/**
234
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
235
	* @param $liaisons les liaisons de la table del_obs_images
236
	* */
737 gduche 237
	private function chargerObservations($liaisons) {
720 gduche 238
 
737 gduche 239
		$observations = array();
720 gduche 240
		foreach ($liaisons as $liaison) {
737 gduche 241
			$idObs = $liaison[$this->mappingObservation['id_observation']];
720 gduche 242
 
737 gduche 243
			$observation = array();
244
			foreach ($this->mappingObservation as $id => $champ) {
245
				$observation[$champ] = $liaison[$id];
246
			}
247
			$observation['images'] = array();
248
			$observations[$idObs] = $observation;
720 gduche 249
		}
737 gduche 250
		return $observations;
720 gduche 251
	}
252
 
253
	/**
737 gduche 254
	 * Sélectionner toutes les images de chaque observation
255
	 * @param array $observations la liste des observations
256
	 * */
257
	public function chargerImages($observations) {
720 gduche 258
 
737 gduche 259
		foreach ($observations as $id => $observation) {
720 gduche 260
 
737 gduche 261
			$requeteImages = 'SELECT * FROM '. $this->gestionBdd->formaterTable('del_obs_images', 'doi').
262
							 'INNER JOIN '.$this->gestionBdd->formaterTable('del_image', 'di').
263
							 'ON doi.id_image = di.id_image '.
264
							 'WHERE doi.id_observation = '.$observation['id_observation'];
720 gduche 265
 
737 gduche 266
			$images = $this->bdd->recupererTous($requeteImages);
267
			$images = $this->formaterImages($images);
268
			$observations[$id]['images'] = $images;
720 gduche 269
		}
270
 
737 gduche 271
		return $observations;
720 gduche 272
	}
273
 
737 gduche 274
 
275
 
720 gduche 276
	/*-------------------------------------------------------------------------------
277
								FORMATER ET METTRE EN FORME
278
	--------------------------------------------------------------------------------*/
279
 
280
	/**
737 gduche 281
	 * Formater les images d'une observation
282
	 * @param array $images les images de l'observation
283
	 * */
284
	private function formaterImages($images) {
285
		$imagesRetour = array();
286
		foreach ($images as $image) {
287
			$imageCourante = array();
288
			$imageCourante['id_image'] = $image['id_image'];
289
			$imageCourante['date'] = $image['date_prise_de_vue'];
290
			// TODO : c'est dans la définition mais pas dans la table !
291
			//$imageRetour['mime']
292
			$imageCourante['binaire.href'] = $this->formaterLienImage($image['id_image']);
293
			$imageCourante['hauteur'] = $image['hauteur'];
294
			$imageRetour['largeur'] = $image['largeur'];
295
 
296
			$imagesRetour[] = $imageCourante;
297
		}
298
 
299
		return $imagesRetour;
300
	}
301
 
302
	/**
720 gduche 303
	*  Formater une observation depuis une ligne liaison
304
	*  @param $liaison liaison issue de la recherche
305
	*  @return $observation l'observation mise en forme
306
	* */
307
	private function formaterObservation($liaison) {
308
		$observation = array();
309
 
310
		foreach ($this->mappingObservation as $nomOriginal => $nomFinal) {
311
			$observation[$nomFinal] = $liaison[$nomOriginal];
312
		}
313
 
314
		return $observation;
315
	}
316
 
317
	/**
318
	*  Formater une observation depuis une ligne liaison
319
	*  @param $liaison liaison issue de la recherche
320
	*  @return $observation l'observation mise en forme
321
	* */
322
	private function formaterVotes($votes) {
323
		$retour = array();
324
		foreach ($votes as $vote) {
325
			$idImage = $vote['ce_image'];
326
			$id = $vote['id_vote_image'];
327
			$id_protocole = $vote['ce_protocole'];
328
			$auteur_id = $vote['ce_utilisateur'];
329
			$valeur = $vote['valeur_vote'];
330
			$date = $vote['date_vote_image'];
331
 
332
			$retour[$idImage]['valeur'] = $valeur;
333
			$retour[$idImage]['protocole'] = $id_protocole;
334
			$retour[$idImage]['auteur_id'] = $auteur_id;
335
			$retour[$idImage]['date'] = $auteur_id;
336
		}
337
 
338
		return $retour;
339
	}
340
 
341
	/**
342
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
343
	 * */
344
	private function formaterLienImage($idImage) {
345
		$idImage = sprintf('%09s', $idImage);
346
		$url = $this->conteneur->getParametre('url_images');
347
		$urlImage = str_replace('%s', $idImage, $url);
348
		return $urlImage;
349
	}
350
 
351
	private function proteger($valeur) {
352
		if (is_array($valeur)) {
353
			return $this->bdd->protegerTableau($valeur);
354
		} else {
355
			return $this->bdd->proteger($valeur);
356
		}
357
	}
358
}
359
?>