Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1666 Rev 1684
Line 1... Line 1...
1
<?php
1
<?php
2
/**
2
/**
3
 * Le web service observations récupère toutes les information pour une observation:
3
 * Web service retournant toutes les infos d'une observation donnée :
4
 * images, votes sur image et protocole, commentaires, votes sur commentaires, ...
4
 * images, votes sur image et protocole, commentaires, votes sur commentaires, ...
5
 *
5
 *
6
 * @category	php 5.2
6
 * @category	DEL
-
 
7
 * @package		Observations
-
 
8
 * @version		0.1
7
 * @author		Raphaël Droz <raphael@tela-botanica.org>
9
 * @author		Raphaël Droz <raphael@tela-botanica.org>
-
 
10
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
8
 * @copyright	Copyright (c) 2013, Tela Botanica (accueil@tela-botanica.org)
11
 * @copyright	Copyright (c) 2013, Tela Botanica (accueil@tela-botanica.org)
9
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
 * @license		GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
 * @license		CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
11
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Observations
14
 * @see			http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Observations
12
 *
15
 *
13
 * @config-depend: "url_image" (dans configurations/config_observations.ini)
16
 * @config-depend: "url_image" (dans configurations/config_observations.ini) ex: http://www.tela-botanica.org/appli:cel-img:%09dXL.jpg
14
 *				   ex: http://www.tela-botanica.org/appli:cel-img:%09dXL.jpg
-
 
15
 */
17
 */
Line 16... Line 18...
16
 
18
 
Line 17... Line 19...
17
// http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire
19
// http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire
Line 18... Line 20...
18
 
20
 
Line -... Line 21...
-
 
21
require_once(dirname(__FILE__) . '/../DelTk.php');
-
 
22
 
-
 
23
class Observation {
19
require_once(dirname(__FILE__) . '/../DelTk.php');
24
 
20
 
25
	private $conteneur;
21
class Observation {
26
	private $gestionBdd;
22
 
27
	private $bdd;
23
	/* Map les champs MySQL vers les champs utilisés dans le JSON pour les clients pour
28
	/* Map les champs MySQL vers les champs utilisés dans le JSON pour les clients pour
Line 105... Line 110...
105
			"nom_ret_nn" => 1,
110
			"nom_ret_nn" => 1,
106
			"nom_referentiel" => 1,
111
			"nom_referentiel" => 1,
107
			"proposition_initiale" => 1),
112
			"proposition_initiale" => 1),
108
	);
113
	);
Line 109... Line -...
109
 
-
 
110
 
-
 
111
	private $conteneur;
-
 
112
	private $gestionBdd;
-
 
113
	private $bdd;
-
 
114
 
114
 
115
	public function __construct(Conteneur $conteneur = null) {
115
	public function __construct(Conteneur $conteneur = null) {
116
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
116
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
117
		$this->conteneur->chargerConfiguration('config_votes.ini');
117
		$this->conteneur->chargerConfiguration('config_votes.ini');
118
		$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
118
		$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
Line 164... Line 164...
164
		// d'observations (... convergence avec ListeObservations & DelTk)
164
		// d'observations (... convergence avec ListeObservations & DelTk)
Line 165... Line 165...
165
 
165
 
Line 166... Line 166...
166
		$observation = array_pop($observations);
166
		$observation = array_pop($observations);
167
 
167
 
168
		// 3) charge les données de votes et protocoles associés aux images
168
		// 3) charge les données de votes et protocoles associés aux images
169
		if($observation['images']) {
169
		if ($observation['images']) {
170
			$votes = self::chargerVotesImage($this->bdd, $observation['images'], $protocole);
170
			$votes = self::chargerVotesImage($this->bdd, $observation['images'], $protocole);
171
			// 3") merge/reformate les données retournées
-
 
172
			self::mapVotesToImages($votes,
171
			// 3") merge/reformate les données retournées
Line 173... Line 172...
173
								   $observation['images']);
172
			self::mapVotesToImages($votes, $observation['images']);
174
		}
173
		}
175
 
174
 
Line 176... Line -...
176
		// 4) charge les commentaires et les votes associés
-
 
177
		// modifie/créé $observation['commentaires']
175
		// 4) charge les commentaires et les votes associés
178
		self::chargerCommentaires($this->bdd, $observation);
176
		// modifie/créé $observation['commentaires']
179
 
177
		self::chargerCommentaires($this->bdd, $observation);
180
 
178
 
181
		// désindexe le tableau (tel qu'apparement attendu par les applis), c'est une exception
179
		// désindexe le tableau (tel qu'apparement attendu par les applis), c'est une exception
-
 
180
		// corriger l'appli cliente pour utiliser les index puis supprimer cette ligne
-
 
181
		$observation['images'] = array_values($observation['images']);
-
 
182
		// autre élément de post-processing: le ce_utilisateur de l'observation non-numeric...
182
		// corriger l'appli cliente pour utiliser les index puis supprimer cette ligne
183
		if (!is_numeric($observation['auteur.id'])) {
183
		$observation['images'] = array_values($observation['images']);
184
			$observation['auteur.id'] = "0";
Line 184... Line 185...
184
		// autre élément de post-processing: le ce_utilisateur de l'observation non-numeric...
185
		}
-
 
186
		if (!isset($observation['auteur.nom'])) {
-
 
187
			$observation['auteur.nom'] = '[inconnu]';
Line 185... Line 188...
185
		if(!is_numeric($observation['auteur.id'])) $observation['auteur.id'] = "0";
188
		}
186
		if(!isset($observation['auteur.nom'])) $observation['auteur.nom'] = '[inconnu]';
189
 
187
 
190
		if (isset($parametres['justthrow'])) {
188
 
191
			return $observation;
Line 213... Line 216...
213
	}
216
	}
Line 214... Line 217...
214
 
217
 
215
 
218
 
216
	// Charger les images et leurs votes associés
219
	// Charger les images et leurs votes associés
Line 217... Line 220...
217
	static function chargerVotesImage($db, $images, $protocole = NULL) {
220
	static function chargerVotesImage($db, $images, $protocole = NULL) {
218
		if(!$images) return NULL;
221
		if (!$images) return NULL;
219
 
222
 
220
 		$select = array('votes' =>
223
 		$select = array('votes' =>
Line 245... Line 248...
245
			($where ? implode(' AND ', $where) : 1),
248
			($where ? implode(' AND ', $where) : 1),
246
			$ordreDesIdsRecus,
249
			$ordreDesIdsRecus,
247
			__FILE__ . ':' . __LINE__);
250
			__FILE__ . ':' . __LINE__);
Line 248... Line 251...
248
 
251
 
249
		//echo "REQUETE: $req"; exit;
-
 
250
 
252
		//echo "REQUETE: $req"; exit;
251
		return $db->recupererTous($req);
253
		return $db->recupererTous($req);
Line 252... Line 254...
252
	}
254
	}
253
 
255
 
Line 261... Line 263...
261
	 * descriptif = protocole.descriptif, valeur = vote
263
	 * descriptif = protocole.descriptif, valeur = vote
262
	 * Alors $retour[ contient:
264
	 * Alors $retour[ contient:
263
	 *
265
	 *
264
	 * */
266
	 * */
265
	static function mapVotesToImages($votes, &$images) {
267
	static function mapVotesToImages($votes, &$images) {
266
		if(!$votes) return;
268
		if (!$votes) return;
Line 267... Line 269...
267
 
269
 
268
		// pour chaque vote
270
		// pour chaque vote
269
		foreach ($votes as $vote) {
271
		foreach ($votes as $vote) {
270
			$imgid = $vote['image.id'];
272
			$imgid = $vote['image.id'];
Line 307... Line 309...
307
			" WHERE ce_observation = %d -- %s",
309
			" WHERE ce_observation = %d -- %s",
308
			$comment_fields, $vote_fields,
310
			$comment_fields, $vote_fields,
309
			$observation['id_observation'],
311
			$observation['id_observation'],
310
			__FILE__ . ':' . __LINE__));
312
			__FILE__ . ':' . __LINE__));
Line 311... Line 313...
311
 
313
 
Line 312... Line 314...
312
		if(!$commentaires) return;
314
		if (!$commentaires) return;
313
 
315
 
314
		// les commentaires réunifiées et dont les votes sont mergés
316
		// les commentaires réunifiées et dont les votes sont mergés
315
		$ret = array();
317
		$ret = array();
316
		foreach ($commentaires as $comment) {
318
		foreach ($commentaires as $comment) {
Line 317... Line 319...
317
			$commentid = $comment['id_commentaire'];
319
			$commentid = $comment['id_commentaire'];
318
			$voteid = $comment['vote.id'];
320
			$voteid = $comment['vote.id'];
319
 
321
 
320
			if(!array_key_exists($commentid, $ret)) {
322
			if (!array_key_exists($commentid, $ret)) {
321
				$comment_extract = array_intersect_key($comment, array_flip(self::$mappings['commentaires']));
323
				$comment_extract = array_intersect_key($comment, array_flip(self::$mappings['commentaires']));
322
				// cas particulier: conflit d'aliases avec del_commentaire_vote
324
				// cas particulier: conflit d'aliases avec del_commentaire_vote
Line 327... Line 329...
327
				// toujours un éléments "votes", quand bien même il n'y en aurait pas
329
				// toujours un éléments "votes", quand bien même il n'y en aurait pas
328
				$comment_extract['votes'] = array();
330
				$comment_extract['votes'] = array();
329
				$ret[$commentid] = $comment_extract;
331
				$ret[$commentid] = $comment_extract;
330
			}
332
			}
Line 331... Line 333...
331
 
333
 
332
			if(!$comment['nom_sel'] || ! $voteid) continue;
334
			if (!$comment['nom_sel'] || ! $voteid) continue;
333
			$vote = array_intersect_key($comment, array_flip(self::$mappings['votes']));
335
			$vote = array_intersect_key($comment, array_flip(self::$mappings['votes']));
334
			$ret[$commentid]['votes'][$voteid] = $vote;
336
			$ret[$commentid]['votes'][$voteid] = $vote;
335
		}
337
		}
336
		$observation['commentaires'] = $ret;
338
		$observation['commentaires'] = $ret;
Line 337... Line 339...
337
	}
339
	}
338
 
340
 
339
	// cf ListeObservation::reformateObservation() et ListeImages2::reformateImagesDoubleIndex()
341
	// cf ListeObservation::reformateObservation() et ListeImages2::reformateImagesDoubleIndex()
340
    // (trop de variétés de formatage, à unifier côté client pour unifier côté backend ...)
342
	// (trop de variétés de formatage, à unifier côté client pour unifier côté backend ...)
341
	static function reformateObservationSimpleIndex($obs, $url_pattern = '') {
343
	static function reformateObservationSimpleIndex($obs, $url_pattern = '') {
342
		// XXX: cf Observation.php::consulter(), nous pourriouns ici
344
		// XXX: cf Observation.php::consulter(), nous pourriouns ici
343
		// conserver les valeurs vides (pour les phptests notamment, ou non)
345
		// conserver les valeurs vides (pour les phptests notamment, ou non)
344
		$obs = array_map('array_filter', $obs);
346
		$obs = array_map('array_filter', $obs);
345
		$obs_merged = array();
347
		$obs_merged = array();
346
		foreach($obs as $o) {
348
		foreach ($obs as $o) {
347
			$id = $o['id_observation'];
349
			$id = $o['id_observation'];
348
			$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
350
			$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
349
			$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
351
			$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
350
			unset($o['id_image'], $o['date'], $o['hauteur'], $o['largeur'], $o['nom_original']);
352
			unset($o['id_image'], $o['date'], $o['hauteur'], $o['largeur'], $o['nom_original']);
351
			if(!isset($obs_merged[$id])) $obs_merged[$id] = $o;
353
			if(!isset($obs_merged[$id])) $obs_merged[$id] = $o;
352
			$obs_merged[$id]['images'][$image['id_image']] = $image;
354
			$obs_merged[$id]['images'][$image['id_image']] = $image;
353
		}
355
		}
Line -... Line 356...
-
 
356
		return $obs_merged;
-
 
357
	}
-
 
358
 
-
 
359
	/**
-
 
360
	 * Modifie une observation directement dans le CEL en faisant un appel à un web service du CEL.
-
 
361
	 * Utilisé uniquement par les admins.
-
 
362
	 * Permet de dépublier une observation.
-
 
363
	 *
-
 
364
	 * @param array		$ressources tableau des informations contenues dans l'url après le nom du service
-
 
365
	 * @param array		$parametres contenu du post
-
 
366
	 * @return mixed	Chaine "OK" en cas de succès, booléen "false" en cas d'échec
-
 
367
	 */
-
 
368
	public function modifier($ressources, $parametres) {
-
 
369
		$retour = false;
-
 
370
		if (isset($parametres['transmission'])) {
-
 
371
			$idObs = $ressources[0];
-
 
372
			$clientRest = $this->conteneur->getRestClient();
-
 
373
			$urlTpl = $this->conteneur->getParametre('urlServiceCelObs');
-
 
374
			$url = $urlTpl.$idObs;
-
 
375
			$retour = $clientRest->modifier($url, $parametres);
354
		return $obs_merged;
376
		}
355
	}
377
		return $retour;