/trunk/services/modules/0.1/Observations.php |
---|
1,37 → 1,57 |
<?php |
/** |
* Description : |
* Classe principale de chargement des services d'eFlore. |
* |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* @package eflore-projets |
* @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org> |
* @author Delphine CAUQUIL <delphine@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version 0.1 |
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org) |
*/ |
* Classe principale de chargement des services Observations. |
* |
* URLs possibles : |
* GET : |
* http://localhost/service:del:0.1/observations |
* toutes les observations (infos obs, infos images, infos propositions, infos nb commentaires) |
* |
* http://localhost/service:del:0.1/observations?retour.format=widget |
* toutes les infos des observations pour le Widget DEL |
* |
* http://localhost/service:del:0.1/observations/#idObs |
* une observation donnée et ses images, SANS LES propositions & nombre de commentaire* |
* |
* http://localhost/service:del:0.1/observations/#idObs/#idVote/vote |
* toutes les infos sur les votes d'une proposition |
* |
* PUT : |
* http://localhost/service:del:0.1/observations/#idObs/#idCommentaire/vote |
* ajoute un vote (+ ou -) pour une obs et une proposition donnée |
* |
* POST : |
* http://localhost/service:del:0.1/observations/#idObs |
* utilisé seulement par les admins pour modifier une obs depuis DEL (dépublication des obs) |
* |
* http://localhost/service:del:0.1/observations/#idObs/#idCommentaire/vote |
* modifie un vote (+ ou -) pour une obs et une proposition donnée |
* |
* |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @category DEL |
* @package Observations |
* @version 0.1 |
* @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org> |
* @author Delphine CAUQUIL <delphine@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org) |
*/ |
class Observations extends RestService { |
/* |
* url possibles : |
* http://localhost/del/services/0.1/observations/ => toutes les observations (infos obs, infos images, infos propositions, infos nb commentaires) |
* http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire |
* */ |
private $parametres = array(); |
private $ressources = array(); |
private $methode = null; |
private $projetNom = array(); |
private $serviceNom = array(); |
private $serviceNom = 'observations'; |
private $sousServiceNom = null; |
private $cheminCourant = null; |
private $conteneur; |
/** Indique si oui (true) ou non (false), on veut utiliser les paramètres bruts. */ |
protected $utilisationParametresBruts = true; |
41,157 → 61,155 |
public function consulter($ressources, $parametres) { |
$this->methode = 'consulter'; |
$resultat = ''; |
$reponseHttp = new ReponseHttp(); |
try { |
$this->initialiserRessourcesEtParametres($ressources, $parametres); |
$this->conteneur = new Conteneur($this->parametres); |
$resultat = $this->traiterRessources(); |
$reponseHttp->setResultatService($resultat); |
} catch (Exception $e) { |
$reponseHttp->ajouterErreur($e); |
} |
$reponseHttp->emettreLesEntetes(); |
$corps = $reponseHttp->getCorps(); |
return $corps; |
$this->initialiserRessourcesEtParametres($ressources, $parametres); |
return $this->executerService(); |
} |
public function ajouter($ressources, $requeteDonnees) { |
$this->methode = 'ajouter'; |
$resultat = ''; |
$reponseHttp = new ReponseHttp(); |
try { |
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees); |
$this->conteneur = new Conteneur($this->parametres); |
$resultat = $this->traiterRessources(); |
} catch (Exception $e) { |
$reponseHttp->ajouterErreur($e); |
$reponseHttp->emettreLesEntetes(); |
} |
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees); |
return $this->executerService(); |
} |
public function modifier($ressources, $requeteDonnees) { |
$this->methode = 'modifier'; |
$resultat = ''; |
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees); |
return $this->executerService(); |
} |
private function executerService() { |
$reponseHttp = new ReponseHttp(); |
try { |
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees); |
$this->conteneur = new Conteneur($this->parametres); |
$resultat = $this->traiterRessources(); |
$reponseHttp->setResultatService($resultat); |
} catch (Exception $e) { |
$reponseHttp->ajouterErreur($e); |
$reponseHttp->emettreLesEntetes(); |
} |
$reponseHttp->emettreLesEntetes(); |
$corps = $reponseHttp->getCorps(); |
return $corps; |
} |
private function initialiserRessourcesEtParametres($ressources, $parametres) { |
private function initialiserRessourcesEtParametres($ressources, $parametres = array()) { |
$this->ressources = $ressources; |
$this->parametres = $parametres; |
} |
private function traiterRessources() { |
$retour = ''; |
$this->initialiserProjet(); |
if ($this->avoirRessourceService()) { |
$retour = $this->initialiserService(); |
} |
$this->chargerConfigService(); |
$this->analyserRessources(); |
$retour = $this->initialiserService(); |
return $retour; |
} |
private function avoirRessourceIdentifiant($num) { |
$presenceId = false; |
if (is_numeric($this->ressources[$num])) { |
$presenceId = true; |
} else { |
$message = "Le service demandé '$service' nécessite d'avoir un identifiant d'image valide"; |
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE; |
throw new Exception($message, $code); |
} |
return $presenceId; |
private function chargerConfigService() { |
$chemin = Config::get('chemin_configurations')."config_{$this->serviceNom}.ini"; |
Config::charger($chemin); |
} |
/*------------------------------------------------------------------------------------------------------------------ |
CONFIGURATION DU PROJET |
CONFIGURATION DU SERVICE |
------------------------------------------------------------------------------------------------------------------*/ |
private function initialiserProjet() { |
$this->chargerNomDuProjet(); |
$this->chargerConfigProjet(); |
private function analyserRessources() { |
if ($this->methode == 'consulter') { |
$this->analyserRessoucesConsultation(); |
} else if ($this->methode == 'modifier' || $this->methode == 'ajouter') { |
$this->analyserRessoucesModification(); |
} |
} |
private function chargerNomDuProjet() { |
$this->projetNom = 'observations'; |
} |
private function analyserRessoucesConsultation() { |
if (count($this->ressources) == 0) { |
if ($this->verifierParametreValeur('retour.format', 'widget')) { |
// http://localhost/service:del:0.1/observations?retour.format=widget |
$this->sousServiceNom = 'liste-observations-widget'; |
} else { |
// http://localhost/service:del:0.1/observations |
$this->sousServiceNom = 'liste-observations'; |
} |
} else if (count($this->ressources) == 1) { |
if ($this->etreRessourceIdentifiant(0)) { |
// http://localhost/service:del:0.1/observations/#idObs |
$this->sousServiceNom = 'observation'; |
} |
} else if (count($this->ressources) == 3) { |
if ($this->etreRessourceIdentifiant(0) && $this->etreRessourceIdentifiant(1) && $this->verifierRessourceValeur(2, 'vote')) { |
// http://localhost/service:del:0.1/observations/#idObs/#idProposition/vote/ |
$this->sousServiceNom = 'vote-observation'; |
} |
} |
private function chargerConfigProjet() { |
$projet = $this->projetNom; |
$chemin = Config::get('chemin_configurations')."config_$projet.ini"; |
Config::charger($chemin); |
if ($this->sousServiceNom == null) { |
$this->lancerMessageErreurRessource(); |
} |
} |
/*------------------------------------------------------------------------------------------------------------------ |
CONFIGURATION DU SERVICE |
------------------------------------------------------------------------------------------------------------------*/ |
private function avoirRessourceService() { |
/* |
* url possibles : |
* http://localhost/del/services/0.1/observations/ => toutes les observations (infos obs, infos images, infos propositions, infos nb commentaires) |
* http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire |
* */ |
$presenceRessourceService = false; |
if (isset($this->ressources[0])) { |
if ($this->avoirRessourceIdentifiant(0)) { |
if (sizeof($this->ressources) == 1) { |
$presenceRessourceService = true; |
$this->serviceNom = 'observation'; |
} else { |
if (isset($this->ressources[1])) { |
$presenceRessourceService = $this->avoirRessourceSousService(); |
} |
} |
private function analyserRessoucesModification() { |
if (count($this->ressources) == 1) { |
if ($this->methode == 'modifier' && $this->etreRessourceIdentifiant(0)) { |
// http://localhost/service:del:0.1/observations/#idObs |
$this->sousServiceNom = 'observation'; |
} |
} else { |
if (isset($this->parametres['retour.format']) && $this->parametres['retour.format'] == 'widget') { |
$this->methode = 'consulter'; |
$presenceRessourceService = true; |
$this->serviceNom = 'liste-observations-widget'; |
} else { |
$presenceRessourceService = true; |
$this->serviceNom = 'liste-observations'; |
} else if (count($this->ressources) == 3) { |
if ($this->etreRessourceIdentifiant(0) && $this->etreRessourceIdentifiant(1) && $this->verifierRessourceValeur(2, 'vote')) { |
// http://localhost/service:del:0.1/observations/#idObs/#idProposition/vote/ |
$this->sousServiceNom = 'vote-observation'; |
} |
} |
return $presenceRessourceService; |
if ($this->sousServiceNom == null) { |
$this->lancerMessageErreurRessource(); |
} |
} |
private function avoirRessourceSousService() { |
$presenceRessourceService = false; |
$servicesDispo = Outils::recupererTableauConfig('servicesDispo'); |
if ($this->avoirRessourceIdentifiant(1)) { |
$service = $this->ressources[2]; |
if (in_array($service, $servicesDispo)) { |
$presenceRessourceService = true; |
$this->serviceNom = 'vote-observation'; |
} else { |
$message = "Le service demandé '$service' n'est pas disponible pour le projet {$this->projetNom} !\n". |
"Les services disponibles sont : ".implode(', ', $servicesDispo); |
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE; |
throw new Exception($message, $code); |
} |
private function etreRessourceIdentifiant($num) { |
$presenceId = false; |
if (isset($this->ressources[$num]) && is_numeric($this->ressources[$num])) { |
$presenceId = true; |
} |
return $presenceRessourceService; |
return $presenceId; |
} |
private function verifierRessourceValeur($num, $valeur) { |
$ok = false; |
if (isset($this->ressources[$num]) && $this->ressources[$num] == $valeur) { |
$ok = true; |
} |
return $ok; |
} |
private function verifierParametreValeur($cle, $valeur) { |
$ok = false; |
if (isset($this->parametres[$cle]) && $this->ressources[$cle] == $valeur) { |
$ok = true; |
} |
return $ok; |
} |
private function lancerMessageErreurRessource() { |
$ressource = $this->sousServiceNom.'/'.implode('/', $this->ressources); |
$message = "La ressource demandée '$ressource' ". |
"n'est pas disponible pour le service ".$this->serviceNom." !\n". |
"Les URLs disponibles sont : \n". |
" - en GET : observations, observations/#idObs/#idProposition/vote \n". |
" - en POST : observations/#id, observations/#idObs/#idProposition/vote \n". |
" - en PUT : observations/#idObs/#idProposition/vote \n"; |
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE; |
throw new Exception($message, $code); |
} |
private function initialiserService() { |
//$this->chargerNomDuService(); |
$classe = $this->obtenirNomClasseService($this->serviceNom); |
$classe = $this->obtenirNomClasseService($this->sousServiceNom); |
$chemins = array(); |
$chemins[] = $this->cheminCourant.$this->projetNom.DS.$classe.'.php'; |
$chemins[] = $this->cheminCourant.$this->serviceNom.DS.$classe.'.php'; |
$chemins[] = $this->cheminCourant.'commun'.DS.$classe.'.php'; |
$retour = ''; |
$service = null; |
foreach ($chemins as $chemin) { |
if (file_exists($chemin)) { |
$this->conteneur->chargerConfiguration('config_'.$this->projetNom.'.ini'); |
$this->conteneur->chargerConfiguration('config_'.$this->serviceNom.'.ini'); |
require_once $chemin; |
$service = new $classe($this->conteneur); |
if ($this->methode == 'consulter') { |
203,9 → 221,11 |
} |
} |
} |
if (is_null($service)) { |
$message = "Le service demandé '{$this->serviceNom}' n'existe pas dans le projet {$this->projetNom} !"; |
$ressource = $this->sousServiceNom.'/'.implode('/', $this->ressources); |
$message = "Le classe '$classe' correspondant à la ressource '$ressource' ". |
"n'existe pas dans le service '{$this->serviceNom}' !"; |
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE; |
throw new Exception($message, $code); |
} |
216,7 → 236,4 |
$classeNom = str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot)))); |
return $classeNom; |
} |
} |
?> |
} |
/trunk/services/modules/0.1/images/ListeImages.php |
---|
239,7 → 239,7 |
$retour = false; |
if ($controlAcces->controlerIpAutorisees()) { |
if ($controlAcces->etreUtilisateurAvecDroitAdmin()) { |
$urlServiceBase = $this->conteneur->getParametre('url_service_suppression_image'); |
$urlServiceBase = $this->conteneur->getParametre('urlServiceCelImage'); |
$url = $urlServiceBase.$idImage; |
$clientHttp = $this->conteneur->getRestClient(); |
/trunk/services/modules/0.1/observations/ListeObservationsWidget.php |
---|
264,7 → 264,7 |
} |
//TODO: déplacer les fonctions ci dessus et dessous dans une classe |
// utilitaire |
public function supprimerAccents($str, $charset='utf-8') { |
private function supprimerAccents($str, $charset='utf-8') { |
$str = htmlentities($str, ENT_NOQUOTES, $charset); |
$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str); |
/trunk/services/modules/0.1/observations/VoteObservation.php |
---|
40,7 → 40,6 |
* Méthode seulement présente pour interdire proprement l'accès à la consultation |
* */ |
public function consulter($ressources, $parametres) { |
$this->configurer(); |
//TODO: faut il vérifier quelque chose, si on n'a pas renseigné les valeurs correctement |
/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; |
} |
} |
/trunk/services/modules/0.1/determinations/ValiderDetermination.php |
---|
24,6 → 24,9 |
private $bdd; |
private $parametres = array(); |
private $ressources = array(); |
private $idObs = null; |
private $idProposition = null; |
private $idAuteurObs = null; |
public function __construct(Conteneur $conteneur = null) { |
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur; |
34,92 → 37,107 |
public function modifier($ressources, $parametres) { |
$this->verifierParametres($ressources, $parametres); |
$id_proposition = $ressources[1]; |
$this->idProposition = $ressources[1]; |
$e = $this->modifierObservationParDetermination(); |
$e = $this->modifierObservationParDetermination($id_proposition, $parametres['auteur.id']); |
if($e == 'ok' || $e == 'OK' || $e == 'Not Modified') { |
if ($e == 'ok' || $e == 'OK' || $e == 'Not Modified') { |
RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK); |
return; |
} else { |
throw new Exception("Erreur: le web service du CEL a retourné : $e", RestServeur::HTTP_CODE_ERREUR); |
} |
throw new Exception("error: Cel returned \"$e\"", RestServeur::HTTP_CODE_ERREUR); |
} |
public function verifierParametres($ressources, $parametres) { |
private function verifierParametres($ressources, $parametres) { |
$erreurs = array(); |
if (!is_numeric($ressources[1])) { |
$erreurs[] = '- le paramètre indiquant l\'identifiant de la proposition doit être numérique ;'; |
$erreurs[] = '- la ressource indiquant l\'identifiant de la proposition doit être numérique'; |
} |
//Le paramètre auteur.id (id de l'auteur de la détermination) |
// est là pour éviter que le $_POST ne soit vide |
if (!isset($parametres['auteur.id'])) { |
$erreurs[] = '- paramètre "auteur.id" manquant ;'; |
$erreurs[] = "- le paramètre 'auteur.id' est manquant"; |
} |
if ($erreurs) { |
throw new Exception("Erreur lors de la configuration :\n" . implode("\n", $erreurs), |
RestServeur::HTTP_CODE_ERREUR); |
$msg = "Erreur dans les paramètres d'appel au web service :\n" . implode("\n", $erreurs); |
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR); |
} |
} |
/* |
/** |
* 1) récupère l'observation, autrement échec |
* 2) récupère et l'auteur officiel et valide l'authentification (match sur $_POST['auteur.id'] et $_SESSION), autrement échec |
* 3) prépare les nouvelles valeurs à mettre à jour dans cel_obs depuis del_commentaire |
* 2) récupère et l'id auteur de l'obs et vérfie qu'il correspond à l'id de l'utilisateur actuel |
* 3) prépare les nouvelles valeurs à transférer au service CEL |
* 4) effectue la mise à jour |
* 5) si tout s'est passé comme convenu, marque la proposition comme "retenue" |
*/ |
private function modifierObservationParDetermination($id_proposition, $auteurId) { |
$champs_a_modifier = array('nom_sel', 'nom_sel_nn', 'nom_ret', 'nom_ret_nn', 'nom_referentiel'); |
private function modifierObservationParDetermination() { |
$propositionInfos = $this->getInfosProposition(); |
$this->idObs = $propositionInfos['ce_observation']; |
$this->idAuteurObs = $this->getIdAuteurObs(); |
$this->verifierDroitUtilisateur(); |
// obtenirInformationDetermination() |
// TODO: else { LIMIT 1 ? } |
$proposition = $this->bdd->recuperer(sprintf('SELECT ce_observation, id_commentaire, %s FROM del_commentaire WHERE id_commentaire = %d AND %s', |
implode(',', $champs_a_modifier), |
intval($id_proposition), |
$auteurId ? 'ce_utilisateur = ' . $this->bdd->proteger($auteurId) : 1)); |
$parametres = array( |
'id_observation' => $this->idObs, |
'nom_sel_nn' => $propositionInfos['nom_sel_nn'], |
'nom_referentiel' => $propositionInfos['nom_referentiel'], |
'id_utilisateur' => $this->idAuteurObs); |
if(! $proposition) { |
$urlBase = $this->conteneur->getParametre('urlServiceCelObs'); |
$url = $urlBase.$this->idObs; |
$retour = $this->conteneur->getRestClient()->modifier($url, $parametres); |
// TODO: check sur HTTP code == 200, plutôt que sur texte |
if ($retour == 'ok' || $retour == 'OK') { |
$this->mettreAJourPropositionRetenue(); |
} |
return $retour; |
} |
private function getInfosProposition() { |
$idPropositionP = $this->bdd->proteger($this->idProposition); |
$requete = "SELECT id_commentaire, ce_observation, nom_sel_nn, nom_referentiel ". |
'FROM del_commentaire '. |
"WHERE id_commentaire = $idPropositionP ". |
' -- '.__FILE__.' : '.__LINE__; |
$resultat = $this->bdd->recuperer($requete); |
if (! $resultat) { |
throw new Exception("Cette proposition est invalide.", RestServeur::HTTP_CODE_ERREUR); |
} |
return $resultat; |
} |
private function getIdAuteurObs() { |
$obsIdP = $this->bdd->proteger($this->idObs); |
$requete = 'SELECT ce_utilisateur '. |
'FROM del_observation '. |
"WHERE id_observation = $obsIdP ". |
' -- '.__FILE__.' : '.__LINE__; |
$auteurInfo = $this->bdd->recuperer($requete); |
return $auteurInfo['ce_utilisateur']; |
} |
$obsId = $proposition['ce_observation']; |
// obtenirInformationsObservation() |
$realAuteurId = $this->bdd->recuperer(sprintf('SELECT ce_utilisateur FROM del_observation WHERE id_observation = %d', |
intval($obsId))); |
$realAuteurId = $realAuteurId['ce_utilisateur']; // XXX: PHP-5.3 |
private function verifierDroitUtilisateur() { |
$controleAcces = $this->conteneur->getControleAcces(); |
$utilisateurInfos = $controleAcces->getInfosUtilisateurConnecte(); |
$utilisateurId = $utilisateurInfos['id_utilisateur']; |
if(! $this->validationReqOriginMatchObsAuthor($realAuteurId)) { |
throw new Exception("Seul l'utilisateur ayant saisi l'observation peut la valider : veuillez vous identifier.\n", |
RestServeur::HTTP_CODE_ERREUR); |
if ($this->idAuteurObs != $utilisateurId) { |
$msg = "Seul l'utilisateur ayant saisi l'observation peut la valider : veuillez vous identifier.\n"; |
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR); |
} |
$parametres_formates = array_intersect_key($proposition, |
array_flip($champs_a_modifier)); |
$parametres_formates = array_merge($parametres_formates, |
array('id_observation' => $obsId, |
'ce_utilisateur' => $realAuteurId, |
// on change la "certitude" de l'observation correspondante |
'certitude' => 'Certaine', |
'obsKeywordDelete' => 'adeterminer')); |
$ret = $this->conteneur->getRestClient()->modifier($this->conteneur->getParametre('url_service_validation_base') . $obsId, |
$parametres_formates); |
// cf cel/jrest/services/CelValidationObservation.php::updateElement() |
// TODO: check sur HTTP code == 200, plutôt que sur texte |
if($ret == 'ok' || $ret == 'OK') { |
// remet à 0 le status "proposition_retenue" pour toutes les propositions faites sur cette |
// observation à l'exception de celle désormais validée |
$this->bdd->requeter(sprintf('UPDATE del_commentaire SET proposition_retenue = IF(id_commentaire = %d, 1, 0)' . |
' WHERE ce_observation = %d -- %s', |
$proposition['id_commentaire'], $obsId, __FILE__ . ':' . __LINE__)); |
} |
return $ret; |
} |
private function validationReqOriginMatchObsAuthor($ce_utilisateur) { |
$controle_utilisateur = $this->conteneur->getControleAcces(); |
$utilisateur_connecte = $controle_utilisateur->getInfosUtilisateurConnecte(); |
return $ce_utilisateur == $utilisateur_connecte['id_utilisateur']; |
/** |
* Remet à 0 le status "proposition_retenue" pour toutes les propositions faites sur cette |
* observation à l'exception de celle désormais validée |
*/ |
private function mettreAJourPropositionRetenue() { |
$requete = 'UPDATE del_commentaire '. |
"SET proposition_retenue = IF(id_commentaire = {$this->idProposition}, 1, 0) ". |
"WHERE ce_observation = {$this->idObs} ". |
' -- '.__FILE__.' : '.__LINE__; |
return $this->bdd->requeter($requete); |
} |
} |
/trunk/services/configurations/config.defaut.ini |
---|
67,22 → 67,19 |
url_service_base = "{ref:url_base}service:del:0.1/" |
; URL de base des services d'eFlore |
url_service_base_eflore = "{ref:url_base}service:eflore:0.1/" |
; URL de base des services du CEL |
url_service_base_cel = "{ref:url_base}service:cel:" |
urlServiceBaseCel = "{ref:url_base}service-test:cel:" |
; Service du CEL pour manipuler une image à distance |
urlServiceCelImage = "{ref:urlServiceBaseCel}CelImage/"; |
; Service du CEL pour manipuler une observation à distance |
urlServiceCelObs = "{ref:urlServiceBaseCel}CelObs/"; |
; URL de base des services appelé lors de la validation |
; un POST est effectué à cette adresse, ce qui tolère les réécritures d'URL |
; mais non les 30x. En cas de Cel distinct d'Eflore, et indépendemment de l'URI, |
; pointer vers l'hôte final, eg: http://moncel/jrest/CelValidationObservation/ |
url_service_validation_base = "{ref:url_service_base_cel}CelValidationObservation/"; |
; |
url_service_suppression_image = "{ref:url_service_base_cel}CelSuppressionImage/"; |
; URL de base du service appelé pour autocompléter les noms de taxons |
url_service_completion_base = "{ref:url_service_base_eflore}%s/noms?masque=%s&recherche=etendue&retour.format=min&navigation.limite=50&ns.structure=au"; |
; +------------------------------------------------------------------------------------------------------+ |
; Espaces de noms |
; Espaces de noms |
cheminDelCommun = "../commun" |
; +------------------------------------------------------------------------------------------------------+ |
/trunk/services/configurations/config_observations.ini |
---|
14,10 → 14,7 |
; +------------------------------------------------------------------------------------------------------+ |
; Config spécifique au projet |
; Noms des services disponibles pour ce projet |
servicesDispo = "observation, vote" |
[mapping_observation] |
id_observation = "id_observation" |
date_observation = "date_observation" |
/trunk/services |
---|
Property changes: |
Added: svn:mergeinfo |
Merged /branches/v1.2-lithium/services:r1676 |
Merged /branches/v1.0-hydrogene/services:r1507 |