Subversion Repositories eFlore/Applications.del

Rev

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

Rev 726 Rev 737
Line 1... Line 1...
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
	* Le web service image récupère toutes les données de la table del_obs_images
4
	* Le web service observations récupère toutes les observations et, pour chacune d'elle, les
5
 * pour retourner une liste d'images associée à une observation
5
	* images qui lui sont associées.
6
 *
6
 *
7
 * @category	php 5.2
7
 * @category	php 5.2
8
 * @package	del
8
 * @package	del
9
 * @subpackage images
9
 * @subpackage images
10
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@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
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
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=ApiIdentiplante01Observations
16
 */
16
 */
Line 17... Line 17...
17
 
17
 
Line 18... Line -...
18
class Observations {
-
 
19
	
18
class Observations {
20
	private $imageIds = array();
19
	
21
	private $conteneur;
20
	private $conteneur;
-
 
21
	private $navigation;
-
 
22
	private $masque;
Line 22... Line 23...
22
	private $navigation;
23
	private $gestionBdd;
23
	private $masque;
24
	private $bdd;
24
	
25
	
25
	public function __construct(Conteneur $conteneur = null) {
26
	public function __construct(Conteneur $conteneur = null) {
26
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
27
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
-
 
28
		$this->conteneur->chargerConfiguration('config_departements.ini');
-
 
29
		$this->navigation = $conteneur->getNavigation();
27
		$this->bdd = $this->conteneur->getBdd();
30
		$this->masque = $conteneur->getMasque();
Line 28... Line 31...
28
		$this->navigation = $conteneur->getNavigation();
31
		$this->gestionBdd = $conteneur->getGestionBdd();
29
		$this->masque = $conteneur->getMasque();
32
		$this->bdd = $this->gestionBdd->getBdd();
30
	}
33
	}
Line 42... Line 45...
42
		$this->configurer();
45
		$this->configurer();
43
		$this->verifierConfiguration();
46
		$this->verifierConfiguration();
Line 44... Line 47...
44
		
47
		
45
		// Lancement du service
48
		// Lancement du service
46
		$liaisons = $this->chargerLiaisons();
49
		$liaisons = $this->chargerLiaisons();
47
		$total = $this->compterImages();
50
		$total = $this->compterObservations();
48
		$this->navigation->setTotal($total);
51
		$this->navigation->setTotal($total);
49
		$images = $this->chargerImage($liaisons);
52
		$images = $this->chargerObservations($liaisons);
Line 50... Line 53...
50
		$images = $this->chargerVotes($images);
53
		$images = $this->chargerImages($images);
51
		
54
		
52
		// Mettre en forme le résultat et l'envoyer pour affichage
55
		// Mettre en forme le résultat et l'envoyer pour affichage
53
		$resultat = new ResultatService();
56
		$resultat = new ResultatService();
Line 68... Line 71...
68
	
71
	
69
	/**
72
	/**
70
	 * Vérifier que le service est bien configuré 
73
	 * Vérifier que le service est bien configuré 
71
	 * */
74
	 * */
72
	public function verifierConfiguration() {
75
	public function verifierConfiguration() {
73
	/*	
76
	
74
		$erreurs = array();
-
 
-
 
77
		$erreurs = array();
75
		
78
		$tableauImages = $this->conteneur->getParametre('images');
76
		if (empty($this->config)) {
79
		if (empty($tableauImages)) {
77
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;'; 
80
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;'; 
78
		} else {
81
		} else {
79
			if (!isset($this->config['url_service'])) {
82
			if ($this->conteneur->getParametre('url_service') == null) {
80
				$erreurs[] = '- paramètre "url_service" manquant ;';
83
				$erreurs[] = '- paramètre "url_service" manquant ;';
Line 81... Line 84...
81
			}
84
			}
82
			
85
			
83
			if (!isset($this->config['url_images'])) {
86
			if ($this->conteneur->getParametre('url_images') == null) {
Line 84... Line -...
84
				$erreurs[] = '- paramètre "url_images" manquant ;';
-
 
85
			}
-
 
86
			
-
 
87
			if ($this->conteneur->getSchemaBdd() == null) {
87
				$erreurs[] = '- paramètre "url_images" manquant ;';
Line 88... Line 88...
88
				$erreurs[] = '- paramètre "schemaBdd" manquant ;';
88
			}
89
			}
89
			
90
		}
90
		}
91
 
91
 
92
		if (empty($this->mappingObservation)) {
92
		if (empty($this->mappingObservation)) {
-
 
93
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_observation] ou celui-ci est vide ;';
93
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_observation] ou celui-ci est vide ;';
94
		} else {
94
		} else {
95
			$champsMappingObs = array('id_observation', 'date_observation', 'date_transmission', 'famille', 'nom_sel', 'nom_sel_nn', 'nt',
95
			$champsMappingObs = array('id_observation', 'date_observation', 'date_transmission', 'famille', 'nom_sel', 'nom_sel_nn', 'nt',
96
								'ce_zone_geo', 'zone_geo', 'lieudit', 'station', 'courriel', 'ce_utilisateur', 'nom', 'prenom');
96
								'ce_zone_geo', 'lieudit', 'station', 'milieu', 'ce_utilisateur', 'nom', 'prenom');
97
			
97
			foreach ($champsMappingObs as $champ) {
98
			foreach ($champsMappingObs as $champ) {
Line 114... Line 115...
114
		
115
		
115
		if (!empty($erreurs)) {
116
		if (!empty($erreurs)) {
116
			$e = 'Erreur lors de la configuration : '."\n";
117
			$e = 'Erreur lors de la configuration : '."\n";
117
			$e .= implode("\n", $erreurs);
118
			$e .= implode("\n", $erreurs);
118
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
119
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
119
		}*/
120
		}
Line 120... Line 121...
120
	}
121
	}
Line 136... Line 137...
136
	/**
137
	/**
137
	* Charger la clause WHERE en fonction des paramètres de masque
138
	* Charger la clause WHERE en fonction des paramètres de masque
138
	* */
139
	* */
139
	private function chargerClauseWhere() {
140
	private function chargerClauseWhere() {
140
		$where = array();
141
		$where = array();
-
 
142
		$tableauMasque = $this->masque->getMasque();
-
 
143
		// FIXME : Les communes avec une apostrophe (ex: saint michel d'euzet) arrivent dans les paramètres sans l'apostrophe
-
 
144
		if (!empty($tableauMasque)) {
-
 
145
			foreach($tableauMasque as $idMasque => $valeurMasque) {
141
		
146
					
142
		// TODO : vérifier les communes et les communes avec une apostrophe
147
				$idMasque = str_replace('masque.', '', $idMasque);
-
 
148
				switch ($idMasque) {
-
 
149
					// nom du masque => nom BDD
-
 
150
					case 'auteur' :
143
		foreach($this->masque->getMasque() as $idMasque => $valeurMasque) {
151
						$auteurId = $this->masque->getMasque('auteur');
-
 
152
						if (is_numeric($auteurId)) {
-
 
153
							$where[] = ' ce_utilisateur = '.$auteurId;
-
 
154
						} else {
-
 
155
							if (strpos($auteurId, '@') === false) {
-
 
156
								$chaineNomPrenom = $this->getChaineNomPrenom($auteurId);
-
 
157
								$where[] = '((nom IN ('.$chaineNomPrenom.')) OR (prenom IN ('.$chaineNomPrenom.')))';
-
 
158
							} else {
-
 
159
								$where[] = " courriel LIKE ".$this->proteger($this->masque->getMasque('auteur').'%')." ";
-
 
160
							}
-
 
161
						}
-
 
162
						break;
Line 144... Line 163...
144
			
163
			
145
			$idMasque = str_replace('masque.', '', $idMasque);
164
						//TODO : gérer le format de la date ?
146
			switch ($idMasque) {
165
						// rechercher sur LIKE DATE % ?
147
				// nom du masque => nom BDD
166
						// TODO : recherche sur JOUR MOIS ou ANNEE
148
				case 'auteur' :
167
					case 'departement' :
149
					$auteurId = $this->masque->getMasque('auteur');
168
						$dept = $valeurMasque;
150
					if (is_numeric($auteurId)) {
-
 
151
						$where[] = ' ce_utilisateur = '.$auteurId;
-
 
152
					} else {
-
 
153
						if (strpos($auteurId, '@') === false) {
-
 
154
							$chaineNomPrenom = $this->getChaineNomPrenom($auteurId);
169
						if (is_numeric($dept)) {
155
							$where[] = '((nom IN ('.$chaineNomPrenom.')) OR (prenom IN ('.$chaineNomPrenom.')))';
170
							$where[] = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept.'%');
-
 
171
						} else {
-
 
172
							
-
 
173
							//FIXME : et les apostrophes dans les départements ?
-
 
174
							
-
 
175
							$deptId = $this->conteneur->getParametre($dept);
156
						} else {
176
							if ($deptId != null) {
-
 
177
								$where[] = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$deptId.'%');
157
							$where[] = " courriel LIKE ".$this->proteger($this->masque->getMasque('auteur').'%')." ";
178
							}
158
						}
-
 
159
					}
179
						}
160
				break;
-
 
161
				
-
 
162
				//TODO : gérer le format de la date ?
-
 
163
				// rechercher sur LIKE DATE % ?
-
 
164
				// TODO : recherche sur JOUR MOIS ou ANNEE
-
 
165
				case 'departement' :
-
 
166
					$dept = $valeurMasque;
-
 
167
					if (is_numeric($dept)) {
-
 
168
						$where[] = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept.'%');
-
 
169
					} else {
-
 
170
						//TODO : que faire si le département n'est pas numérique ?
-
 
171
						// TODO : modifier le modèle pour intégrer les zones geos !
-
 
172
					}
-
 
173
				break;
180
						break;
174
				case 'genre' :
181
					case 'genre' :
175
						$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger($valeurMasque.' %');
182
						$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger($valeurMasque.' %');
176
				break;
183
						break;
177
				case 'tag' :
184
					case 'tag' :
178
					$where[] = " di.mots_cles_texte LIKE ".$this->proteger($valeurMasque);
185
						$where[] = " di.mots_cles_texte LIKE ".$this->proteger($valeurMasque);
179
				break;
186
						break;
180
				default:
187
					default:
181
					$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->proteger($valeurMasque);
188
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->proteger($valeurMasque);
-
 
189
					break;
182
				break;
190
				}
183
			}
191
			}	
Line 184... Line -...
184
		}
-
 
185
		
192
		}
186
		
193
		
187
		if (!empty($where)) {
194
		if (!empty($where)) {
188
			return ' WHERE '.implode('AND', $where);
195
			return ' WHERE '.implode('AND', $where);
189
		} else {
196
		} else {
Line 198... Line 205...
198
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
205
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
199
	* */
206
	* */
200
	private function chargerLiaisons() {
207
	private function chargerLiaisons() {
Line 201... Line 208...
201
	
208
	
202
		$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS * '.
209
		$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS * '.
203
						   'FROM '.$this->conteneur->getSchemaBdd().'.del_obs_images doi '.
-
 
204
						   'INNER JOIN del_image di '.
-
 
205
						   'ON doi.ce_image = di.id_image '.
210
						   'FROM '.$this->gestionBdd->formaterTable('del_observation', 'dob').
206
						   'INNER JOIN del_observation dob '.
211
						   'INNER JOIN '.$this->gestionBdd->formaterTable('del_obs_images', 'doi').
207
						   'ON doi.ce_observation = dob.id_observation '.
212
						   'ON doi.id_observation = dob.id_observation '.
208
						   'INNER JOIN del_utilisateur du '.
213
						   'INNER JOIN del_utilisateur du '.
209
						   'ON du.id_utilisateur = doi.ce_utilisateur';
214
						   'ON du.id_utilisateur = doi.id_utilisateur ';
-
 
215
		$requeteLiaisons .= $this->chargerClauseWhere();
-
 
216
		$requeteLiaisons .=  ' GROUP BY doi.id_observation';
210
		$requeteLiaisons .= $this->chargerClauseWhere();
217
		$requeteLiaisons .= ' ORDER BY date_transmission DESC ';
-
 
218
		$requeteLiaisons .= $this->gestionBdd->getLimitSql();
-
 
219
		
211
		$requeteLiaisons .= $this->conteneur->getLimitSql();
220
		echo var_dump($requeteLiaisons);
212
		return $this->bdd->recupererTous($requeteLiaisons);
221
		return $this->bdd->recupererTous($requeteLiaisons);
Line 213... Line 222...
213
	}
222
	}
214
	
223
	
215
	/**
224
	/**
216
	* Compter le nombre total d'images dans la base pour affichage dans entete.
225
	* Compter le nombre total d'images dans la base pour affichage dans entete.
217
	* */
226
	* */
218
	private function compterImages() {
227
	private function compterObservations() {
219
		$requete = 'SELECT FOUND_ROWS() AS nbre ';
228
		$requete = 'SELECT FOUND_ROWS() AS nbre ';
220
		$resultats = $this->bdd->recuperer($requete);
229
		$resultats = $this->bdd->recuperer($requete);
Line 221... Line 230...
221
		return (int) $resultats['nbre'];
230
		return (int) $resultats['nbre'];
222
	}
231
	}
223
	
232
	
224
	/**
233
	/**
225
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
234
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
Line 226... Line 235...
226
	* @param $liaisons les liaisons de la table del_obs_images
235
	* @param $liaisons les liaisons de la table del_obs_images
227
	* */
236
	* */
228
	private function chargerImage($liaisons) {
237
	private function chargerObservations($liaisons) {
229
	
-
 
230
		$images = array();
-
 
231
		foreach ($liaisons as $liaison) {
-
 
Line -... Line 238...
-
 
238
	
232
			$idImage = $liaison['ce_image'];
239
		$observations = array();
-
 
240
		foreach ($liaisons as $liaison) {
-
 
241
			$idObs = $liaison[$this->mappingObservation['id_observation']];
-
 
242
			
233
			
243
			$observation = array();
234
			// On enregistre l'ID de l'image pour n'effectuer qu'une seule requête par la suite
244
			foreach ($this->mappingObservation as $id => $champ) {
235
			$this->imageIds[] = $idImage;
245
				$observation[$champ] = $liaison[$id];
236
			
246
			}
Line 237... Line 247...
237
			$images[$idImage] = array('id_image' => $idImage, 'date' => $liaison['date_prise_de_vue'], 'binaire.href' => $this->formaterLienImage($idImage),
247
			$observation['images'] = array();
238
						'hauteur' => $liaison['hauteur'], 'largeur' => $liaison['largeur'], 'votes' => array(), 'observation' => $this->formaterObservation($liaison));
248
			$observations[$idObs] = $observation;
-
 
249
		}
239
		}
250
		return $observations;
240
		return $images;
251
	}
Line 241... Line -...
241
	}
-
 
242
	
252
	
Line 243... Line 253...
243
	/**
253
	/**
244
	* Charger les votes pour chaque image
254
	 * Sélectionner toutes les images de chaque observation
245
	* */
255
	 * @param array $observations la liste des observations 
246
	private function chargerVotes($images) {
256
	 * */
Line 247... Line -...
247
		
-
 
248
		if (sizeof($this->imageIds) > 0) {
257
	public function chargerImages($observations) {
249
			$chaineImageIds = implode(',', $this->imageIds);
258
		
250
			
-
 
251
			$requeteVotes = 'SELECT * FROM '.
259
		foreach ($observations as $id => $observation) {
252
			                $this->conteneur->getSchemaBdd().'.del_vote_image '.
-
 
253
			                'WHERE ce_image IN ('.$chaineImageIds.')';
-
 
254
			$resultatsVotes = $this->bdd->recupererTous($requeteVotes);
-
 
255
			
-
 
256
			
260
			
Line 257... Line 261...
257
			//TODO : faire une méthode formater vote
261
			$requeteImages = 'SELECT * FROM '. $this->gestionBdd->formaterTable('del_obs_images', 'doi').
258
			$votes = $this->formaterVotes($resultatsVotes);
262
							 'INNER JOIN '.$this->gestionBdd->formaterTable('del_image', 'di').
Line -... Line 263...
-
 
263
							 'ON doi.id_image = di.id_image '.
-
 
264
							 'WHERE doi.id_observation = '.$observation['id_observation'];
259
	
265
			
260
			foreach ($images as $id => $image) {
266
			$images = $this->bdd->recupererTous($requeteImages);
261
				if (isset($votes[$image['id_image']])) {
267
			$images = $this->formaterImages($images);
Line 262... Line 268...
262
					$images[$id]['votes'] = $votes[$image['id_image']];
268
			$observations[$id]['images'] = $images;
-
 
269
		}
-
 
270
		
-
 
271
		return $observations;
-
 
272
	}
-
 
273
	
-
 
274
	
-
 
275
	
-
 
276
	/*-------------------------------------------------------------------------------
-
 
277
								FORMATER ET METTRE EN FORME
-
 
278
	--------------------------------------------------------------------------------*/
-
 
279
	
-
 
280
	/**
-
 
281
	 * Formater les images d'une observation
-
 
282
	 * @param array $images les images de l'observation
-
 
283
	 * */
-
 
284
	private function formaterImages($images) {
-
 
285
		$imagesRetour = array();
-
 
286
		foreach ($images as $image) {
-
 
287
			$imageCourante = array();
-
 
288
			$imageCourante['id_image'] = $image['id_image'];
-
 
289
			$imageCourante['date'] = $image['date_prise_de_vue'];
-
 
290
			// TODO : c'est dans la définition mais pas dans la table ! 
263
				}
291
			//$imageRetour['mime']
264
			}
292
			$imageCourante['binaire.href'] = $this->formaterLienImage($image['id_image']);
265
		}
293
			$imageCourante['hauteur'] = $image['hauteur'];
266
		
294
			$imageRetour['largeur'] = $image['largeur'];
267
		return $images;
295