* @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); } } } ?>