Rev 1503 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Le web service récupére un identifiant de proposition et appelle un service web externe* (du cel) afin de modifier le nom de l'observation associée par celui de la proposition** @category php 5.2* @package del* @subpackage images* @author Aurélien Peronnet <aurelien@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* @version $Id$* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images*/class ValiderDetermination {private $conteneur;private $navigation;private $masque;private $gestionBdd;private $bdd;private $parametres = array();private $ressources = array();public function __construct(Conteneur $conteneur = null) {$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;$this->conteneur->chargerConfiguration('config_determinations.ini');$this->gestionBdd = $conteneur->getGestionBdd();$this->bdd = $this->gestionBdd->getBdd();}public function modifier($ressources, $parametres) {$this->verifierParametres($ressources, $parametres);$id_proposition = $ressources[1];$e = $this->modifierObservationParDetermination($id_proposition, $parametres['auteur.id']);if($e == 'ok' || $e == 'OK' || $e == 'Not Modified') {RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK);return;}throw new Exception("error: Cel returned \"$e\"", RestServeur::HTTP_CODE_ERREUR);}public 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 ;';}//Le paramètre auteur.id (id de l'auteur de la détermination)// est là pour éviter que le $_POST ne soit videif (!isset($parametres['auteur.id'])) {$erreurs[] = '- paramètre "auteur.id" manquant ;';}if ($erreurs) {throw new Exception("Erreur lors de la configuration :\n" . implode("\n", $erreurs),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* 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');// 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));if(! $proposition) {throw new Exception("Cette proposition est invalide.", RestServeur::HTTP_CODE_ERREUR);}$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.3if(! $this->validationReqOriginMatchObsAuthor($realAuteurId)) {throw new Exception("Seul l'utilisateur ayant saisi l'observation peut la valider : veuillez vous identifier.\n",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 texteif($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 = new ControleAcces($this->conteneur);$utilisateur_connecte = $controle_utilisateur->getInfosUtilisateurConnecte();return $ce_utilisateur == $utilisateur_connecte['id_utilisateur'];}}