Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1683 → Rev 1684

/trunk/services/modules/0.1/observations/Observation.php
1,17 → 1,19
<?php
/**
* Le web service observations récupère toutes les information pour une observation:
* Web service retournant toutes les infos d'une observation donnée :
* images, votes sur image et protocole, commentaires, votes sur commentaires, ...
*
* @category php 5.2
* @category DEL
* @package Observations
* @version 0.1
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2013, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Observations
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Observations
*
* @config-depend: "url_image" (dans configurations/config_observations.ini)
* ex: http://www.tela-botanica.org/appli:cel-img:%09dXL.jpg
* @config-depend: "url_image" (dans configurations/config_observations.ini) ex: http://www.tela-botanica.org/appli:cel-img:%09dXL.jpg
*/
 
// http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire
20,6 → 22,9
 
class Observation {
 
private $conteneur;
private $gestionBdd;
private $bdd;
/* Map les champs MySQL vers les champs utilisés dans le JSON pour les clients pour
chacune des différentes tables utilisées pour le chargement de résultats ci-dessous.
- chargerObservation() (v_del_image)
107,11 → 112,6
"proposition_initiale" => 1),
);
 
 
private $conteneur;
private $gestionBdd;
private $bdd;
 
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_votes.ini');
166,11 → 166,10
$observation = array_pop($observations);
 
// 3) charge les données de votes et protocoles associés aux images
if($observation['images']) {
if ($observation['images']) {
$votes = self::chargerVotesImage($this->bdd, $observation['images'], $protocole);
// 3") merge/reformate les données retournées
self::mapVotesToImages($votes,
$observation['images']);
self::mapVotesToImages($votes, $observation['images']);
}
 
// 4) charge les commentaires et les votes associés
177,17 → 176,21
// modifie/créé $observation['commentaires']
self::chargerCommentaires($this->bdd, $observation);
 
 
// désindexe le tableau (tel qu'apparement attendu par les applis), c'est une exception
// corriger l'appli cliente pour utiliser les index puis supprimer cette ligne
$observation['images'] = array_values($observation['images']);
// autre élément de post-processing: le ce_utilisateur de l'observation non-numeric...
if(!is_numeric($observation['auteur.id'])) $observation['auteur.id'] = "0";
if(!isset($observation['auteur.nom'])) $observation['auteur.nom'] = '[inconnu]';
if (!is_numeric($observation['auteur.id'])) {
$observation['auteur.id'] = "0";
}
if (!isset($observation['auteur.nom'])) {
$observation['auteur.nom'] = '[inconnu]';
}
 
if (isset($parametres['justthrow'])) {
return $observation;
}
 
if(isset($parametres['justthrow'])) return $observation;
 
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
$resultat->corps = $observation;
215,7 → 218,7
 
// Charger les images et leurs votes associés
static function chargerVotesImage($db, $images, $protocole = NULL) {
if(!$images) return NULL;
if (!$images) return NULL;
 
$select = array('votes' =>
array('id_vote', 'ce_image', 'ce_protocole', 'ce_utilisateur', 'valeur', 'date', /* del_image_vote */),
247,7 → 250,6
__FILE__ . ':' . __LINE__);
 
//echo "REQUETE: $req"; exit;
 
return $db->recupererTous($req);
}
 
263,7 → 265,7
*
* */
static function mapVotesToImages($votes, &$images) {
if(!$votes) return;
if (!$votes) return;
 
// pour chaque vote
foreach ($votes as $vote) {
309,7 → 311,7
$observation['id_observation'],
__FILE__ . ':' . __LINE__));
 
if(!$commentaires) return;
if (!$commentaires) return;
 
// les commentaires réunifiées et dont les votes sont mergés
$ret = array();
317,7 → 319,7
$commentid = $comment['id_commentaire'];
$voteid = $comment['vote.id'];
 
if(!array_key_exists($commentid, $ret)) {
if (!array_key_exists($commentid, $ret)) {
$comment_extract = array_intersect_key($comment, array_flip(self::$mappings['commentaires']));
// cas particulier: conflit d'aliases avec del_commentaire_vote
$comment_extract['auteur.id'] = $comment_extract['__auteur_com'];
329,7 → 331,7
$ret[$commentid] = $comment_extract;
}
 
if(!$comment['nom_sel'] || ! $voteid) continue;
if (!$comment['nom_sel'] || ! $voteid) continue;
$vote = array_intersect_key($comment, array_flip(self::$mappings['votes']));
$ret[$commentid]['votes'][$voteid] = $vote;
}
337,13 → 339,13
}
 
// cf ListeObservation::reformateObservation() et ListeImages2::reformateImagesDoubleIndex()
// (trop de variétés de formatage, à unifier côté client pour unifier côté backend ...)
// (trop de variétés de formatage, à unifier côté client pour unifier côté backend ...)
static function reformateObservationSimpleIndex($obs, $url_pattern = '') {
// XXX: cf Observation.php::consulter(), nous pourriouns ici
// conserver les valeurs vides (pour les phptests notamment, ou non)
$obs = array_map('array_filter', $obs);
$obs_merged = array();
foreach($obs as $o) {
foreach ($obs as $o) {
$id = $o['id_observation'];
$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
354,4 → 356,24
return $obs_merged;
}
 
/**
* Modifie une observation directement dans le CEL en faisant un appel à un web service du CEL.
* Utilisé uniquement par les admins.
* Permet de dépublier une observation.
*
* @param array $ressources tableau des informations contenues dans l'url après le nom du service
* @param array $parametres contenu du post
* @return mixed Chaine "OK" en cas de succès, booléen "false" en cas d'échec
*/
public function modifier($ressources, $parametres) {
$retour = false;
if (isset($parametres['transmission'])) {
$idObs = $ressources[0];
$clientRest = $this->conteneur->getRestClient();
$urlTpl = $this->conteneur->getParametre('urlServiceCelObs');
$url = $urlTpl.$idObs;
$retour = $clientRest->modifier($url, $parametres);
}
return $retour;
}
}