Subversion Repositories eFlore/Applications.del

Rev

Rev 711 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 711 Rev 719
Line 13... Line 13...
13
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
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 $
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
15
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
16
 */
16
 */
Line 17... Line -...
17
 
-
 
18
// TODO : voir conteneur, n'étendra plus rien, le conteneur viendra du constructeur 
17
 
Line 19... Line -...
19
class Images extends Commun {
-
 
20
	
-
 
21
	private $config;
-
 
22
	private $schemaBdd;
-
 
23
	private $depart = 0;
-
 
24
	private $limite = 10;
-
 
25
	private $total; // Le nombre total d'images
-
 
26
	private $masque = array(); //Enregistrer les paramètres du masque
18
class Images {
27
	private $masquesPossibles = array('famille', 'genre', 'ns', 'nn', 'auteur', 'date', 'commune', 'departement', 'tag');
-
 
28
	private $imageIds = array();
19
	
29
	private $UrlNavigation;
-
 
Line -... Line 20...
-
 
20
	private $imageIds = array();
-
 
21
	private $conteneur;
-
 
22
	
-
 
23
	
-
 
24
	public function __construct(Conteneur $conteneur = null) {
30
	private $mappingFiltre;
25
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
31
	private $mappingObservation;
26
		$this->bdd = $this->conteneur->getBdd();
32
	
27
	}
33
	
28
	
34
	/**
29
	/**
Line 41... Line 36...
41
	public function consulter($ressources, $parametres) {
36
	public function consulter($ressources, $parametres) {
Line 42... Line 37...
42
		
37
		
43
		// Gestion des configuration du script
38
		// Gestion des configuration du script
44
		$this->configurer();
39
		$this->configurer();
45
		$this->verifierConfiguration();
-
 
46
		$this->schemaBdd = $this->config['schemaBdd'];
-
 
47
		$this->UrlNavigation = new Url($this->config['url_service']);
-
 
48
		$this->UrlNavigation->setOption(Url::OPTION_ENCODER_VALEURS, true);
-
 
Line 49... Line 40...
49
		$this->chargerParametres($parametres);
40
		$this->verifierConfiguration();
50
		
41
		
51
		// Lancement du service
42
		// Lancement du service
-
 
43
		$liaisons = $this->chargerLiaisons();
52
		$liaisons = $this->chargerLiaisons();
44
		$total = $this->compterImages();
53
		$this->total = $this->compterImages();
-
 
54
		$images = $this->chargerImage($liaisons);
45
		$this->conteneur->setTotal($total);
Line 55... Line 46...
55
		
46
		$images = $this->chargerImage($liaisons);
56
		$images = $this->chargerVotes($images);
47
		$images = $this->chargerVotes($images);
57
		
48
		
58
		// Mettre en forme le résultat et l'envoyer pour affichage
49
		// Mettre en forme le résultat et l'envoyer pour affichage
59
		$resultat = new ResultatService();
50
		$resultat = new ResultatService();
Line 60... Line 51...
60
		$resultat->corps = array('entete' => $this->getEntete(), 'resultats' => $images);
51
		$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
61
		return $resultat;
52
		return $resultat;
62
	}
53
	}
63
	
54
	
64
	/*-------------------------------------------------------------------------------
55
	/*-------------------------------------------------------------------------------
65
	 							CONFIGURATION DU SERVICE
56
	 							CONFIGURATION DU SERVICE
66
	 --------------------------------------------------------------------------------*/
57
	 --------------------------------------------------------------------------------*/
67
	/**
-
 
68
	 * Configuration du service en fonction du fichier de config config_del.ini
58
	/**
69
	 * */
59
	 * Configuration du service en fonction du fichier de config config_del.ini
70
	public function configurer() {
60
	 * */
Line 71... Line 61...
71
		$this->config = Config::get('images');
61
	public function configurer() {
72
		$this->mappingFiltre = Config::get('mapping_masque');
62
		$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
73
		$this->mappingObservation = Config::get('mapping_observation');
63
		$this->mappingObservation = $this->conteneur->getParametre('mapping_observation');
74
	}
64
	}
75
	
65
	
76
	/**
66
	/**
Line 77... Line 67...
77
	 * Vérifier que le service est bien configuré 
67
	 * Vérifier que le service est bien configuré 
78
	 * */
68
	 * */
79
	public function verifierConfiguration() {
69
	public function verifierConfiguration() {
Line 89... Line 79...
89
			
79
			
90
			if (!isset($this->config['url_images'])) {
80
			if (!isset($this->config['url_images'])) {
91
				$erreurs[] = '- paramètre "url_images" manquant ;';
81
				$erreurs[] = '- paramètre "url_images" manquant ;';
Line 92... Line 82...
92
			}
82
			}
93
			
83
			
94
			if (!isset($this->config['schemaBdd'])) {
84
			if ($this->conteneur->getSchemaBdd() == null) {
95
				$erreurs[] = '- paramètre "schemaBdd" manquant ;';
85
				$erreurs[] = '- paramètre "schemaBdd" manquant ;';
Line 96... Line 86...
96
			}
86
			}
Line 121... Line 111...
121
		
111
		
122
		if (!empty($erreurs)) {
112
		if (!empty($erreurs)) {
123
			$e = 'Erreur lors de la configuration : '."\n";
113
			$e = 'Erreur lors de la configuration : '."\n";
124
			$e .= implode("\n", $erreurs);
114
			$e .= implode("\n", $erreurs);
125
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
115
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
126
		}
116
		}*/
Line 127... Line -...
127
	}
-
 
128
	
-
 
129
	/**
-
 
130
	 * Gestion des paramètres de l'application pour stockage dans variable de classe
-
 
131
	 * @param array $parametres les paramètres tels que passés à la méthode consulter
-
 
132
	 * */
-
 
133
	public function chargerParametres($parametres) {
-
 
134
		$this->parametres = $parametres;
-
 
135
		
-
 
136
		if (isset($this->parametres['navigation.depart'])) {
-
 
137
			$this->depart = $this->parametres['navigation.depart'];			
-
 
138
		} 
-
 
139
		
-
 
140
		if (isset($this->parametres['navigation.limite'])) {
-
 
141
			$this->limite = $this->parametres['navigation.limite'];
-
 
142
		}
-
 
143
		
-
 
144
		foreach ($parametres as $id => $parametre) {
-
 
145
			if (strpos($id, 'masque.') === 0) {
-
 
146
				$champ = substr($id, 7, strlen($id));
-
 
147
				if (isset($masquesPossibles[$champ])) {	
-
 
148
					$this->masque[$champ] = $parametre;
-
 
149
				}
-
 
150
			}
-
 
Line 151... Line -...
151
		}
-
 
152
	}
-
 
153
	
-
 
154
	/**
-
 
155
	* Créer la chaine de limite de requête en fonction des paramètres donnés
-
 
156
	* */
-
 
Line 157... Line 117...
157
	private function getLimite() {
117
	}
158
		return ' LIMIT '.$this->depart.', '.$this->limite;
118
	
159
	}
119
	
160
	
120
	
161
	/**
121
	/**
162
	 * Obtenir une chaine de caractère concaténant nom et prénom séparé par une virgule
122
	 * Obtenir une chaine de caractère concaténant nom et prénom séparé par une virgule
163
	 * @param String $auteurId l'identifiant de l'auteur
123
	 * @param String $auteurId l'identifiant de l'auteur
164
	 * @return String la chaine de concaténation
124
	 * @return String la chaine de concaténation
165
	 * */
125
	 * */
166
	private function getChaineNomPrenom($auteurId) {
126
	private function getChaineNomPrenom($auteurId) {
167
		$nomPrenom = explode(' ', $auteurId);
127
		$nomPrenom = explode(' ', $auteurId);
Line 168... Line 128...
168
		$nomPrenom = $this->getBdd()->protegerTableau($nomPrenom);
128
		$nomPrenom = $this->proteger($nomPrenom);
Line 175... Line 135...
175
	* */
135
	* */
176
	private function chargerClauseWhere() {
136
	private function chargerClauseWhere() {
177
		$where = array();
137
		$where = array();
Line 178... Line 138...
178
		
138
		
179
		// TODO : vérifier les communes et les communes avec une apostrophe
139
		// TODO : vérifier les communes et les communes avec une apostrophe
180
		foreach($this->masque as $idMasque => $valeurMasque) {
140
		foreach($this->conteneur->getMasque() as $idMasque => $valeurMasque) {
-
 
141
			
181
				
142
			$idMasque = str_replace('masque.', '', $idMasque);
182
			switch ($idMasque) {
143
			switch ($idMasque) {
183
				// nom du masque => nom BDD
144
				// nom du masque => nom BDD
184
				case 'auteur' :
145
				case 'auteur' :
185
					$auteurId = $this->masque['auteur'];
146
					$auteurId = $this->conteneur->getMasque('auteur');
186
					if (is_numeric($auteurId)) {
147
					if (is_numeric($auteurId)) {
187
						$where[] = " ce_utilisateur = ".$this->masque['auteur'];
148
						$where[] = ' ce_utilisateur = '.$auteurId;
188
					} else {
149
					} else {
189
						if (strpos($auteurId, '@') === false) {
150
						if (strpos($auteurId, '@') === false) {
190
							$chaineNomPrenom = $this->getChaineNomPrenom($auteurId);
151
							$chaineNomPrenom = $this->getChaineNomPrenom($auteurId);
191
							$where[] = '((nom IN ('.$chaineNomPrenom.')) OR (prenom IN ('.$chaineNomPrenom.')))';
152
							$where[] = '((nom IN ('.$chaineNomPrenom.')) OR (prenom IN ('.$chaineNomPrenom.')))';
192
						} else {
153
						} else {
193
							$where[] = " courriel LIKE ".$this->getBdd()->proteger($this->masque['auteur'].'%')." ";
154
							$where[] = " courriel LIKE ".$this->proteger($this->conteneur->getMasque('auteur').'%')." ";
194
						}
155
						}
195
					}
156
					}
Line 196... Line 157...
196
				break;
157
				break;
197
				
158
				
198
				//TODO : gérer le format de la date ?
159
				//TODO : gérer le format de la date ?
199
				// rechercher sur LIKE DATE % ?
160
				// rechercher sur LIKE DATE % ?
200
				// TODO : recherche sur JOUR MOIS ou ANNEE
161
				// TODO : recherche sur JOUR MOIS ou ANNEE
201
				case 'departement' :
162
				case 'departement' :
202
					$dept = $this->masque['departement'];
163
					$dept = $valeurMasque;
203
					if (is_numeric($dept)) {
164
					if (is_numeric($dept)) {
204
						$where[] = " ce_zone_geo LIKE ".$this->getBdd()->proteger('INSEE-C:'.$this->masque['departement'].'%');
165
						$where[] = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept.'%');
205
					} else {
166
					} else {
206
						//TODO : que faire si le département n'est pas numérique ?
167
						//TODO : que faire si le département n'est pas numérique ?
207
						// TODO : modifier le modèle pour intégrer les zones geos !
168
						// TODO : modifier le modèle pour intégrer les zones geos !
208
					}
169
					}
209
				break;
170
				break;
210
				case 'genre' :
171
				case 'genre' :
211
						$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->getBdd()->proteger($valeurMasque.' %');
172
						$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger($valeurMasque.' %');
212
				break;
173
				break;
213
				case 'tag' :
174
				case 'tag' :
214
					$where[] = " di.mots_cles_texte LIKE ".$this->getBdd()->proteger($valeurMasque);
175
					$where[] = " di.mots_cles_texte LIKE ".$this->proteger($valeurMasque);
215
				break;
176
				break;
216
				default:
177
				default:
217
					$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->getBdd()->proteger($valeurMasque);
178
					$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->proteger($valeurMasque);
218
				break;
179
				break;
Line 234... Line 195...
234
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
195
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
235
	* */
196
	* */
236
	private function chargerLiaisons() {
197
	private function chargerLiaisons() {
Line 237... Line 198...
237
	
198
	
238
		$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS * '.
199
		$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS * '.
239
						   'FROM '.$this->schemaBdd.'.del_obs_images doi '.
200
						   'FROM '.$this->conteneur->getSchemaBdd().'.del_obs_images doi '.
240
						   'INNER JOIN del_image di '.
201
						   'INNER JOIN del_image di '.
241
						   'ON doi.ce_image = di.id_image '.
202
						   'ON doi.ce_image = di.id_image '.
242
						   'INNER JOIN del_observation dob '.
203
						   'INNER JOIN del_observation dob '.
243
						   'ON doi.ce_observation = dob.id_observation '.
204
						   'ON doi.ce_observation = dob.id_observation '.
244
						   'INNER JOIN del_utilisateur du '.
205
						   'INNER JOIN del_utilisateur du '.
245
						   'ON du.id_utilisateur = doi.ce_utilisateur';
206
						   'ON du.id_utilisateur = doi.ce_utilisateur';
246
		$requeteLiaisons .= $this->chargerClauseWhere();
207
		$requeteLiaisons .= $this->chargerClauseWhere();
247
		$requeteLiaisons .= $this->getLimite();
208
		$requeteLiaisons .= $this->conteneur->getLimitSql();
248
		return $this->getBdd()->recupererTous($requeteLiaisons);
209
		return $this->bdd->recupererTous($requeteLiaisons);
Line 249... Line 210...
249
	}
210
	}
250
	
211
	
251
	/**
212
	/**
252
	* Compter le nombre total d'images dans la base pour affichage dans entete.
213
	* Compter le nombre total d'images dans la base pour affichage dans entete.
253
	* */
214
	* */
254
	private function compterImages() {
215
	private function compterImages() {
255
		$requete = 'SELECT FOUND_ROWS() AS nbre ';
216
		$requete = 'SELECT FOUND_ROWS() AS nbre ';
256
		$resultats = $this->getBdd()->recuperer($requete);
217
		$resultats = $this->bdd->recuperer($requete);
Line 257... Line 218...
257
		return (int) $resultats['nbre'];
218
		return (int) $resultats['nbre'];
258
	}
219
	}
Line 283... Line 244...
283
		
244
		
284
		if (sizeof($this->imageIds) > 0) {
245
		if (sizeof($this->imageIds) > 0) {
Line 285... Line 246...
285
			$chaineImageIds = implode(',', $this->imageIds);
246
			$chaineImageIds = implode(',', $this->imageIds);
286
			
247
			
287
			$requeteVotes = 'SELECT * FROM '.
248
			$requeteVotes = 'SELECT * FROM '.
288
			                $this->schemaBdd.'.del_vote_image '.
249
			                $this->conteneur->getSchemaBdd().'.del_vote_image '.
Line 289... Line 250...
289
			                'WHERE ce_image IN ('.$chaineImageIds.')';
250
			                'WHERE ce_image IN ('.$chaineImageIds.')';
290
			$resultatsVotes = $this->getBdd()->recupererTous($requeteVotes);
251
			$resultatsVotes = $this->bdd->recupererTous($requeteVotes);
Line 305... Line 266...
305
	
266
	
306
	/*-------------------------------------------------------------------------------
267
	/*-------------------------------------------------------------------------------
307
								FORMATER ET METTRE EN FORME
268
								FORMATER ET METTRE EN FORME
Line 308... Line -...
308
	--------------------------------------------------------------------------------*/
-
 
309
	
-
 
310
	//TODO : gérer les paramètres par défaut au cas où ça ne soit pas 
-
 
311
	/*
-
 
312
	 * array(
-
 
313
					'id_observation' => 'id_observation',
-
 
314
					'date_observation' => 'date_observation',
-
 
315
					'date_transmission' => 'date_transmission', 
-
 
316
					'famille' => 'determination.famille',
-
 
317
					'nom_sel' => 'determination.ns',
-
 
318
					'nom_sel_nn' => 'determination.nn',
-
 
319
					'nt' => 'determination.nt',
-
 
320
					'ce_zone_geo' => 'id_zone_geo',
-
 
321
					'zone_geo' => 'zone_geo',
-
 
322
					'lieudit' => 'lieudit',
-
 
323
					'station' => 'station',
-
 
324
					'milieu' => 'milieu',
-
 
325
					'ce_utilisateur' => 'auteur.id',
-
 
326
					'nom' => 'auteur.nom',
-
 
327
					'prenom' => 'auteur.prenom' 
-
 
328
					);
269
	--------------------------------------------------------------------------------*/
329
	 */
270
	
330
	/**
271
	/**
331
	*  Formater une observation depuis une ligne liaison
272
	*  Formater une observation depuis une ligne liaison
332
	*  @param $liaison liaison issue de la recherche
273
	*  @param $liaison liaison issue de la recherche
Line 365... Line 306...
365
		
306
		
366
		return $retour;
307
		return $retour;
Line 367... Line 308...
367
	}
308
	}
368
	
-
 
369
	/**
-
 
370
	 * Créer l'entête en fonction des paramètres donnés
-
 
371
	 * */
-
 
372
	private function getEntete() {
-
 
373
		$entete = array();
-
 
374
		$entete['masque'] = $this->recupererMasque();
-
 
375
		$entete['depart'] = $this->depart;
-
 
376
		$entete['limite'] = $this->limite;
-
 
377
		$entete['total'] = $this->total;
-
 
378
		$lienPrecedent = $this->recupererHrefPrecedent();
-
 
379
		
-
 
380
		if ($lienPrecedent != null) { 
-
 
381
			$entete['entete.precedent'] = $lienPrecedent; 
-
 
382
		} 
-
 
383
		
-
 
384
		$lienSuivant = $this->recupererHrefSuivant();
-
 
385
		if ($lienSuivant) {
-
 
386
			$entete['entete.suivant'] = $lienSuivant; 
-
 
387
		}
-
 
388
		return $entete;
-
 
389
	}
-
 
390
	
-
 
391
	/**
-
 
392
	 * Récupérer le lien pour afficher les images précédentes en fonction des paramètres 
-
 
393
	 * */
-
 
394
	private function recupererHrefPrecedent() {
-
 
395
		$departActuel = $this->depart;
-
 
396
		$limite = $this->limite;
-
 
397
		$departSuivant = $departActuel - $limite;
-
 
398
	
-
 
399
		$url = null;
-
 
400
		
-
 
401
		if ($departActuel > 0) {
-
 
402
			$url = $this->obtenirUrlNavigation($departSuivant, $limite, $this->parametres);
-
 
403
		}
-
 
404
		return $url;
-
 
405
	}
-
 
406
	
-
 
407
	/**
-
 
408
	* Récupérer le lien pour afficher les images suivantes en fonction des paramètres
-
 
409
	* */
-
 
410
	private function recupererHrefSuivant() {
-
 
411
		$departActuel = $this->depart;
-
 
412
		$limite = $this->limite;
-
 
413
		$departSuivant = $departActuel + $limite;
-
 
414
		
-
 
415
	
-
 
416
		$url = null;
-
 
417
		if ($departSuivant < $this->total) {
-
 
418
			$url = $this->obtenirUrlNavigation($departSuivant, $limite, $this->parametres);
-
 
419
		}
-
 
420
		return $url;
-
 
421
	}
-
 
422
	
-
 
423
	/**
-
 
424
	* Récupérer l'url de navigation en concaténant d'éventuels paramètres
-
 
425
	* @param $depart l'entier de départ de la recherche
-
 
426
	* @param $limite le nombre de résultats à retourner
-
 
427
	* @param $parametresAdditionnels le tableau contenant les parametres => valeurs additionnels
-
 
428
	* */
-
 
429
	private function obtenirUrlNavigation($depart, $limite, $parametresAdditionnels) {
-
 
430
	
-
 
431
		$parametres = array('navigation.depart' => $depart, 'navigation.limite' => $limite);
-
 
432
	
-
 
433
		if ($parametresAdditionnels != null) {
-
 
434
			unset($parametresAdditionnels['navigation.depart']);
-
 
435
			unset($parametresAdditionnels['navigation.limite']);
-
 
436
			$parametres = array_merge($parametres, $parametresAdditionnels);
-
 
437
		}
-
 
438
	
-
 
439
		$this->UrlNavigation->setRequete($parametres);
-
 
440
		$url = $this->UrlNavigation->getURL();
-
 
441
		return $url;
-
 
442
	}
-
 
443
	
309
	
444
	/**
310
	/**
445
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
311
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
446
	 * */
312
	 * */
447
	private function formaterLienImage($idImage) {
313
	private function formaterLienImage($idImage) {
448
		$idImage = sprintf('%09s', $idImage);
314
		$idImage = sprintf('%09s', $idImage);
449
		$url = $this->config['url_images'];
315
		$url = $this->conteneur->getParametre('url_images');
450
		$urlImage = str_replace('%s', $idImage, $url);
316
		$urlImage = str_replace('%s', $idImage, $url);
451
		return $urlImage;
317
		return $urlImage;
452
	}
-
 
453
 
-
 
454
	/**
-
 
455
	 * Récupérer le masque depuis les paramètres
318
	}
456
	 * */
319
	
457
	private function recupererMasque() {
320
	private function proteger($valeur) {
458
		$masqueEntete = '';
321
		if (is_array($valeur)) {
459
		foreach ($this->parametres as $param => $cle) {
322
			return $this->bdd->protegerTableau($valeur);
460
			if ($param == 'masque') {
-
 
461
				$masqueEntete = 'masque='.$cle.',';
-
 
462
			} elseif (substr($param, 0, 7) == 'masque.') {
-
 
463
				$masqueEntete .= substr($param, 7).'='.$cle.',';
323
		} else {
464
			}
-
 
465
		}
-
 
466
		$masqueEntete = rtrim($masqueEntete,',');
324
			return $this->bdd->proteger($valeur);
467
		return $masqueEntete;
325
		}
468
	}
326
	}
469
}
327
}