Subversion Repositories eFlore/Applications.del

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
700 gduche 1
<?php
2
/*vim: set expandtab tabstop=4 shiftwidth=4: */
3
// +------------------------------------------------------------------------------------------------------+
4
// | PHP version 5.1.1                                                                                    |
5
// +------------------------------------------------------------------------------------------------------+
703 gduche 6
// | Copyright (C) 2011 Tela Botanica (accueil@tela-botanica.org)                                         |
700 gduche 7
// +------------------------------------------------------------------------------------------------------+
8
// | This file is part of DEL.                                                                   |
9
// |                                                                                                      |
703 gduche 10
// | DEL is free software; you can redistribute it and/or modify                                       |
700 gduche 11
// | it under the terms of the GNU General Public License as published by                                 |
12
// | the Free Software Foundation; either version 2 of the License, or                                    |
13
// | (at your option) any later version.                                                                  |
14
// |                                                                                                      |
703 gduche 15
// | DEL is distributed in the hope that it will be useful,                                            |
700 gduche 16
// | but WITHOUT ANY WARRANTY; without even the implied warranty of                                       |
17
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                        |
18
// | GNU General Public License for more details.                                                         |
19
// |                                                                                                      |
703 gduche 20
// | You should have received a copy of the  GNU General Public License                                    |
705 gduche 21
// | along with Del; if not, write to the Free Software                                                |
700 gduche 22
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
23
// +------------------------------------------------------------------------------------------------------+
24
// CVS : $Id: effi_cel.action.php,v 1.9 2007-11-06 10:54:03 jp_milcent Exp $
25
/**
702 gduche 26
 * Le web service image récupère toutes les données de la table del_obs_images
27
 * pour retourner une liste d'images associée à une observation
28
 *
29
 * @package del
30
 * @subpackage images
31
 * @author	Grégoire Duché <gregoire@tela-botanica.org>
32
 * @copyright     Tela-Botanica 2000-2012
33
 * @version       $Revision: 1.9 $ $Date: 2007-11-06 10:54:03 $
700 gduche 34
// +------------------------------------------------------------------------------------------------------+
35
 */
705 gduche 36
 
37
// TODO : conteneur, n'étendra plus rien
38
// Le contenu viendra du constructeur
700 gduche 39
class Images extends Commun {
40
 
702 gduche 41
	private $config;
42
	private $schemaBdd;
700 gduche 43
	private $depart = 0;
702 gduche 44
	private $limite = 10;
45
	private $total; // Le nombre total d'images
46
	private $masque = array(); //Enregistrer les paramètres du masque
47
	private $imageIds = array();
704 gduche 48
	private $idImage;
700 gduche 49
 
50
	/**
51
	 * Méthode principale de la classe
52
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService
53
	 * pour l'afficher.
702 gduche 54
	 * @param $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
55
	 * @param $parametres les paramètres situés après le ? dans l'url
700 gduche 56
	 * */
57
	public function consulter($ressources, $parametres) {
704 gduche 58
 
59
		if (!empty($ressources)) {
60
			$this->idImage = $ressources[0];
61
		}
62
 
705 gduche 63
		//TODO : enlever les appels par référence
702 gduche 64
		// Gestion des configuration du script
65
		// TODO : gérer les erreurs de config
705 gduche 66
		// voir les paramètres par défaut
67
		// vérifier les valeurs (voir try catch JP)
702 gduche 68
		// TODO : voir la classe Conteneur
700 gduche 69
		$this->config = Config::get('images');
702 gduche 70
		$this->schemaBdd = $this->config['schemaBdd'];
71
		$this->UrlNavigation = new Url($this->config['url_service']);
700 gduche 72
		$this->chargerParametres($parametres);
705 gduche 73
 
74
		// TODO : voir CEL ou CHORODEP eflore ou CARTOPOINT pour calc find rows
702 gduche 75
		$this->compterImages();
700 gduche 76
 
702 gduche 77
		// Lancement du service
705 gduche 78
		// TODO : changer le résultat par id => objetImage
702 gduche 79
		$liaisons = $this->chargerLiaisons();
80
		$images = $this->chargerImage($liaisons);
705 gduche 81
 
82
		//TODO : gérer un retour de chargervote plutot que référence
702 gduche 83
		$this->chargerVotes($images);
700 gduche 84
 
702 gduche 85
		// Mettre en forme le résultat et l'envoyer pour affichage
700 gduche 86
		$resultat = new ResultatService();
702 gduche 87
		$resultat->corps = array('entete' => $this->getEntete(), 'resultats' => $images);
700 gduche 88
		return $resultat;
89
	}
90
 
702 gduche 91
	/*-------------------------------------------------------------------------------
92
	 							CONFIGURATION DU SERVICE
93
	 --------------------------------------------------------------------------------*/
700 gduche 94
	/**
702 gduche 95
	 * Gestion des paramètres de l'application pour stockage dans variable de classe
96
	 * @param $parametres les paramètres tels que passés à la méthode consulter
700 gduche 97
	 * */
98
	public function chargerParametres($parametres) {
99
		$this->parametres = $parametres;
100
 
101
		if (isset($this->parametres['navigation.depart'])) {
102
			$this->depart = $this->parametres['navigation.depart'];
103
		}
104
 
105
		if (isset($this->parametres['navigation.limite'])) {
106
			$this->limite = $this->parametres['navigation.limite'];
107
		}
108
 
705 gduche 109
 
110
		// TODO : voir méthode gérer Masque pour gérer les spécificités de chaque paramètre
702 gduche 111
		foreach ($parametres as $id => $parametre) {
112
			if (strpos($id, 'masque.') === 0) {
113
				$champ = substr($id, 7, strlen($id));
114
				$this->masque[$champ] = $parametre;
115
			}
700 gduche 116
		}
702 gduche 117
	}
118
 
119
	/**
120
	* Créer la chaine de limite de requête en fonction des paramètres donnés
121
	* */
122
	private function getLimite() {
123
		return ' LIMIT '.$this->depart.', '.$this->limite;
124
	}
125
 
126
	/**
127
	* Charger la clause WHERE en fonction des paramètres de masque
128
	* */
129
	private function chargerClauseWhere() {
130
		$where = array();
705 gduche 131
 
132
		// TODO : factoriser ci-dessous
704 gduche 133
		if (isset($this->idImage)) {
134
			$where[] = " id_image = ".$this->getBdd()->proteger($this->idImage);
135
		}
136
 
702 gduche 137
		if (isset($this->masque['famille'])) {
704 gduche 138
			$where[] = " famille = ".$this->getBdd()->proteger($this->masque['famille']);
702 gduche 139
		}
700 gduche 140
 
702 gduche 141
		if (isset($this->masque['genre'])) {
704 gduche 142
			$where[] = " genre = ".$this->getBdd()->proteger($this->masque['genre']);
702 gduche 143
		}
144
 
145
		if (isset($this->masque['espece'])) {
704 gduche 146
			$where[] = " nom_sel = ".$this->getBdd()->proteger($this->masque['espece']);
702 gduche 147
		}
148
 
149
		if (isset($this->masque['ns'])) {
704 gduche 150
			$where[] = " nom_sel = ".$this->getBdd()->proteger($this->masque['ns']);
702 gduche 151
		}
152
 
703 gduche 153
		if (isset($this->masque['nn'])) {
704 gduche 154
			$where[] = " nom_sel_nn = ".$this->getBdd()->proteger($this->masque['nn']);
703 gduche 155
		}
702 gduche 156
 
157
		if (isset($this->masque['auteur'])) {
703 gduche 158
 
159
			$auteurId = $this->masque['auteur'];
160
			if (is_numeric($auteurId)) {
704 gduche 161
				$where[] = " ce_utilisateur = ".$this->masque['auteur'];
703 gduche 162
			} else {
163
				if (strpos($auteurId, '@') === false) {
164
 
705 gduche 165
					// TODO : bug sur nom/prenom
703 gduche 166
					// TODO : j'ai utilisé implode car ça évite de faire un rtrim à la fin
167
					// mais comme je ne peux pas protéger chaque valeur d'un tableau, ca alourdit le code.
168
					// quid ?
705 gduche 169
					// TODO : voir méthode pour protéger les valeurs d'un tableau (cel.php, services web du cel ...)
703 gduche 170
					$nomPrenom = explode(' ', $auteurId);
171
					foreach ($nomPrenom as &$valeur) {
172
						$valeur = $this->getBdd()->proteger($valeur);
173
					}
174
					$chaineNomPrenom = implode(', ', $nomPrenom);
705 gduche 175
					$where[] = '((nom IN ('.$chaineNomPrenom.')) OR (prenom IN ('.$chaineNomPrenom.')))';
703 gduche 176
 
177
				} else {
178
					$where[] = " courriel LIKE ".$this->getBdd()->proteger($this->masque['auteur'].'%')." ";
179
				}
180
			}
702 gduche 181
		}
182
 
703 gduche 183
		//TODO : gérer le format de la date ?
184
		// rechercher sur LIKE DATE % ?
705 gduche 185
		// TODO : recherche sur JOUR MOIS ou ANNEE
703 gduche 186
		if (isset($this->masque['date'])) {
187
			$where[] = " date_observation = ".$this->getBdd()->proteger($this->masque['date']);
188
		}
702 gduche 189
 
190
 
703 gduche 191
		if (isset($this->masque['commune'])) {
192
			$where[] = " zone_geo LIKE ".$this->getBdd()->proteger($this->masque['commune']);
193
		}
702 gduche 194
 
703 gduche 195
		if (isset($this->masque['departement'])) {
196
			$dept = $this->masque['departement'];
197
			if (is_numeric($dept)) {
198
				$where[] = " ce_zone_geo LIKE ".$this->getBdd()->proteger('INSEE-C:'.$this->masque['departement'].'%');
705 gduche 199
			} else {
200
				//TODO : que faire si le département n'est pas numérique ?
201
				// TODO : modifier le modèle pour intégrer les zones geos !
703 gduche 202
			}
203
		}
204
 
702 gduche 205
		if (isset($this->masque['tag'])) {
704 gduche 206
			$where[] = " mots_cles_texte LIKE ".$this->getBdd()->proteger($this->masque['tag']);
702 gduche 207
		}
208
 
703 gduche 209
		if (!empty($where)) {
210
			return ' WHERE '.implode('AND', $where);
211
		} else {
212
			return;
213
		}
700 gduche 214
	}
215
 
216
	/**
217
	 * Compter le nombre total d'images dans la base pour affichage dans entete.
218
	 * */
219
	private function compterImages() {
705 gduche 220
		// TODO : n'est pas la bonne requête
221
		// voir dans les services web eflore
702 gduche 222
		$requeteNbImages = 'SELECT COUNT(*) AS nb '.
223
						   'FROM '.$this->schemaBdd.'.del_image ';
700 gduche 224
		$resultatNbImages = $this->getBdd()->recuperer($requeteNbImages);
225
		$this->total = $resultatNbImages['nb'];
226
	}
227
 
702 gduche 228
	/*-------------------------------------------------------------------------------
229
								CHARGEMENT DES IMAGES
230
	--------------------------------------------------------------------------------*/
700 gduche 231
	/**
702 gduche 232
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
233
	* */
234
	private function chargerLiaisons() {
235
 
236
		$requeteLiaisons = 'SELECT * '.
237
						   'FROM '.$this->schemaBdd.'.del_obs_images doi '.
238
						   'INNER JOIN del_image di '.
239
						   'ON doi.ce_image = di.id_image '.
240
						   'INNER JOIN del_observation dob '.
703 gduche 241
						   'ON doi.ce_observation = dob.id_observation '.
242
						   'INNER JOIN del_utilisateur du '.
243
						   'ON du.id_utilisateur = doi.ce_utilisateur';
244
 
702 gduche 245
		$requeteLiaisons .= $this->chargerClauseWhere();
246
		$requeteLiaisons .= $this->getLimite();
247
 
248
		return $this->getBdd()->recupererTous($requeteLiaisons);
249
	}
250
 
251
	/**
252
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
253
	* @param $liaisons les liaisons de la table del_obs_images
254
	* */
255
	private function chargerImage($liaisons) {
256
 
257
		$images = array();
258
		foreach ($liaisons as $liaison) {
259
			$idImage = $liaison['ce_image'];
260
 
261
			// On enregistre l'ID de l'image pour n'effectuer qu'une seule requête par la suite
262
			$this->imageIds[] = $idImage;
263
 
264
			$images[] = array('id_image' => $idImage, 'date' => $liaison['date_prise_de_vue'], 'binaire.href' => $this->formaterLienImage($idImage),
265
						'hauteur' => $liaison['hauteur'], 'largeur' => $liaison['largeur'], 'votes' => array(), 'observation' => $this->formaterObservation($liaison));
266
		}
267
		return $images;
268
	}
269
 
270
	/**
271
	* Charger les votes pour chaque image
272
	* */
273
	private function chargerVotes(&$images) {
274
		if (sizeof($this->imageIds) > 0) {
275
			$chaineImageIds = implode(',', $this->imageIds);
276
 
277
			$requeteVotes = 'SELECT * FROM '.
278
			                $this->schemaBdd.'.del_vote_image '.
279
			                'WHERE ce_image IN ('.$chaineImageIds.')';
280
			$resultatsVotes = $this->getBdd()->recupererTous($requeteVotes);
281
 
705 gduche 282
 
283
			//TODO : faire une méthode formater vote
702 gduche 284
			$votes = array();
285
			foreach ($resultatsVotes as $vote) {
286
				$idImage = $vote['ce_image'];
287
				$id = $vote['id_vote_image'];
288
				$id_protocole = $vote['ce_protocole'];
289
				$auteur_id = $vote['ce_utilisateur'];
290
				$valeur = $vote['valeur_vote'];
703 gduche 291
				//TODO : ajouter la date au modèle
702 gduche 292
				//$date = $vote[''];
293
 
703 gduche 294
				$votes[$idImage]['valeur'] = $valeur;
702 gduche 295
				$votes[$idImage]['protocole'] = $id_protocole;
296
				$votes[$idImage]['auteur_id'] = $auteur_id;
297
			}
298
 
299
			foreach ($images as &$image) {
300
				if (isset($votes[$image['id_image']])) {
301
					$image['votes'] = $votes[$image['id_image']];
302
				}
303
			}
304
		}
305
	}
306
 
307
	/*-------------------------------------------------------------------------------
308
								FORMATER ET METTRE EN FORME
309
	--------------------------------------------------------------------------------*/
310
	/**
311
	*  Formater une observation depuis une ligne liaison
312
	*  @param $liaison liaison issue de la recherche
313
	* */
314
	private function formaterObservation($liaison) {
315
		$observation = array();
705 gduche 316
 
317
		// TODO : faire un tableau de correspondance clé-valeur
702 gduche 318
		$observation['id_observation'] = $liaison['id_observation'];
319
		$observation['date_observation'] = $liaison['date_observation'];
320
		$observation['date_transmission'] = $liaison['date_transmission'];
321
		$observation['determination.famille'] = $liaison['famille'];
322
		$observation['determination.ns'] = $liaison['nom_sel'];
323
		$observation['determination.nn'] = $liaison['nom_sel_nn'];
324
		$observation['determination.nt'] = $liaison['nt'];
325
		$observation['id_zone_geo'] = $liaison['ce_zone_geo'];
326
		$observation['zone_geo'] = $liaison['zone_geo'];
327
		$observation['lieudit'] = $liaison['lieudit'];
328
		$observation['station'] = $liaison['station'];
329
		$observation['milieu'] = $liaison['milieu'];
330
		$observation['auteur.id'] = $liaison['ce_utilisateur'];
703 gduche 331
		$observation['auteur.nom'] = $liaison['nom'];
332
		$observation['auteur.prenom'] = $liaison['prenom'];
702 gduche 333
		return $observation;
334
	}
335
 
336
	/**
700 gduche 337
	 * Créer l'entête en fonction des paramètres donnés
338
	 * */
339
	private function getEntete() {
340
		$entete = array();
341
		$entete['masque'] = $this->recupererMasque();
342
		$entete['depart'] = $this->depart;
343
		$entete['limite'] = $this->limite;
344
		$entete['total'] = $this->total;
345
		$lienPrecedent = $this->recupererHrefPrecedent();
346
 
347
		if ($lienPrecedent != null) {
348
			$entete['entete.precedent'] = $lienPrecedent;
349
		}
350
 
351
		$lienSuivant = $this->recupererHrefSuivant();
352
		if ($lienSuivant) {
353
			$entete['entete.suivant'] = $lienSuivant;
354
		}
355
		return $entete;
356
	}
357
 
358
	/**
359
	 * Récupérer le lien pour afficher les images précédentes en fonction des paramètres
360
	 * */
361
	private function recupererHrefPrecedent() {
362
		$departActuel = $this->depart;
363
		$limite = $this->limite;
364
		$departSuivant = $departActuel - $limite;
365
 
366
		$url = null;
702 gduche 367
 
368
		if ($departActuel > 0) {
700 gduche 369
			$parametres = array();
370
			$url = $this->obtenirUrlNavigation($departSuivant, $limite, $parametres);
371
		}
372
		return $url;
373
	}
374
 
702 gduche 375
	/**
376
	* Récupérer le lien pour afficher les images suivantes en fonction des paramètres
377
	* */
700 gduche 378
	private function recupererHrefSuivant() {
379
		$departActuel = $this->depart;
380
		$limite = $this->limite;
381
		$departSuivant = $departActuel + $limite;
382
 
383
		$url = null;
384
		if ($departSuivant < $this->total) {
385
			$parametres = array();
386
			$url = $this->obtenirUrlNavigation($departSuivant, $limite, $parametres);
387
		}
388
		return $url;
389
	}
390
 
702 gduche 391
	/**
392
	* Récupérer l'url de navigation en concaténant d'éventuels paramètres
393
	* @param $depart l'entier de départ de la recherche
394
	* @param $limite le nombre de résultats à retourner
395
	* @param $parametresAdditionnels le tableau contenant les parametres => valeurs additionnels
396
	* */
700 gduche 397
	private function obtenirUrlNavigation($depart, $limite, $parametresAdditionnels) {
702 gduche 398
		$parametres = array('navigation.depart' => $depart, 'navigation.limite' => $limite);
700 gduche 399
 
400
		if ($parametresAdditionnels != null) {
401
			$parametres = array_merge($parametres, $parametresAdditionnels);
402
		}
403
		$this->UrlNavigation->setRequete($parametres);
404
		$url = $this->UrlNavigation->getURL();
405
		return $url;
406
	}
407
 
408
	/**
409
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
410
	 * */
411
	private function formaterLienImage($idImage) {
412
		$idImage = sprintf('%09s', $idImage);
413
		$url = $this->config['url_images'];
414
		$urlImage = str_replace('%s', $idImage, $url);
415
		return $urlImage;
416
	}
417
 
418
	/**
419
	 * Récupérer le masque depuis les paramètres
420
	 * */
421
	private function recupererMasque() {
422
		$masqueEntete = '';
423
		foreach ($this->parametres as $param => $cle) {
424
			if ($param == 'masque') {
425
				$masqueEntete = 'masque='.$cle.',';
426
			} elseif (substr($param, 0, 7) == 'masque.') {
427
				$masqueEntete .= substr($param, 7).'='.$cle.',';
428
			}
429
		}
430
		$masqueEntete = rtrim($masqueEntete,',');
431
		return $masqueEntete;
432
	}
433
}
434
?>