Subversion Repositories eFlore/Applications.del

Rev

Rev 700 | Go to most recent revision | Details | Compare with Previous | 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
// +------------------------------------------------------------------------------------------------------+
6
// | Copyright (C) 2006 Tela Botanica (accueil@tela-botanica.org)                                         |
7
// +------------------------------------------------------------------------------------------------------+
8
// | This file is part of DEL.                                                                   |
9
// |                                                                                                      |
10
// | Foobar is free software; you can redistribute it and/or modify                                       |
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
// |                                                                                                      |
15
// | Foobar is distributed in the hope that it will be useful,                                            |
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
// |                                                                                                      |
20
// | You should have received a copy of the GNU General Public License                                    |
21
// | along with Foobar; if not, write to the Free Software                                                |
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
 */
36
class Images extends Commun {
37
 
702 gduche 38
	private $config;
39
	private $schemaBdd;
700 gduche 40
	private $depart = 0;
702 gduche 41
	private $limite = 10;
42
	private $total; // Le nombre total d'images
43
	private $masque = array(); //Enregistrer les paramètres du masque
44
	private $auteurIds = array(); // La liste des identifiants des auteurs pour retrouver leur nom dans la base
45
	private $imageIds = array();
700 gduche 46
 
702 gduche 47
 
700 gduche 48
	/**
49
	 * Méthode principale de la classe
50
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService
51
	 * pour l'afficher.
702 gduche 52
	 * @param $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
53
	 * @param $parametres les paramètres situés après le ? dans l'url
700 gduche 54
	 * */
55
	public function consulter($ressources, $parametres) {
702 gduche 56
		// Gestion des configuration du script
57
		// TODO : gérer les erreurs de config
58
		// TODO : voir la classe Conteneur
700 gduche 59
		$this->config = Config::get('images');
702 gduche 60
		$this->schemaBdd = $this->config['schemaBdd'];
61
		$this->UrlNavigation = new Url($this->config['url_service']);
700 gduche 62
		$this->chargerParametres($parametres);
702 gduche 63
		$this->compterImages();
700 gduche 64
 
702 gduche 65
		// Lancement du service
66
		$liaisons = $this->chargerLiaisons();
67
		$images = $this->chargerImage($liaisons);
68
		$this->chargerAuteurs($images);
69
		$this->chargerVotes($images);
700 gduche 70
 
702 gduche 71
		// Mettre en forme le résultat et l'envoyer pour affichage
700 gduche 72
		$resultat = new ResultatService();
702 gduche 73
		$resultat->corps = array('entete' => $this->getEntete(), 'resultats' => $images);
700 gduche 74
		return $resultat;
75
	}
76
 
702 gduche 77
	/*-------------------------------------------------------------------------------
78
	 							CONFIGURATION DU SERVICE
79
	 --------------------------------------------------------------------------------*/
700 gduche 80
	/**
702 gduche 81
	 * Gestion des paramètres de l'application pour stockage dans variable de classe
82
	 * @param $parametres les paramètres tels que passés à la méthode consulter
700 gduche 83
	 * */
84
	public function chargerParametres($parametres) {
85
		$this->parametres = $parametres;
86
 
87
		if (isset($this->parametres['navigation.depart'])) {
88
			$this->depart = $this->parametres['navigation.depart'];
89
		}
90
 
91
		if (isset($this->parametres['navigation.limite'])) {
92
			$this->limite = $this->parametres['navigation.limite'];
93
		}
94
 
702 gduche 95
		foreach ($parametres as $id => $parametre) {
96
			if (strpos($id, 'masque.') === 0) {
97
				$champ = substr($id, 7, strlen($id));
98
				$this->masque[$champ] = $parametre;
99
			}
700 gduche 100
		}
702 gduche 101
	}
102
 
103
	/**
104
	* Créer la chaine de limite de requête en fonction des paramètres donnés
105
	* */
106
	private function getLimite() {
107
		return ' LIMIT '.$this->depart.', '.$this->limite;
108
	}
109
 
110
	/**
111
	* Charger la clause WHERE en fonction des paramètres de masque
112
	* */
113
	private function chargerClauseWhere() {
114
		$where = array();
115
		if (isset($this->masque['famille'])) {
116
			$where[] = " famille = '".$this->masque['famille']."' ";
117
		}
700 gduche 118
 
702 gduche 119
		if (isset($this->masque['genre'])) {
120
			$where[] = " genre = '".$this->masque['genre']."' ";
121
		}
122
 
123
		if (isset($this->masque['espece'])) {
124
			$where[] = " nom_sel = '".$this->masque['espece']."' ";
125
		}
126
 
127
		if (isset($this->masque['ns'])) {
128
			$where[] = " nom_sel_nn = '".$this->masque['ns']."' ";
129
		}
130
 
131
		// TODO : voir la définition du webservice et la gestion nn et ns
132
		/*if (isset($this->masque['nn'])) {
133
			$where[] = " nn = '".$this->masque['nn']."' ";
134
		}*/
135
 
136
 
137
		// TODO : voir la liaision avec auteur : sur id ?
138
		if (isset($this->masque['auteur'])) {
139
			$where[] = " ce_utilisateur = '".$this->masque['auteur']."' ";
140
		}
141
 
142
		// TODO : date de quoi ?
143
		/*if (isset($this->masque['date'])) {
144
			$where[] = " date = '".$this->masque['date']."' ";
145
		}*/
146
 
147
		//TODO : ???
148
		/*if (isset($this->masque['commune'])) {
149
			$where[] = " commune = '".$this->masque['commune']."' ";
150
		}*/
151
 
152
		//TODO : ???
153
		/*if (isset($this->masque['departement'])) {
154
			$where[] = " departement = '".$this->masque['departement']."' ";
155
		}*/
156
 
157
		if (isset($this->masque['tag'])) {
158
			$where[] = " mots_cles_texte = '".$this->masque['tag']."' ";
159
		}
160
 
161
		return 'WHERE '.implode('AND', $where);
700 gduche 162
	}
163
 
164
	/**
165
	 * Compter le nombre total d'images dans la base pour affichage dans entete.
166
	 * */
167
	private function compterImages() {
702 gduche 168
		$requeteNbImages = 'SELECT COUNT(*) AS nb '.
169
						   'FROM '.$this->schemaBdd.'.del_image ';
700 gduche 170
		$resultatNbImages = $this->getBdd()->recuperer($requeteNbImages);
171
		$this->total = $resultatNbImages['nb'];
172
	}
173
 
702 gduche 174
	/*-------------------------------------------------------------------------------
175
								CHARGEMENT DES IMAGES
176
	--------------------------------------------------------------------------------*/
700 gduche 177
	/**
702 gduche 178
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
179
	* */
180
	private function chargerLiaisons() {
181
 
182
		$requeteLiaisons = 'SELECT * '.
183
						   'FROM '.$this->schemaBdd.'.del_obs_images doi '.
184
						   'INNER JOIN del_image di '.
185
						   'ON doi.ce_image = di.id_image '.
186
						   'INNER JOIN del_observation dob '.
187
						   'ON doi.ce_observation = dob.id_observation ';
188
		$requeteLiaisons .= $this->chargerClauseWhere();
189
		$requeteLiaisons .= $this->getLimite();
190
 
191
		return $this->getBdd()->recupererTous($requeteLiaisons);
192
	}
193
 
194
	/**
195
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
196
	* @param $liaisons les liaisons de la table del_obs_images
197
	* */
198
	private function chargerImage($liaisons) {
199
 
200
		$images = array();
201
		foreach ($liaisons as $liaison) {
202
			$idImage = $liaison['ce_image'];
203
 
204
			// On enregistre l'ID de l'auteur pour n'effectuer qu'une seule requête par la suite
205
			$this->auteursIds[$liaison['ce_utilisateur']] = true;
206
 
207
			// On enregistre l'ID de l'image pour n'effectuer qu'une seule requête par la suite
208
			$this->imageIds[] = $idImage;
209
 
210
			$images[] = array('id_image' => $idImage, 'date' => $liaison['date_prise_de_vue'], 'binaire.href' => $this->formaterLienImage($idImage),
211
						'hauteur' => $liaison['hauteur'], 'largeur' => $liaison['largeur'], 'votes' => array(), 'observation' => $this->formaterObservation($liaison));
212
		}
213
		return $images;
214
	}
215
 
216
	/**
217
	* Récupère les auteurs utilisés dans la sous-liste, effectue une requête, et met à jour
218
	* les résultats
219
	* @param $images le tableau d'images récupéré et mis en forme
220
	* */
221
	private function chargerAuteurs(&$images) {
222
		if (sizeof($this->auteursIds) > 0) {
223
			$auteursIds = array_keys($this->auteursIds);
224
 
225
			$chaineAuteursIds = implode(',', $auteursIds);
226
			$requeteAuteurs = 'SELECT * FROM '.$this->schemaBdd.'.del_utilisateur '.
227
								 'WHERE id_utilisateur IN ('.$chaineAuteursIds.')';
228
			$resultatAuteurs = $this->getBdd()->recupererTous($requeteAuteurs);
229
 
230
			$auteurs = array();
231
			foreach ($resultatAuteurs as $auteur) {
232
 
233
				$id = $auteur['id_utilisateur'];
234
				$auteurs[$id]['nom'] = $auteur['nom'];
235
				$auteurs[$id]['prenom'] = $auteur['prenom'];
236
			}
237
 
238
			foreach ($images as &$image) {
239
				$idAuteur = $image['observation']['auteur.id'];
240
				$image['observation']['auteur.nom'] = $auteurs["$idAuteur"]['nom'];
241
				$image['observation']['auteur.prenom'] = $auteurs["$idAuteur"]['prenom'];
242
			}
243
		}
244
	}
245
 
246
	/**
247
	* Charger les votes pour chaque image
248
	* */
249
	private function chargerVotes(&$images) {
250
		if (sizeof($this->imageIds) > 0) {
251
			$chaineImageIds = implode(',', $this->imageIds);
252
 
253
			$requeteVotes = 'SELECT * FROM '.
254
			                $this->schemaBdd.'.del_vote_image '.
255
			                'WHERE ce_image IN ('.$chaineImageIds.')';
256
			$resultatsVotes = $this->getBdd()->recupererTous($requeteVotes);
257
 
258
			$votes = array();
259
			foreach ($resultatsVotes as $vote) {
260
				$idImage = $vote['ce_image'];
261
				$id = $vote['id_vote_image'];
262
				$id_protocole = $vote['ce_protocole'];
263
				$auteur_id = $vote['ce_utilisateur'];
264
				$valeur = $vote['valeur_vote'];
265
				//TODO : voir la définition du webservice ! La date n'est pas présent dans la base
266
				//$date = $vote[''];
267
 
268
				//TODO : voir la définition du webservice : ne devrait pas être "valeur" ?
269
				$votes[$idImage]['vote'] = $valeur;
270
				$votes[$idImage]['protocole'] = $id_protocole;
271
				$votes[$idImage]['auteur_id'] = $auteur_id;
272
			}
273
 
274
			foreach ($images as &$image) {
275
				if (isset($votes[$image['id_image']])) {
276
					$image['votes'] = $votes[$image['id_image']];
277
				}
278
			}
279
		}
280
	}
281
 
282
	/*-------------------------------------------------------------------------------
283
								FORMATER ET METTRE EN FORME
284
	--------------------------------------------------------------------------------*/
285
	/**
286
	*  Formater une observation depuis une ligne liaison
287
	*  @param $liaison liaison issue de la recherche
288
	* */
289
	private function formaterObservation($liaison) {
290
		$observation = array();
291
		$observation['id_observation'] = $liaison['id_observation'];
292
		$observation['date_observation'] = $liaison['date_observation'];
293
		$observation['date_transmission'] = $liaison['date_transmission'];
294
		$observation['determination.famille'] = $liaison['famille'];
295
		$observation['determination.ns'] = $liaison['nom_sel'];
296
		$observation['determination.nn'] = $liaison['nom_sel_nn'];
297
		$observation['determination.nt'] = $liaison['nt'];
298
		$observation['id_zone_geo'] = $liaison['ce_zone_geo'];
299
		$observation['zone_geo'] = $liaison['zone_geo'];
300
		$observation['lieudit'] = $liaison['lieudit'];
301
		$observation['station'] = $liaison['station'];
302
		$observation['milieu'] = $liaison['milieu'];
303
		$observation['auteur.id'] = $liaison['ce_utilisateur'];
304
		//$this->chargerAuteur($observation);
305
		return $observation;
306
	}
307
 
308
	/**
700 gduche 309
	 * Créer l'entête en fonction des paramètres donnés
310
	 * */
311
	private function getEntete() {
312
		$entete = array();
313
		$entete['masque'] = $this->recupererMasque();
314
		$entete['depart'] = $this->depart;
315
		$entete['limite'] = $this->limite;
316
		$entete['total'] = $this->total;
317
		$lienPrecedent = $this->recupererHrefPrecedent();
318
 
319
		if ($lienPrecedent != null) {
320
			$entete['entete.precedent'] = $lienPrecedent;
321
		}
322
 
323
		$lienSuivant = $this->recupererHrefSuivant();
324
		if ($lienSuivant) {
325
			$entete['entete.suivant'] = $lienSuivant;
326
		}
327
		return $entete;
328
	}
329
 
330
	/**
331
	 * Récupérer le lien pour afficher les images précédentes en fonction des paramètres
332
	 * */
333
	private function recupererHrefPrecedent() {
334
		$departActuel = $this->depart;
335
		$limite = $this->limite;
336
		$departSuivant = $departActuel - $limite;
337
 
338
		$url = null;
702 gduche 339
 
340
		if ($departActuel > 0) {
700 gduche 341
			$parametres = array();
342
			$url = $this->obtenirUrlNavigation($departSuivant, $limite, $parametres);
343
		}
344
		return $url;
345
	}
346
 
702 gduche 347
	/**
348
	* Récupérer le lien pour afficher les images suivantes en fonction des paramètres
349
	* */
700 gduche 350
	private function recupererHrefSuivant() {
351
		$departActuel = $this->depart;
352
		$limite = $this->limite;
353
		$departSuivant = $departActuel + $limite;
354
 
355
		$url = null;
356
		if ($departSuivant < $this->total) {
357
			$parametres = array();
358
			$url = $this->obtenirUrlNavigation($departSuivant, $limite, $parametres);
359
		}
360
		return $url;
361
	}
362
 
702 gduche 363
	/**
364
	* Récupérer l'url de navigation en concaténant d'éventuels paramètres
365
	* @param $depart l'entier de départ de la recherche
366
	* @param $limite le nombre de résultats à retourner
367
	* @param $parametresAdditionnels le tableau contenant les parametres => valeurs additionnels
368
	* */
700 gduche 369
	private function obtenirUrlNavigation($depart, $limite, $parametresAdditionnels) {
702 gduche 370
		$parametres = array('navigation.depart' => $depart, 'navigation.limite' => $limite);
700 gduche 371
 
372
		if ($parametresAdditionnels != null) {
373
			$parametres = array_merge($parametres, $parametresAdditionnels);
374
		}
375
		$this->UrlNavigation->setRequete($parametres);
376
		$url = $this->UrlNavigation->getURL();
377
		return $url;
378
	}
379
 
380
	/**
381
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
382
	 * */
383
	private function formaterLienImage($idImage) {
384
		$idImage = sprintf('%09s', $idImage);
385
		$url = $this->config['url_images'];
386
		$urlImage = str_replace('%s', $idImage, $url);
387
		return $urlImage;
388
	}
389
 
390
	/**
391
	 * Récupérer le masque depuis les paramètres
392
	 * */
393
	private function recupererMasque() {
394
		$masqueEntete = '';
395
		foreach ($this->parametres as $param => $cle) {
396
			if ($param == 'masque') {
397
				$masqueEntete = 'masque='.$cle.',';
398
			} elseif (substr($param, 0, 7) == 'masque.') {
399
				$masqueEntete .= substr($param, 7).'='.$cle.',';
400
			}
401
		}
402
		$masqueEntete = rtrim($masqueEntete,',');
403
		return $masqueEntete;
404
	}
405
}
406
?>