Subversion Repositories eFlore/Applications.del

Rev

Rev 1312 | 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();
800 aurelien 28
	private $tri = 'date_transmission';
29
	private $directionTri = 'desc';
709 gduche 30
 
719 gduche 31
	public function __construct(Conteneur $conteneur = null) {
32
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
791 aurelien 33
		$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
798 aurelien 34
		$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
775 aurelien 35
		$this->conteneur->chargerConfiguration('config_images.ini');
725 gduche 36
		$this->navigation = $conteneur->getNavigation();
37
		$this->masque = $conteneur->getMasque();
38
		$this->gestionBdd = $conteneur->getGestionBdd();
775 aurelien 39
		$this->bdd = $this->gestionBdd->getBdd();
719 gduche 40
	}
41
 
1312 gduche 42
 
709 gduche 43
	/**
1312 gduche 44
	 * RequeteSansParametres
45
	 *
46
	 * permet de vérifier qu'il n'y a aucun paramètre dans la requete, excepté les informations de start et limite,
47
	 * pour ajuster la requête pour un gain de temps
48
	 * @param array $ressources les ressources telles qu'elles sont passées au script
49
	 * @param array $parametres les paramètres tels qu'il sont passés au script
50
	 * */
51
	public function requeteSansParametres($ressources, $parametres) {
52
		$estSansParametres = true;
53
 
54
		if (sizeof($ressources) > 0) {
55
			$estSansParametres = false;
56
		}
57
 
58
		if (sizeof($parametres) > 2) {
59
			// s'il y a plus de 2 paramètres, on est forcément dans le cas où on a demandé des paramètres autre que la navigation
60
			$estSansParametres = false;
61
		} else {
62
			if (sizeof($parametres) == 1) {
63
				if (!(isset($parametres['navigation.depart']) || isset($parametres['navigation.limite']))) {
64
					// s'il y a des paramètres, seul les paramètres de navigation n'interfère pas sur la requête
65
					$estSansParametres = false;
66
				}
67
			} elseif (sizeof($parametres) == 2) {
68
				// s'il y a des paramètres, seul les paramètres de navigation n'interfère pas sur la requête
69
				if (!(isset($parametres['navigation.depart']) && isset($parametres['navigation.limite']))) {
70
					$estSansParametres = false;
71
				}
72
			}
73
		}
74
 
75
		return $estSansParametres;
76
	}
77
 
78
	/**
709 gduche 79
	 * Méthode principale de la classe.
80
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService
81
	 * pour l'afficher.
82
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
83
	 * @param array $parametres les paramètres situés après le ? dans l'url
84
	 * */
85
	public function consulter($ressources, $parametres) {
1312 gduche 86
 
759 delphine 87
		$this->initialiserRessourcesEtParametres($ressources, $parametres);
709 gduche 88
 
89
		// Gestion des configuration du script
90
		$this->configurer();
711 gduche 91
		$this->verifierConfiguration();
709 gduche 92
 
800 aurelien 93
		$this->verifierParametresTri();
94
		$this->initialiserTri();
95
 
709 gduche 96
 
1312 gduche 97
		if ($this->requeteSansParametres($ressources, $parametres)) {
98
 
99
			// Lancement du service
100
			$liaisons = $this->chargerLiaisonsSimple();
101
			$images = $this->chargerImage($liaisons);
102
			$images = $this->chargerVotes($images);
103
 
104
			// Mettre en forme le résultat et l'envoyer pour affichage
105
			$resultat = new ResultatService();
106
			$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
107
			return $resultat;
108
		} else {
109
 
110
			// Lancement du service
111
			$liaisons = $this->chargerLiaisons();
112
			$total = $this->compterImages();
113
			$this->navigation->setTotal($total);
114
			$images = $this->chargerImage($liaisons);
115
			$images = $this->chargerVotes($images);
116
 
117
			// Mettre en forme le résultat et l'envoyer pour affichage
118
			$resultat = new ResultatService();
119
			$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
120
			return $resultat;
121
 
122
		}
709 gduche 123
	}
124
 
759 delphine 125
	private function initialiserRessourcesEtParametres($ressources, $parametres) {
126
		$this->ressources = $ressources;
127
		$this->parametres = $parametres;
128
	}
800 aurelien 129
 
130
	private function verifierParametresTri() {
131
 
132
		$erreurs = array();
133
		$tris_possibles = $this->conteneur->getParametre('tris_possibles');
134
		$tris_possibles_tableau = explode(',', $tris_possibles);
135
		if(isset($this->parametres['tri']) && !in_array($this->parametres['tri'], $tris_possibles_tableau)) {
136
			$erreurs[] = '- le type de tri demandé est incorrect, les valeurs possibles sont '.$tris_possibles.' ;';
137
		}
138
 
951 aurelien 139
		if(isset($this->parametres['tri']) && $this->parametres['tri'] == "votes") {
140
			if(!isset($this->parametres['protocole']) || !is_numeric($this->parametres['protocole'])) {
141
				$erreurs[] = '- Le paramètre protocole est obligatoire en cas de tri par vote et doit être un entier ;';
142
			}
143
		}
144
 
800 aurelien 145
		$directions_tri = array('asc', 'desc');
146
		if(isset($this->parametres['ordre']) && !in_array($this->parametres['ordre'], $directions_tri)) {
147
			$erreurs[] = '- la direction du tri demandé est incorrecte, les valeurs supportées sont asc ou desc ;';
148
		}
149
 
150
		if (!empty($erreurs)) {
151
			$e = 'Erreur lors de l\'analyse des parametres du tri : '."\n";
152
			$e .= implode("\n", $erreurs);
153
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
154
		}
155
	}
156
 
157
	private function initialiserTri() {
158
		$this->tri = isset($this->parametres['tri']) ? $this->parametres['tri'] : $this->tri;
159
		$this->directionTri = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : $this->directionTri;
160
	}
709 gduche 161
	/*-------------------------------------------------------------------------------
162
	 							CONFIGURATION DU SERVICE
163
	 --------------------------------------------------------------------------------*/
164
	/**
165
	 * Configuration du service en fonction du fichier de config config_del.ini
166
	 * */
167
	public function configurer() {
719 gduche 168
		$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
169
		$this->mappingObservation = $this->conteneur->getParametre('mapping_observation');
759 delphine 170
		$this->mappingVotes = $this->conteneur->getParametre('mapping_votes');
709 gduche 171
	}
172
 
173
	/**
710 gduche 174
	 * Vérifier que le service est bien configuré
175
	 * */
176
	public function verifierConfiguration() {
728 gduche 177
 
710 gduche 178
		$erreurs = array();
728 gduche 179
		$tableauImages = $this->conteneur->getParametre('images');
180
		if (empty($tableauImages)) {
710 gduche 181
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;';
182
		} else {
728 gduche 183
			if ($this->conteneur->getParametre('url_service') == null) {
710 gduche 184
				$erreurs[] = '- paramètre "url_service" manquant ;';
185
			}
186
 
728 gduche 187
			if ($this->conteneur->getParametre('url_images') == null) {
710 gduche 188
				$erreurs[] = '- paramètre "url_images" manquant ;';
189
			}
190
 
191
		}
192
 
193
		if (empty($this->mappingObservation)) {
194
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_observation] ou celui-ci est vide ;';
195
		} else {
196
			$champsMappingObs = array('id_observation', 'date_observation', 'date_transmission', 'famille', 'nom_sel', 'nom_sel_nn', 'nt',
197
								'ce_zone_geo', 'lieudit', 'station', 'milieu', 'ce_utilisateur', 'nom', 'prenom');
198
			foreach ($champsMappingObs as $champ) {
199
				if (!isset($this->mappingObservation[$champ])) {
200
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
201
				}
202
			}
203
		}
204
 
205
		if (empty($this->mappingFiltre)) {
206
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_masque] ou celui-ci est vide ;';
207
		} else {
208
			$champsMappingFiltre = array('famille', 'ns', 'nn', 'date', 'tag', 'commune');
209
			foreach ($champsMappingFiltre as $champ) {
210
				if (!isset($this->mappingFiltre[$champ])) {
211
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
212
				}
213
			}
214
		}
215
 
800 aurelien 216
		$tris_possibles = $this->conteneur->getParametre('tris_possibles');
217
		if (empty($tris_possibles)) {
218
			$erreurs[] = '- le fichier de configuration ne contient pas le parametre tris_possibles ou celui-ci est vide ;';
219
		}
220
 
710 gduche 221
		if (!empty($erreurs)) {
222
			$e = 'Erreur lors de la configuration : '."\n";
223
			$e .= implode("\n", $erreurs);
711 gduche 224
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
728 gduche 225
		}
710 gduche 226
	}
227
 
709 gduche 228
 
229
 
230
	/**
231
	 * Obtenir une chaine de caractère concaténant nom et prénom séparé par une virgule
232
	 * @param String $auteurId l'identifiant de l'auteur
233
	 * @return String la chaine de concaténation
234
	 * */
235
	private function getChaineNomPrenom($auteurId) {
236
		$nomPrenom = explode(' ', $auteurId);
719 gduche 237
		$nomPrenom = $this->proteger($nomPrenom);
709 gduche 238
		$chaineNomPrenom = implode(', ', $nomPrenom);
239
		return $chaineNomPrenom;
240
	}
241
 
242
	/**
243
	* Charger la clause WHERE en fonction des paramètres de masque
244
	* */
245
	private function chargerClauseWhere() {
246
		$where = array();
725 gduche 247
		$tableauMasque = $this->masque->getMasque();
248
		if (!empty($tableauMasque)) {
249
			foreach($tableauMasque as $idMasque => $valeurMasque) {
791 aurelien 250
				//TODO: scinder ceci en fonctions réutilisables ?
251
				// voir si c'est interessant par rapport à la recherche générale
725 gduche 252
				$idMasque = str_replace('masque.', '', $idMasque);
253
				switch ($idMasque) {
254
					// nom du masque => nom BDD
255
					case 'auteur' :
791 aurelien 256
						$whereAuteur = ' '.$this->creerFiltreAuteur($this->masque->getMasque('auteur'));
257
						if($whereAuteur != '') {
258
							$where[] = $whereAuteur;
725 gduche 259
						}
260
						break;
791 aurelien 261
					case 'date' :
262
						$whereDate = ' '.$this->creerFiltreDate($valeurMasque);
263
						if($whereDate != '') {
264
							$where[] = $whereDate;
709 gduche 265
						}
725 gduche 266
						break;
791 aurelien 267
					case 'departement' :
268
						$where[] = ' '.$this->creerFiltreIdZoneGeo($valeurMasque);
269
						break;
725 gduche 270
					case 'genre' :
719 gduche 271
						$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger($valeurMasque.' %');
725 gduche 272
						break;
273
					case 'tag' :
791 aurelien 274
						$where[] = ' '.$this->creerFiltreMotsCles($valeurMasque);
725 gduche 275
						break;
775 aurelien 276
					case 'ns' :
791 aurelien 277
						$where[] = ' nom_sel LIKE '.$this->proteger($valeurMasque.'%');
278
						break;
279
					case 'commune' :
280
						$where[] = ' '.$this->mappingFiltre[$idMasque].' LIKE '.$this->proteger(str_replace(array('-',' '), '_', $valeurMasque).'%');
281
					break;
282
					case 'masque' :
283
						$where[] = ' '.$this->creerFiltreMasqueGeneral($valeurMasque);
775 aurelien 284
						break;
725 gduche 285
					default:
286
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->proteger($valeurMasque);
287
					break;
288
				}
289
			}
709 gduche 290
		}
291
 
292
		if (!empty($where)) {
293
			return ' WHERE '.implode('AND', $where);
294
		} else {
295
			return;
296
		}
297
	}
298
 
791 aurelien 299
	private function creerFiltreMasqueGeneral($valeurMasque) {
300
		//TODO: affecter d'aborder les variables, puis les tester pour les
301
		// ajouter à la chaine
302
		$whereAuteur = $this->creerFiltreAuteur($valeurMasque);
303
		$whereIdZoneGeo = $this->creerFiltreIdZoneGeo($valeurMasque);
304
 
305
		$masqueGeneral = '( '.
306
                   	(($whereAuteur != '') ? $whereAuteur.' OR ' : '' ).
307
				   	(($whereIdZoneGeo != '') ? $whereIdZoneGeo.' OR ' : '' ).
308
					'zone_geo LIKE '.$this->proteger($this->remplacerParJokerCaractere($valeurMasque).'%').' OR '.
309
					$this->creerFiltreMotsCles($valeurMasque).' OR '.
310
					'nom_sel LIKE '.$this->proteger($valeurMasque.'%').' OR '.
311
					'famille LIKE '.$this->proteger($valeurMasque.'%').' OR '.
312
					'milieu LIKE '.$this->proteger($valeurMasque).' OR '.
313
					$this->mappingFiltre['ns'].' LIKE '.$this->proteger('%'.$valeurMasque.'% %').' OR '.
314
					$this->creerFiltreDate($valeurMasque).
315
					') ';
316
 
317
		return $masqueGeneral;
318
	}
319
 
320
	private function creerFiltreAuteur($valeurMasque) {
321
		$masque = '';
322
		$auteurId = $valeurMasque;
323
		if (is_numeric($auteurId)) {
324
			$masque = ' ce_utilisateur = '.$auteurId;
325
		} else {
326
			if (strpos($auteurId, '@') === false) {
327
				$tableauNomPrenom = explode(' ',$auteurId, 2);
328
				if(count($tableauNomPrenom) == 2) {
329
					// on teste potentiellement un nom prenom ou bien un prénom nom
330
					$masque = '('.
331
						          	'(nom LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
332
								  	'prenom LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
333
								 	'(nom LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
1274 aurelien 334
								  	'prenom LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
335
									'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
336
									'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
337
									'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
338
									'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') '.
791 aurelien 339
								  ')';
340
				} else {
341
					$masque = '(
342
						            (nom LIKE '.$this->proteger($auteurId.'%').' OR '.
1274 aurelien 343
									'prenom LIKE '.$this->proteger($auteurId.'%').' OR '.
344
									'dob.nom_utilisateur LIKE '.$this->proteger($auteurId.'%').' OR '.
345
									'dob.prenom_utilisateur LIKE '.$this->proteger($auteurId.'%').')'.
791 aurelien 346
								  ')';
347
				}
348
			} else {
1274 aurelien 349
				$masque = " courriel LIKE ".$this->proteger($valeurMasque.'%').
350
				          " OR dob.courriel_utilisateur LIKE ".$this->proteger($valeurMasque.'%')." ";
791 aurelien 351
			}
352
		}
353
		return $masque;
354
	}
355
 
356
	private function remplacerParJokerCaractere($valeurMasque) {
357
		return str_replace(array('-',' '), '_', $valeurMasque);
358
	}
359
	//TODO: déplacer les fonctions ci dessus et dessous dans une classe
360
	// utilitaire
361
	function supprimerAccents($str, $charset='utf-8')
362
	{
363
		$str = htmlentities($str, ENT_NOQUOTES, $charset);
364
 
365
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
366
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
367
		$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
368
 
369
		return $str;
370
	}
371
 
1180 aurelien 372
	private function normaliserMotCle($mot_cle) {
373
		return mb_strtolower($this->supprimerAccents(trim($mot_cle)));
374
	}
375
 
791 aurelien 376
	private function obtenirIdDepartement($nomDpt) {
377
 
378
		$nomDpt = $this->supprimerAccents($nomDpt);
379
		$nomDpt = strtolower(str_replace(' ','-',$nomDpt));
380
 
381
		$idDpt = $this->conteneur->getParametre($nomDpt);
382
		if($idDpt == null || $idDpt == ' ') {
383
			$idDpt = ' ';
384
		}
385
		return $idDpt;
386
	}
387
 
388
	private function creerFiltreIdZoneGeo($valeurMasque) {
389
		$masque = '';
390
		$dept = $valeurMasque;
391
		if (is_numeric($dept)) {
392
			$dept = sprintf('%02s', $dept);
393
			$dept = sprintf("%-'_5s", $dept);
394
			$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept);
395
		} else {
396
			$deptId = $this->conteneur->getParametre($dept);
397
			if ($deptId != null) {
398
				$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$deptId.'%');
399
			} else {
400
				$id = $this->obtenirIdDepartement($valeurMasque);
401
				$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$id.'%');
402
			}
403
		}
404
		return $masque;
405
	}
406
 
407
	private function creerFiltreDate($valeurMasque) {
408
		//TODO: définir dans le fichier de config un tableau contenant plusieurs format de date
409
		// autorisés pour la recherche, qui seraient ajoutés au OR
410
		$masque = '(';
411
		$masque .= (is_numeric($valeurMasque)) ? ' YEAR(date_observation) = '.$this->proteger($valeurMasque).' OR ' : '';
412
		$masque .= " DATE_FORMAT(date_observation, '%d/%m/%Y') = ".$this->proteger($valeurMasque).' '.
413
		           ')';
414
		return $masque;
415
	}
801 aurelien 416
 
791 aurelien 417
	private function creerFiltreMotsCles($valeurMasque) {
800 aurelien 418
 
419
		$mots_cles = explode(' ', $valeurMasque);
812 gduche 420
		$requeteMotsClesImg = array();
421
		$requeteMotsClesObs = array();
1180 aurelien 422
		$requeteMotsClesImgPublic = array();
801 aurelien 423
 
800 aurelien 424
		foreach($mots_cles as $mot_cle) {
1180 aurelien 425
			//TODO: rechercher sur les mots clés normalisés dans tous les cas ?
857 gduche 426
			$requeteMotsCles = $this->proteger('%'.$mot_cle.'%');
1180 aurelien 427
			$motsCleProtege = $this->proteger($this->normaliserMotCle('%'.$mot_cle.'%'));
428
			$requeteMotsClesImgPublic[] = 'di.id_image IN (SELECT ce_image FROM del_image_tag WHERE tag_normalise LIKE '.$motsCleProtege.' AND actif = 1)';
857 gduche 429
			$requeteMotsClesImg[] = 'di.mots_cles_texte LIKE '.$requeteMotsCles;
430
			$requeteMotsClesObs[] = 'dob.mots_cles_texte LIKE '.$requeteMotsCles;
800 aurelien 431
		}
1180 aurelien 432
 
433
		$requeteMotsClesImgPublic = implode(' AND ', $requeteMotsClesImgPublic);
857 gduche 434
		$requeteMotsClesImg = implode(' AND ', $requeteMotsClesImg);
435
		$requeteMotsClesObs = implode(' AND ', $requeteMotsClesObs);
800 aurelien 436
 
437
		$masque = '('.
1180 aurelien 438
					'('.$requeteMotsClesImgPublic.') OR '.
811 aurelien 439
		          	'('.$requeteMotsClesImg.') OR '.
440
		          	'('.$requeteMotsClesObs.') '.
441
		          ')';
800 aurelien 442
 
791 aurelien 443
		return $masque;
444
	}
445
 
709 gduche 446
	/*-------------------------------------------------------------------------------
447
								CHARGEMENT DES IMAGES
448
	--------------------------------------------------------------------------------*/
449
	/**
450
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
451
	* */
452
	private function chargerLiaisons() {
453
 
1025 aurelien 454
		$champs = array('dob.id_observation as id_observation', 'nom_sel', 'nom_sel_nn', 'nt', 'famille', 'ce_zone_geo', 'zone_geo',
455
						'lieudit', 'station', 'milieu', 'date_observation', 'dob.mots_cles_texte as mots_cles_texte', 'dob.commentaire as commentaire',
456
						'di.mots_cles_texte as mots_cles_texte_image ', 'date_transmission', 'di.id_image as id_image', 'di.ce_utilisateur as ce_utilisateur',
1274 aurelien 457
						'prenom', 'nom', 'courriel', 'dob.prenom_utilisateur', 'dob.nom_utilisateur', 'dob.courriel_utilisateur', 'nom_original');
951 aurelien 458
		// Attention le LEFT JOIN est indispensable pour ramener les images n'ayant pas de votes
459
		// en cas de tri par votes
1025 aurelien 460
		$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS '.implode(', ',$champs).' '.
951 aurelien 461
						   ($this->doitJoindreTableVotes() ?
1261 aurelien 462
						   		', IF(dvote.ce_protocole = '.$this->parametres['protocole'].', AVG(dvote.valeur), 0) as total_votes ' :
951 aurelien 463
						   		''
464
						   	).
1168 aurelien 465
							($this->doitJoindreTableTags() ?
466
								// attention le DISTINCT est indispensable !
467
						   		', (COUNT(DISTINCT dtag.id_tag) + '.$this->assemblercomptageOccurencesMotsClesCel().') as total_tags ' :
468
						   		''
469
							).
767 aurelien 470
						   'FROM '.$this->gestionBdd->formaterTable('del_obs_image', 'doi').
709 gduche 471
						   'INNER JOIN del_image di '.
736 gduche 472
						   'ON doi.id_image = di.id_image '.
709 gduche 473
						   'INNER JOIN del_observation dob '.
736 gduche 474
						   'ON doi.id_observation = dob.id_observation '.
1180 aurelien 475
						   'LEFT JOIN del_utilisateur du '.
951 aurelien 476
						   'ON du.id_utilisateur = di.ce_utilisateur '.
1168 aurelien 477
							($this->doitJoindreTableTags() ?
478
						   		'LEFT JOIN del_image_tag dtag '.
479
						   		'ON doi.id_image = dtag.ce_image AND dtag.actif = 1 ' :
480
						   		''
481
							).
951 aurelien 482
							($this->doitJoindreTableVotes() ?
483
						   		'LEFT JOIN del_image_vote dvote '.
484
						   		'ON doi.id_image = dvote.ce_image AND dvote.ce_protocole = '.$this->parametres['protocole'] :
485
						   		''
486
						   	);
709 gduche 487
		$requeteLiaisons .= $this->chargerClauseWhere();
800 aurelien 488
		$requeteLiaisons .= $this->getTri();
725 gduche 489
		$requeteLiaisons .= $this->gestionBdd->getLimitSql();
1180 aurelien 490
 
719 gduche 491
		return $this->bdd->recupererTous($requeteLiaisons);
709 gduche 492
	}
493
 
1312 gduche 494
 
495
	/**
496
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
497
	 * */
498
	private function chargerLiaisonsSimple() {
499
 
500
		// Charger les obs images / images
501
		// récupérer les ids
502
		// récupérer les observations
503
 
1313 gduche 504
		$requeteImages = 'SELECT  *, di.mots_cles_texte as mots_cles_texte_image FROM del_obs_image doi '.
1312 gduche 505
						'INNER JOIN del_image di ON doi.id_image = di.id_image '.
506
						'ORDER BY id_observation DESC'.
507
						$this->gestionBdd->getLimitSql();
508
		$liaisons = $this->bdd->recupererTous($requeteImages);
1313 gduche 509
 
1312 gduche 510
 
1313 gduche 511
		$nbImages = 'SELECT count(id_image) as nb FROM del_obs_image';
512
		$requeteNbImages = $this->bdd->recupererTous($nbImages);
513
 
514
		$total = (int) $requeteNbImages[0]['nb'];
1312 gduche 515
		$this->navigation->setTotal($total);
516
 
517
		$idsObservations = array();
518
		foreach ($liaisons as $image) {
519
			$idObs = $image['id_observation'];
520
			$idsObservations[$idObs] = $idObs;
521
		}
522
 
523
		$requeteObservations = 'SELECT * FROM del_observation dob '.
524
							'LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur '.
525
							'WHERE id_observation IN ('.implode(',', $idsObservations).')';
526
		$resultatsObservations = $this->bdd->recupererTous($requeteObservations);
527
 
528
		$observations = array();
529
		foreach ($resultatsObservations as $id => $observation) {
530
			$idObs = $observation['id_observation'];
531
			$observations[$idObs] = $observation;
532
		}
533
 
534
		foreach ($liaisons as $id => $liaison) {
535
			$idObs = $liaison['id_observation'];
536
 
537
			$observation = $observations[$idObs];
538
			foreach ($observation as $cle => $valeur) {
539
				$liaisons[$id][$cle] = $valeur;
540
			}
541
		}
542
 
543
		return $liaisons;
544
	}
545
 
546
 
1168 aurelien 547
	private function assemblercomptageOccurencesMotsClesCel() {
548
		$chaineMotsClesAffiches = $this->conteneur->getParametre('mots_cles_cel_affiches');
549
		$tabMotsClesAffiches = explode(',',$chaineMotsClesAffiches);
550
		$chaineSql = '';
551
 
552
		// Comptage du nombre de mots clés officiels présents dans la chaine mots clés texte
553
		foreach ($tabMotsClesAffiches as $motCle) {
554
			if($chaineSql != '') {
555
				$chaineSql .= ' + ';
556
			}
557
			$chaineSql .= 'IF(FIND_IN_SET('.$this->proteger($motCle).',di.mots_cles_texte) != 0, 1, 0)';
558
		}
559
 
560
		return '('.$chaineSql.')';
561
	}
562
 
951 aurelien 563
	private function doitJoindreTableVotes() {
564
		return ($this->tri == 'votes');
565
	}
566
 
1168 aurelien 567
	private function doitJoindreTableTags() {
568
		return ($this->tri == 'tags');
569
	}
570
 
800 aurelien 571
	private function getTri() {
572
		$order = '';
951 aurelien 573
		if($this->doitJoindreTableVotes()) {
574
			$order = ' GROUP BY dvote.ce_image, dob.id_observation ORDER BY total_votes '.$this->directionTri.', date_transmission desc ';
1168 aurelien 575
		} else if($this->doitJoindreTableTags()) {
576
			$order = ' GROUP BY doi.id_image ORDER BY total_tags '.$this->directionTri.', date_transmission desc ';
951 aurelien 577
		} else {
800 aurelien 578
			$order = ' ORDER BY '.$this->tri.' '.$this->directionTri.' ';
579
		}
580
		return $order;
581
	}
582
 
709 gduche 583
	/**
584
	* Compter le nombre total d'images dans la base pour affichage dans entete.
585
	* */
586
	private function compterImages() {
587
		$requete = 'SELECT FOUND_ROWS() AS nbre ';
719 gduche 588
		$resultats = $this->bdd->recuperer($requete);
709 gduche 589
		return (int) $resultats['nbre'];
590
	}
591
 
592
	/**
593
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
594
	* @param $liaisons les liaisons de la table del_obs_images
595
	* */
596
	private function chargerImage($liaisons) {
597
 
598
		$images = array();
599
		foreach ($liaisons as $liaison) {
736 gduche 600
			$idImage = $liaison['id_image'];
709 gduche 601
 
1274 aurelien 602
			if($liaison['ce_utilisateur'] == 0) {
603
				$liaison['prenom'] = $liaison['prenom_utilisateur'];
604
				$liaison['nom'] = $liaison['nom_utilisateur'];
605
			}
709 gduche 606
			// On enregistre l'ID de l'image pour n'effectuer qu'une seule requête par la suite
607
			$this->imageIds[] = $idImage;
800 aurelien 608
			$index = $liaison['id_image'].'-'.$liaison['id_observation'];
1025 aurelien 609
			$images[$index] = array('id_image' => $idImage, 'binaire.href' => $this->formaterLienImage($idImage),
610
						'protocoles_votes' => array(),
1017 aurelien 611
						'mots_cles_texte' => $liaison['mots_cles_texte_image'], 'observation' => $this->formaterObservation($liaison));
709 gduche 612
		}
613
		return $images;
614
	}
615
 
616
	/**
617
	* Charger les votes pour chaque image
618
	* */
619
	private function chargerVotes($images) {
760 delphine 620
			$requeteVotes = 'SELECT v.*, p.* FROM '.
621
								$this->gestionBdd->formaterTable('del_image_vote', 'v').
622
								' INNER JOIN del_image_protocole p '.
623
									'ON v.ce_protocole = p.id_protocole '.
775 aurelien 624
									$this->chargerClauseWhereVotes();
719 gduche 625
			$resultatsVotes = $this->bdd->recupererTous($requeteVotes);
709 gduche 626
 
857 gduche 627
 
628
			//TODO : faire une méthode formater vote
709 gduche 629
			$votes = $this->formaterVotes($resultatsVotes);
630
 
631
			foreach ($images as $id => $image) {
632
				if (isset($votes[$image['id_image']])) {
779 aurelien 633
					$images[$id]['protocoles_votes'] = $votes[$image['id_image']];
709 gduche 634
				}
635
			}
636
 
637
		return $images;
638
	}
639
 
759 delphine 640
	private function chargerClauseWhereVotes() {
641
		if (sizeof($this->imageIds) > 0) {
642
			$chaineImageIds = implode(',', $this->imageIds);
760 delphine 643
			$where[] = 'v.ce_image  IN ('.$chaineImageIds.')';
759 delphine 644
		}
645
		if (isset($this->parametres['protocole'])) {
760 delphine 646
			$where[] = 'v.ce_protocole = '.$this->proteger($this->parametres['protocole']);
759 delphine 647
		}
775 aurelien 648
 
649
		$where = (!empty($where)) ? 'WHERE '.implode(' AND ', $where) : '';
650
		return $where;
759 delphine 651
	}
652
 
709 gduche 653
	/*-------------------------------------------------------------------------------
654
								FORMATER ET METTRE EN FORME
655
	--------------------------------------------------------------------------------*/
656
 
657
	/**
658
	*  Formater une observation depuis une ligne liaison
659
	*  @param $liaison liaison issue de la recherche
660
	*  @return $observation l'observation mise en forme
661
	* */
662
	private function formaterObservation($liaison) {
663
		$observation = array();
664
		foreach ($this->mappingObservation as $nomOriginal => $nomFinal) {
665
			$observation[$nomFinal] = $liaison[$nomOriginal];
666
		}
667
 
668
		return $observation;
669
	}
670
 
671
	/**
672
	*  Formater une observation depuis une ligne liaison
673
	*  @param $liaison liaison issue de la recherche
674
	*  @return $observation l'observation mise en forme
675
	* */
676
	private function formaterVotes($votes) {
677
		$retour = array();
678
		foreach ($votes as $vote) {
759 delphine 679
			$retour_vote = array();
680
			foreach ($vote as $param=>$valeur) {
760 delphine 681
				if (strpos($this->mappingVotes[$param], 'protocole.') === 0) {
682
					$retour_protocole[$this->mappingVotes[$param]] = $valeur;
683
				} else {
684
					$retour_vote[$this->mappingVotes[$param]] = $valeur;
685
				}
759 delphine 686
			}
760 delphine 687
			if (!isset($retour[$vote['ce_image']][$vote['ce_protocole']])) {
688
				$retour[$vote['ce_image']][$vote['ce_protocole']] = $retour_protocole;
689
			}
690
			$retour[$vote['ce_image']][$vote['ce_protocole']]['votes'][$vote['id_vote']] = $retour_vote;
709 gduche 691
		}
692
 
693
		return $retour;
694
	}
695
 
696
	/**
697
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
698
	 * */
699
	private function formaterLienImage($idImage) {
700
		$idImage = sprintf('%09s', $idImage);
719 gduche 701
		$url = $this->conteneur->getParametre('url_images');
709 gduche 702
		$urlImage = str_replace('%s', $idImage, $url);
703
		return $urlImage;
704
	}
719 gduche 705
 
706
	private function proteger($valeur) {
707
		if (is_array($valeur)) {
708
			return $this->bdd->protegerTableau($valeur);
709
		} else {
710
			return $this->bdd->proteger($valeur);
709 gduche 711
		}
712
	}
713
}
714
?>