Rev 1845 | Rev 1849 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Web service permetant d'ajouter ou de modifier les votes associés aux propositions d'une observation.** @category DEL* @package Services* @subpackage Observations* @version 0.1* @author Mathias CHOUET <mathias@tela-botanica.org>* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @author Aurelien PERONNET <aurelien@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 VoteObservation extends RestService {private $conteneur;private $bdd;private $navigation;private $mapping;private $ressources;private $parametres;public function __construct(Conteneur $conteneur = null) {$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;$this->bdd = $this->conteneur->getBdd();$this->navigation = $conteneur->getNavigation();$this->mapping = $this->conteneur->getParametreTableau('votes.mapping');}public function consulter($ressources, $parametres) {$this->ressources = $ressources;$this->parametres = $parametres;$votes = $this->chargerVotes();$this->conteneur->getNavigation()->setTotal(count($votes));// Mettre en forme le résultat et l'envoyer pour affichage$resultat = new ResultatService();$resultat->corps = array('entete' => $this->navigation->getEntete(), 'resultats' => $votes);return $resultat;}private function chargerVotes() {$idCommentaireP = $this->bdd->proteger($this->ressources[1]);$requete = 'SELECT * '.'FROM del_commentaire_vote '."WHERE ce_proposition = $idCommentaireP ";' -- '.__FILE__.':'.__LINE__;$resultats = $this->bdd->recupererTous($requete);$votes = array();foreach ($resultats as $vote) {$votes[$vote['id_vote']] = $this->formaterVotes($vote);$utilisateur = $this->chercherUtilisateur($vote['ce_utilisateur']);if (count($utilisateur) > 0) {$votes[$vote['id_vote']] = array_merge($votes[$vote['id_vote']], $utilisateur);}}return $votes;}private function formaterVotes($vote) {$retour = array();foreach ($vote as $param => $valeur) {$retour[$this->mapping[$param]] = $valeur;}return $retour;}private function chercherUtilisateur($id) {// par défaut, pas d'info$utilisateur = array();// Si l'id utilisateur est un hash de session, on ne cherche rienif (is_numeric($id)) {$idUtilisateurP = $this->bdd->proteger($id);$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', "."courriel AS 'auteur.courriel' ".'FROM del_utilisateur '."WHERE id_utilisateur = $idUtilisateurP ".' -- '.__FILE__.':'.__LINE__;$utilisateur = $this->bdd->recuperer($requete);}return $utilisateur;}public function ajouter($ressources, $parametres) {$this->ressources = $ressources;$this->parametres = $parametres;$this->verifierParametresAjoutModif();// Vérifie si la proposition existe, et la crée sinon// (cas du vote sur la proposition fabriquée à partir de l'observation originale)$idProposition = $this->ressources[1];if ($idProposition == 0) {$idProposition = $this->renvoyerIdOuCreerPropositionDeterminationInitiale($idProposition);}$idPropositionP = $this->bdd->proteger($idProposition);$idUtilisateurP = $this->bdd->proteger($parametres['utilisateur']);$valeurP = $this->bdd->proteger($parametres['valeur']);$requete = 'INSERT INTO del_commentaire_vote (ce_proposition , ce_utilisateur , valeur , date) '."VALUES ($idPropositionP, $idUtilisateurP, $valeurP, NOW()) ".' -- '.__FILE__.' : '.__LINE__;$resultats = $this->bdd->requeter($requete);if ($resultats == false) {RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);} else {RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_CREATION_OK);}}private function renvoyerIdOuCreerPropositionDeterminationInitiale($id_observation) {$proposition_existe = $this->propositionInitialeExiste($id_observation);if(!$proposition_existe) {$id_proposition = $this->creerPropositionAPartirObservation($id_observation);} else {$requete = 'SELECT id_commentaire '.'FROM del_commentaire '."WHERE ce_observation = $id_observation ".'AND proposition_initiale = 1 '.' -- '.__FILE__.' : '.__LINE__;$resultat = $this->bdd->recuperer($requete);$id_proposition = $resultat['id_commentaire'];}return $id_proposition;}private function propositionInitialeExiste($id_observation) {$requete = 'SELECT COUNT(*) >= 1 AS existe '.'FROM del_commentaire '."WHERE ce_observation = $id_observation ".'AND proposition_initiale = 1 '.' -- '.__FILE__.' : '.__LINE__;$resultat = $this->bdd->recuperer($requete);return $resultat['existe'] == 1;}private function creerPropositionAPartirObservation($id_observation) {$idObservationP = $this->bdd->proteger($id_observation);$requete = 'INSERT IGNORE INTO del_commentaire '.'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.'SELECT id_observation, ce_utilisateur, prenom, nom, '.' courriel, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, '." nt, famille, 'bdtfx_v1', NOW(), '1' ".'FROM del_observation do '.' LEFT JOIN del_utilisateur du ON (do.ce_utilisateur = du.id_utilisateur) '."WHERE id_observation = $idObservationP ".' -- '.__FILE__.' : '.__LINE__;$this->bdd->executer($requete);// Attention à l'abstraction utilisée, récupérer le dernier id en mysql ou msqli ça marche bien, mais pour d'autres moins$id = $this->bdd->recupererIdDernierAjout();return $id;}public function modifier($ressources, $parametres) {$this->ressources = $ressources;$this->parametres = $parametres;$this->verifierParametresAjoutModif();// Si l'identifiant de proposition vaut 0, c'est un vote sur une proposition// fabriquée à partir de l'observation originale, dont on doit obtenir l'id// (cas où l'on vient de voter pour celle et cela a créé la proposition, puis// on revote pour celle ci en changeant d'avis sans recharger la page)$idProposition = $this->ressources[1];if ($idProposition == 0) {$idProposition = $this->renvoyerIdOuCreerPropositionDeterminationInitiale($idProposition);if ($idProposition == null) {$msg = "Aucun identifiant de proposition n'est lié à cette observation.";throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);}}$idPropositionP = $this->bdd->proteger($idProposition);$idUtilisateurP = $this->bdd->proteger($parametres['utilisateur']);$valeurP = $this->bdd->proteger($parametres['valeur']);$requete = 'UPDATE del_commentaire_vote '."SET valeur = $valeurP, date = NOW() "."WHERE ce_proposition = $idPropositionP AND ce_utilisateur = $idUtilisateurP ".' -- '.__FILE__.' : '.__LINE__;$resultats = $this->bdd->requeter($requete);if ($resultats == false) {RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);} else {RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK);}}private function verifierParametresAjoutModif() {$erreurs = array();if (!isset($this->parametres['utilisateur'])) {$erreurs[] = 'Paramètre "utilisateur" manquant.';}if (!isset($this->parametres['valeur'])) {$erreurs[] = 'Paramètre "valeur" manquant.';} else {if (!is_numeric($this->parametres['valeur'])) {$erreurs[] = 'Le paramètre "valeur" doit être numérique.';} elseif($this->parametres['valeur'] != 0 && $this->parametres['valeur'] != 1) {$erreurs[] = 'Le paramètre "valeur" ne peut prendre que la valeur 0 ou 1.';}}if (!empty($erreurs)) {$msg = "Erreur lors de la configuration : \n".implode("\n", $erreurs);throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);}}}