Subversion Repositories eFlore/Applications.del

Rev

Rev 772 | Rev 820 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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