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;
|