Subversion Repositories eFlore/Applications.del

Rev

Rev 772 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 772 Rev 787
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
	* Le web service observations récupère toutes les observations et, pour chacune d'elle, les
4
	* Le web service observations récupère toutes les observations et, pour chacune d'elle, les
5
	* images qui lui sont associées.
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=ApiIdentiplante01Observations
15
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Observations
16
 */
16
 */
17
 
17
 
18
// http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire
18
// http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire
19
class Observation {
19
class Observation {
20
	
20
	
21
	private $conteneur;
21
	private $conteneur;
22
	private $gestionBdd;
22
	private $gestionBdd;
23
	private $bdd;
23
	private $bdd;
24
	private $id_observation;
24
	private $id_observation;
25
	
25
	
26
	public function __construct(Conteneur $conteneur = null) {
26
	public function __construct(Conteneur $conteneur = null) {
27
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
27
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
-
 
28
		$this->conteneur->chargerConfiguration('config_votes.ini');
28
		$this->gestionBdd = $conteneur->getGestionBdd();
29
		$this->gestionBdd = $conteneur->getGestionBdd();
29
		$this->bdd = $this->gestionBdd->getBdd();
30
		$this->bdd = $this->gestionBdd->getBdd();
30
	}
31
	}
31
	
32
	
32
	/**
33
	/**
33
	 * Méthode principale de la classe.
34
	 * Méthode principale de la classe.
34
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService 
35
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService 
35
	 * pour l'afficher.
36
	 * pour l'afficher.
36
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
37
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
37
	 * @param array $parametres les paramètres situés après le ? dans l'url
38
	 * @param array $parametres les paramètres situés après le ? dans l'url
38
	 * */
39
	 * */
39
	public function consulter($ressources, $parametres) {
40
	public function consulter($ressources, $parametres) {
40
		
41
		
41
		// Gestion des configuration du script
42
		// Gestion des configuration du script
42
		$this->configurer($ressources);
43
		$this->configurer($ressources);
43
		$this->verifierConfiguration();
44
		$this->verifierConfiguration();
44
		
45
		
45
		
46
		
46
		// Lancement du service
47
		// Lancement du service
47
		$liaisons = $this->chargerLiaisons();
48
		$liaisons = $this->chargerLiaisons();
48
		$observation = $this->chargerObservation($liaisons);
49
		$observation = $this->chargerObservation($liaisons);
49
		$observation = $this->chargerImages($observation);
50
		$observation = $this->chargerImages($observation);
50
		$observation = $this->chargerCommentaires($observation);
51
		$observation = $this->chargerCommentaires($observation);
51
		
52
		
52
		// Mettre en forme le résultat et l'envoyer pour affichage
53
		// Mettre en forme le résultat et l'envoyer pour affichage
53
		$resultat = new ResultatService();
54
		$resultat = new ResultatService();
54
		$resultat->corps = $observation;
55
		$resultat->corps = $observation;
55
		return $resultat;
56
		return $resultat;
56
	}
57
	}
57
	
58
	
58
	/*-------------------------------------------------------------------------------
59
	/*-------------------------------------------------------------------------------
59
	 							CONFIGURATION DU SERVICE
60
	 							CONFIGURATION DU SERVICE
60
	 --------------------------------------------------------------------------------*/
61
	 --------------------------------------------------------------------------------*/
61
	/**
62
	/**
62
	 * Configuration du service en fonction du fichier de config config_del.ini
63
	 * Configuration du service en fonction du fichier de config config_del.ini
63
	 * */
64
	 * */
64
	private function configurer($ressources) {
65
	private function configurer($ressources) {
65
		$this->mappingObservation = $this->conteneur->getParametre('mapping_observation');
66
		$this->mappingObservation = $this->conteneur->getParametre('mapping_observation');
-
 
67
		$this->mappingVotes = $this->conteneur->getParametre('mapping_votes');
66
		if (empty($ressources) || sizeof($ressources) > 1 ) {
68
		if (empty($ressources) || sizeof($ressources) > 1 ) {
67
			$e = 'Le service observation accepete 1 et 1 seule ressource';
69
			$e = 'Le service observation accepete 1 et 1 seule ressource';
68
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
70
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
69
		} else {
71
		} else {
70
			$this->id_observation = $ressources[0];
72
			$this->id_observation = $ressources[0];
71
		}
73
		}
72
	}
74
	}
73
	
75
	
74
	/**
76
	/**
75
	 * Vérifier que le service est bien configuré 
77
	 * Vérifier que le service est bien configuré 
76
	 * */
78
	 * */
77
	private function verifierConfiguration() {
79
	private function verifierConfiguration() {
78
	
80
	
79
		$erreurs = array();
81
		$erreurs = array();
80
		$tableauImages = $this->conteneur->getParametre('observations');
82
		$tableauImages = $this->conteneur->getParametre('observations');
81
		if (empty($tableauImages)) {
83
		if (empty($tableauImages)) {
82
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;'; 
84
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;'; 
83
		} else {
85
		} else {
84
			if ($this->conteneur->getParametre('url_service') == null) {
86
			if ($this->conteneur->getParametre('url_service') == null) {
85
				$erreurs[] = '- paramètre "url_service" manquant ;';
87
				$erreurs[] = '- paramètre "url_service" manquant ;';
86
			}
88
			}
87
			
89
			
88
			if ($this->conteneur->getParametre('url_images') == null) {
90
			if ($this->conteneur->getParametre('url_images') == null) {
89
				$erreurs[] = '- paramètre "url_images" manquant ;';
91
				$erreurs[] = '- paramètre "url_images" manquant ;';
90
			}
92
			}
91
			
93
			
92
		}
94
		}
93
 
95
 
94
		if (empty($this->mappingObservation)) {
96
		if (empty($this->mappingObservation)) {
95
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_observation] ou celui-ci est vide ;';
97
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_observation] ou celui-ci est vide ;';
96
		} else {
98
		} else {
97
			$champsMappingObs = array('id_observation', 'date_observation', 'date_transmission', 'famille', 'nom_sel', 'nom_sel_nn', 'nt',
99
			$champsMappingObs = array('id_observation', 'date_observation', 'date_transmission', 'famille', 'nom_sel', 'nom_sel_nn', 'nt',
98
								'ce_zone_geo', 'zone_geo', 'lieudit', 'station', 'courriel', 'ce_utilisateur', 'nom', 'prenom');
100
								'ce_zone_geo', 'zone_geo', 'lieudit', 'station', 'courriel', 'ce_utilisateur', 'nom', 'prenom');
99
			
101
			
100
			foreach ($champsMappingObs as $champ) {
102
			foreach ($champsMappingObs as $champ) {
101
				if (!isset($this->mappingObservation[$champ])) {
103
				if (!isset($this->mappingObservation[$champ])) {
102
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
104
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
103
				}				
105
				}				
104
			}
106
			}
105
		}
107
		}
106
		
108
		
107
		if (!empty($erreurs)) {
109
		if (!empty($erreurs)) {
108
			$e = 'Erreur lors de la configuration : '."\n";
110
			$e = 'Erreur lors de la configuration : '."\n";
109
			$e .= implode("\n", $erreurs);
111
			$e .= implode("\n", $erreurs);
110
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
112
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
111
		}
113
		}
112
	}
114
	}
113
	
115
	
114
	/*-------------------------------------------------------------------------------
116
	/*-------------------------------------------------------------------------------
115
								CHARGEMENT DES OBSERVATIONS 
117
								CHARGEMENT DES OBSERVATIONS 
116
	--------------------------------------------------------------------------------*/
118
	--------------------------------------------------------------------------------*/
117
	/**
119
	/**
118
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
120
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
119
	* */
121
	* */
120
	private function chargerLiaisons() {
122
	private function chargerLiaisons() {
121
	
123
	
122
		$requeteLiaisons = 'SELECT * '.
124
		$requeteLiaisons = 'SELECT * '.
123
						   'FROM '.$this->gestionBdd->formaterTable('del_observation', 'dob').
125
						   'FROM '.$this->gestionBdd->formaterTable('del_observation', 'dob').
124
						   'INNER JOIN '.$this->gestionBdd->formaterTable('del_obs_image', 'doi').
126
						   'INNER JOIN '.$this->gestionBdd->formaterTable('del_obs_image', 'doi').
125
						   'ON doi.id_observation = dob.id_observation '.
127
						   'ON doi.id_observation = dob.id_observation '.
126
						   'INNER JOIN del_utilisateur du '.
128
						   'INNER JOIN del_utilisateur du '.
127
						   'ON du.id_utilisateur = doi.id_utilisateur '.
129
						   'ON du.id_utilisateur = doi.id_utilisateur '.
128
						   'WHERE doi.id_observation = '.$this->id_observation;
130
						   'WHERE doi.id_observation = '.$this->id_observation;
129
		$requeteLiaisons .=  ' GROUP BY doi.id_observation';
131
		$requeteLiaisons .=  ' GROUP BY doi.id_observation';
130
		$requeteLiaisons .= ' ORDER BY date_transmission DESC ';
132
		$requeteLiaisons .= ' ORDER BY date_transmission DESC ';
131
		$requeteLiaisons .= $this->gestionBdd->getLimitSql();
133
		$requeteLiaisons .= $this->gestionBdd->getLimitSql();
132
		
134
		
133
		return $this->bdd->recuperer($requeteLiaisons);
135
		return $this->bdd->recuperer($requeteLiaisons);
134
	}
136
	}
135
	
137
	
136
	/**
138
	/**
137
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
139
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
138
	* @param $liaisons les liaisons de la table del_obs_images
140
	* @param $liaisons les liaisons de la table del_obs_images
139
	* */
141
	* */
140
	private function chargerObservation($liaison) {
142
	private function chargerObservation($liaison) {
141
		$observation = $this->formaterObservation($liaison);
143
		$observation = $this->formaterObservation($liaison);
142
		return $observation;
144
		return $observation;
143
	}
145
	}
144
	
146
	
145
	/**
147
	/**
146
	 * Sélectionner toutes les images de chaque observation
148
	 * Sélectionner toutes les images de chaque observation
147
	 * @param array $observations la liste des observations 
149
	 * @param array $observations la liste des observations 
148
	 * */
150
	 * */
149
	private function chargerImages($observation) {
151
	private function chargerImages($observation) {
150
		$requeteImages = 'SELECT * FROM '. $this->gestionBdd->formaterTable('del_obs_image', 'doi').
152
		$requeteImages = 'SELECT * FROM '. $this->gestionBdd->formaterTable('del_obs_image', 'doi').
151
						 'INNER JOIN '.$this->gestionBdd->formaterTable('del_image', 'di').
153
						 'INNER JOIN '.$this->gestionBdd->formaterTable('del_image', 'di').
152
						 'ON doi.id_image = di.id_image '.
154
						 'ON doi.id_image = di.id_image '.
153
						 'WHERE doi.id_observation = '.$observation['id_observation'];
155
						 'WHERE doi.id_observation = '.$observation['id_observation'];
154
			
156
			
155
		$images = $this->bdd->recupererTous($requeteImages);
157
		$images = $this->bdd->recupererTous($requeteImages);
156
		$images = $this->formaterImages($images);
158
		$images = $this->formaterImages($images);
157
		$observation['images'] = $images;
159
		$observation['images'] = $images;
158
		
160
		
159
		return $observation;
161
		return $observation;
160
	}
162
	}
161
	
163
	
162
	/**
164
	/**
163
	* Récupérer tous les commentaires au total
165
	* Récupérer tous les commentaires au total
164
	* @param array $observations la liste des observations à mettre à jour
166
	* @param array $observations la liste des observations à mettre à jour
165
	* */
167
	* */
166
	private function chargerCommentaires($observation) {
168
	private function chargerCommentaires($observation) {
167
		
169
		
168
		$requeteCommentaires = 'SELECT * FROM '.$this->gestionBdd->formaterTable('del_commentaire', 'dc').
170
		$requeteCommentaires = 'SELECT * FROM '.$this->gestionBdd->formaterTable('del_commentaire', 'dc').
169
							   'WHERE ce_observation = '.$observation['id_observation'];
171
							   'WHERE ce_observation = '.$observation['id_observation'];
170
		$commentaires = $this->bdd->recupererTous($requeteCommentaires);
172
		$commentaires = $this->bdd->recupererTous($requeteCommentaires);
-
 
173
		foreach ($commentaires as $id=>$commentaire) {
-
 
174
			if ($commentaire['nom_sel'] != null) {
-
 
175
				$commentaire['votes'] = $this->chargerVotes($commentaire['id_commentaire']);
-
 
176
			}
-
 
177
			$commentaires[$id] = $commentaire;
-
 
178
		}
171
		$observation['commentaires'] = $commentaires;
179
		$observation['commentaires'] = $commentaires;
172
		
180
		
173
		return $observation;
181
		return $observation;
174
	}
182
	}
-
 
183
	
-
 
184
	private function chargerVotes($id_commentaire) {
-
 
185
		$requeteVotes = 'SELECT * FROM '.
-
 
186
			$this->gestionBdd->formaterTable('del_commentaire_vote').
-
 
187
			'WHERE ce_proposition = '.$this->proteger($id_commentaire);
-
 
188
		$resultatsVotes = $this->bdd->recupererTous($requeteVotes);
-
 
189
		$votes = $this->formaterVotes($resultatsVotes);
-
 
190
		return $votes;
175
	
191
	}
176
	
192
	
177
	
193
	
178
	/*-------------------------------------------------------------------------------
194
	/*-------------------------------------------------------------------------------
179
								FORMATER ET METTRE EN FORME
195
								FORMATER ET METTRE EN FORME
180
	--------------------------------------------------------------------------------*/
196
	--------------------------------------------------------------------------------*/
181
	
197
	
182
	/**
198
	/**
183
	 * Formater les images d'une observation
199
	 * Formater les images d'une observation
184
	 * @param array $images les images de l'observation
200
	 * @param array $images les images de l'observation
185
	 * */
201
	 * */
186
	private function formaterImages($images) {
202
	private function formaterImages($images) {
187
		$imagesRetour = array();
203
		$imagesRetour = array();
188
		foreach ($images as $image) {
204
		foreach ($images as $image) {
189
			$imageCourante = array();
205
			$imageCourante = array();
190
			$imageCourante['id_image'] = $image['id_image'];
206
			$imageCourante['id_image'] = $image['id_image'];
191
			$imageCourante['date'] = $image['date_prise_de_vue'];
207
			$imageCourante['date'] = $image['date_prise_de_vue'];
192
			$imageCourante['binaire.href'] = $this->formaterLienImage($image['id_image']);
208
			$imageCourante['binaire.href'] = $this->formaterLienImage($image['id_image']);
193
			$imageCourante['hauteur'] = $image['hauteur'];
209
			$imageCourante['hauteur'] = $image['hauteur'];
194
			$imageRetour['largeur'] = $image['largeur'];
210
			$imageRetour['largeur'] = $image['largeur'];
195
			
211
			
196
			$imagesRetour[] = $imageCourante;
212
			$imagesRetour[] = $imageCourante;
197
		}
213
		}
198
		
214
		
199
		return $imagesRetour;
215
		return $imagesRetour;
200
	} 
216
	} 
201
	
217
	
202
	/**
218
	/**
203
	*  Formater une observation depuis une ligne liaison
219
	*  Formater une observation depuis une ligne liaison
204
	*  @param $liaison liaison issue de la recherche
220
	*  @param $liaison liaison issue de la recherche
205
	*  @return $observation l'observation mise en forme
221
	*  @return $observation l'observation mise en forme
206
	* */
222
	* */
207
	private function formaterObservation($liaison) {
223
	private function formaterObservation($liaison) {
208
		$observation = array();
224
		$observation = array();
209
		
225
		
210
		foreach ($this->mappingObservation as $nomOriginal => $nomFinal) {
226
		foreach ($this->mappingObservation as $nomOriginal => $nomFinal) {
211
			$observation[$nomFinal] = $liaison[$nomOriginal];
227
			$observation[$nomFinal] = $liaison[$nomOriginal];
212
		}
228
		}
213
		
229
		
214
		$observation['images'] = array();
230
		$observation['images'] = array();
215
 
231
 
216
		return $observation;
232
		return $observation;
217
	}
233
	}
218
	
234
	
219
	/**
235
	/**
220
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
236
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
221
	 * */
237
	 * */
222
	private function formaterLienImage($idImage) {
238
	private function formaterLienImage($idImage) {
223
		$idImage = sprintf('%09s', $idImage);
239
		$idImage = sprintf('%09s', $idImage);
224
		$url = $this->conteneur->getParametre('url_images');
240
		$url = $this->conteneur->getParametre('url_images');
225
		$urlImage = str_replace('%s', $idImage, $url);
241
		$urlImage = str_replace('%s', $idImage, $url);
226
		return $urlImage;
242
		return $urlImage;
227
	}
243
	}
228
	
244
	
229
	private function proteger($valeur) {
245
	private function proteger($valeur) {
230
		if (is_array($valeur)) {
246
		if (is_array($valeur)) {
231
			return $this->bdd->protegerTableau($valeur);
247
			return $this->bdd->protegerTableau($valeur);
232
		} else {
248
		} else {
233
			return $this->bdd->proteger($valeur);
249
			return $this->bdd->proteger($valeur);
234
		}
250
		}
235
	}
251
	}
-
 
252
	
-
 
253
	/**
-
 
254
	*  Formater un vote en fonction du fichier de configuration config_votes.ini
-
 
255
	*  @param $votes array()
-
 
256
	* */
-
 
257
	private function formaterVotes($votes) {
-
 
258
		$retour = array();
-
 
259
		foreach ($votes as $vote) {
-
 
260
			foreach ($vote as $p=>$valeur) {
-
 
261
				$retour[$vote['id_vote']][$this->mappingVotes[$p]] = $valeur;
-
 
262
			}
-
 
263
		}
-
 
264
		return $retour;
-
 
265
	}
236
}
266
}
237
?>
267
?>