Rev 1666 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Le web service image récupère toutes les données de la table del_obs_images* pour retourner une liste d'images associée à une observation** @category php 5.2* @package del* @subpackage images* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @copyright Copyright (c) 2012, 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: Bdd.php 403 2012-02-22 14:35:20Z gduche $* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images*/class VotesImage {private $imageIds = array();private $conteneur;private $navigation;private $masque;protected $gestionBdd;protected $bdd;private $ressources;private $parametres;public function __construct(Conteneur $conteneur = null) {$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;$this->conteneur->chargerConfiguration('config_votes.ini');$this->conteneur->chargerConfiguration('config_mapping_votes.ini');$this->navigation = $conteneur->getNavigation();$this->masque = $conteneur->getMasque();$this->gestionBdd = $conteneur->getGestionBdd();$this->bdd = $this->gestionBdd->getBdd();}/*** Méthode principale de la classe.* Lance la récupération des images dans la base et les place dans un objet ResultatService* pour l'afficher.* @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)* @param array $parametres les paramètres situés après le ? dans l'url* */public function consulter($ressources, $parametres) {// Gestion des configuration du script$this->ressources = $ressources;$this->parametres = $parametres;$this->configurer();$this->verifierConfiguration();// Lancement du service$votes = $this->chargerVotes();$total = $this->compterVotes();$this->navigation->setTotal($total);// Mettre en forme le résultat et l'envoyer pour affichage$resultat = new ResultatService();$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $votes);return $resultat;}public function ajouter($ressources, $parametres) {$this->verifierParametresAjoutModif($ressources, $parametres);$insertion = 'INSERT INTO del_image_vote '.'(ce_image, ce_protocole, ce_utilisateur, valeur, date) '.'VALUES ('.$this->proteger($ressources[0]).','.$this->proteger($parametres['protocole']).','.$this->proteger($parametres['utilisateur']).','.$this->proteger($parametres['valeur']).', '.'NOW()'.');';$resultat = $this->bdd->requeter($insertion);if ($resultat == false) {throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);} else {// ATTENTION : idVote doit être récupéré avant toute nouvelle requete !$idVote = $this->bdd->recupererIdDernierAjout();self::updateStats($this->bdd, $ressources[0], $parametres['protocole']);$resultat = new ResultatService();$resultat->corps = array('id_vote' => $idVote);return $resultat;}}public function modifier($ressources, $parametres) {$this->verifierParametresAjoutModif($ressources, $parametres);//TODO: est il nécessaire de tester si ça existe et renoyer une erreur 404// si l'on vote ? Cela peut ralentir considérablement les choses// une contrainte d'unicité sur le triplet image, protocole, vote existe,// ça suffira pour provoquer une erreur 500$modification = 'UPDATE del_image_vote '.'SET valeur = '.$this->proteger($parametres['valeur']).', '.' date = NOW() '.'WHERE '.' ce_image = '.$this->proteger($ressources[0]).' AND '.' ce_protocole = '.$this->proteger($parametres['protocole']).' AND '.' ce_utilisateur = '.$this->proteger($parametres['utilisateur']).' ';$resultat = $this->bdd->requeter($modification);if ($resultat == false) {throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);}self::updateStats($this->bdd, $ressources[0],$parametres['protocole']);return 'ok';}public function supprimer($ressources) {$id_image = $ressources[0];$id_vote = $ressources[2];$id_vote_p = $this->proteger($id_vote);$requete_infos_vote = "SELECT * FROM del_image_vote WHERE id_vote = $id_vote_p ";$infos_vote = $this->bdd->recuperer($requete_infos_vote);if ($infos_vote == false) {throw new Exception("Aucun vote ne correspond à cet identifiant", RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);}$controle_acces = $this->conteneur->getControleAcces();$utilisateur = $controle_acces->getInfosUtilisateurConnecte();if (isset($utilisateur['id_utilisateur']) &&$utilisateur['id_utilisateur'] != $infos_vote['ce_utilisateur'] &&$controle_acces->getIdAnonymeTemporaire() != $infos_vote['ce_utilisateur']) {$message = "Vous n'êtes pas autorisé à supprimer le vote : $id_vote";throw new Exception($message, RestServeur::HTTP_CODE_ACCES_NON_AUTORISE);}$suppression = "DELETE FROM del_image_vote WHERE id_vote = $id_vote_p ";$resultat = $this->bdd->requeter($suppression);if ($resultat == false) {throw new Exception("Impossible de supprimer le vote", RestServeur::HTTP_CODE_ERREUR);}self::updateStats($this->bdd, $ressources[0],$infos_vote['ce_protocole']);}// intermédiaire pour la méthode contenue dans "Commun"static function updateStats($db, $id_image, $id_proto) {return TelaBotanica\Del\Commun\Stats::updateStats($db, $id_image, $id_proto);}/*-------------------------------------------------------------------------------CONFIGURATION DU SERVICE--------------------------------------------------------------------------------*//*** Configuration du service en fonction du fichier de config config_del.ini* */public function configurer() {$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');$this->mappingVotes = $this->conteneur->getParametre('mapping_votes');}/*** Vérifier que le service est bien configuré* */public function verifierConfiguration() {$erreurs = array();$tableauImages = $this->conteneur->getParametre('images');if (empty($tableauImages)) {$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;';} else {if ($this->conteneur->getParametre('url_service') == null) {$erreurs[] = '- paramètre "url_service" manquant ;';}}if (empty($this->mappingVotes)) {$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_votes] ou celui-ci est vide ;';} else {$champsMappingObs = array('ce_protocole','id_vote','valeur','ce_image', 'ce_utilisateur', 'nom', 'prenom');foreach ($champsMappingObs as $champ) {if (!isset($this->mappingVotes[$champ])) {$erreurs[] = '- le mapping du champ "'.$champ.'" pour le vote est manquant ;';}}}if (!empty($erreurs)) {$e = 'Erreur lors de la configuration : '."\n";$e .= implode("\n", $erreurs);throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);}}public function verifierParametresAjoutModif($ressources, $parametres) {$erreurs = array();if (!is_numeric($ressources[0])) {$erreurs[] = '- le paramètre indiquant l\'identifiant de l\'image doit être numérique ;';}if (!isset($parametres['utilisateur'])) {$erreurs[] = '- paramètre "utilisateur" manquant ;';}if (!isset($parametres['protocole'])) {$erreurs[] = '- paramètre "id_protocole" manquant ;';} else {if (!is_numeric($parametres['protocole'])) {$erreurs[] = '- le paramètre "protocole" doit être numérique ;';}}if (!isset($parametres['valeur'])) {$erreurs[] = '- paramètre "valeur" manquant ;';} else {if (!is_numeric($parametres['valeur'])) {$erreurs[] = '- le paramètre "valeur" doit être numérique ;';}}if (!empty($erreurs)) {$e = 'Erreur lors de la configuration : '."\n";$e .= implode("\n", $erreurs);throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);}}public function verifierParametresSuppression($ressources, $parametres) {$erreurs = array();if (!is_numeric($ressources[0])) {$erreurs[] = '- le paramètre indiquant l\'identifiant de l\'image doit être numérique ;';}/*if (!is_numeric($parametres['id_protocole'])) {$erreurs[] = '- le paramètre indiquant l\'identifiant du vote doit être numérique ;';}*/if (!empty($erreurs)) {$e = 'Erreur lors de la configuration : '."\n";$e .= implode("\n", $erreurs);throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);}}/*** Charger la clause WHERE en fonction des paramètres de masque* */private function chargerClauseWhere() {$where[] = 'WHERE ce_image = '.$this->proteger($this->ressources[0]);if (isset($this->parametres['protocole'])) {$where[] = 'ce_protocole = '.$this->proteger($this->parametres['protocole']);}return implode(' AND ', $where);}/*-------------------------------------------------------------------------------CHARGEMENT DES IMAGES--------------------------------------------------------------------------------*//*** Charger les votes pour chaque image* */private function chargerVotes() {$requeteVotes = 'SELECT * FROM del_image_vote '.$this->chargerClauseWhere();$resultatsVotes = $this->bdd->recupererTous($requeteVotes);$votes = $this->formaterVotes($resultatsVotes);return $votes;}/*** Compter le nombre total d'images dans la base pour affichage dans entete.* */private function compterVotes() {$requete = 'SELECT FOUND_ROWS() AS nbre ';$resultats = $this->bdd->recuperer($requete);return (int) $resultats['nbre'];}/*-------------------------------------------------------------------------------FORMATER ET METTRE EN FORME--------------------------------------------------------------------------------*//*** Formater une observation depuis une ligne liaison* @param $liaison liaison issue de la recherche* @return $observation l'observation mise en forme* */private function formaterVotes($votes) {$retour = array();foreach ($votes as $vote) {foreach ($vote as $p => $valeur) {$retour[$vote['id_vote']][$this->mappingVotes[$p]] = $valeur;}}return $retour;}private function proteger($valeur) {if (is_array($valeur)) {return $this->bdd->protegerTableau($valeur);} else {return $this->bdd->proteger($valeur);}}}?>