Subversion Repositories eFlore/Applications.del

Rev

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