Subversion Repositories eFlore/Applications.del

Rev

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

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