Subversion Repositories eFlore/Applications.del

Rev

Blame | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Ajoute un ou plusieurs mots-clés en les associant à un identifiant d'image
 *
 * @category   DEL
 * @package    Services
 * @subpackage MotsCles
 * @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 AjouterMotCle {

        private $conteneur;
        private $bdd;
        private $parametres = array();
        private $idDernierAjout = null;
        private $nbreMotsClesAjoutes = null;

        public function __construct(Conteneur $conteneur = null) {
                $this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
                $this->bdd = $this->conteneur->getBdd();
        }

        /**
         * Ajoute un mot-clé si les objets fournis en paramètres sont valides
         * 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 ajouter($ressources, $parametres) {
                $this->parametres = $parametres;

                // Gestion des configuration du script
                $this->verifierParametres();
                $this->insererMotCle();
                TelaBotanica\Del\Commun\MotsClesImage::updateStats($this->bdd, $this->parametres['image']);

                // Mettre en forme le résultat et l'envoyer pour affichage
                $resultat = new ResultatService();
                $resultat->corps = array('nbre' => $this->nbreMotsClesAjoutes, 'id' => $this->idDernierAjout);

                return $resultat;
        }

        public function verifierParametres() {
                $erreurs = array();

                if (!isset($this->parametres['image'])) {
                        $erreurs[] = " - impossible d'ajouter un mot clé sans l'indication de l'identifiant de l'image associée";
                } else if(!is_numeric($this->parametres['image'])) {
                        $erreurs[] = " - l'identifiant d'image doit être un entier";
                }

                if (!isset($this->parametres['mot_cle'])) {
                        $erreurs[] = " - impossible d'ajouter un mot clé sans le mot clé";
                }

                if (!isset($this->parametres['auteur.id'])) {
                        $erreurs[] = " - impossible d'ajouter un mot clé sans l'identifiant de l'auteur associé";
                }

                if (!empty($erreurs)) {
                        $msg = "Erreur de configuration :\n".implode("\n", $erreurs);
                        throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                }
        }

        /**
         * Insère un mot clé dans la table
         * */
        private function insererMotCle() {
                $clauseValues = $this->creerClauseValues();
                $requete = 'INSERT INTO del_image_tag '.
                        '(ce_image, ce_utilisateur, tag, tag_normalise, date, actif, date_modification) '.
                        "VALUES $clauseValues ".
                        ' -- '.__FILE__.' : '.__LINE__;
                $nbreInsertion = $this->bdd->executer($requete);
                $idDernierAjout = $this->bdd->recupererIdDernierAjout();
                if ($nbreInsertion == null) {
                        $msgTpl = "Erreur lors de l'insertion d'un des tags «%s» pour l'image «%s» de l'auteur «%s»";
                        $msg = sprintf($msgTpl, $this->parametres['mot_cle'], $this->parametres['image'], $this->parametres['auteur.id']);
                        throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
                }
                $this->nbreMotsClesAjoutes = $nbreInsertion;
                $this->listerIdAjoutes($idDernierAjout, $nbreInsertion);
        }

        private function listerIdAjoutes($dernierId, $nbreInsertion) {
                $this->idDernierAjout[] = $dernierId;
                for ($i = 1 ; $i <= ($nbreInsertion - 1); $i++ ) {
                        $this->idDernierAjout[] = ++$dernierId;
                }
        }

        private function creerClauseValues() {
                $id_image = intval($this->parametres['image']);
                $idImageP = $this->bdd->proteger($id_image);
                $id_auteur = $this->parametres['auteur.id'];
                $idAuteurP = $this->bdd->proteger($id_auteur);
                $mots_cles = explode(',', $this->parametres['mot_cle']);

                $values = array();
                foreach ($mots_cles as $mot_cle) {
                        $motCleP = $this->bdd->proteger(trim($mot_cle));
                        $mot_cle_normalise = TelaBotanica\Del\Commun\MotsClesImage::normaliserMotCle($mot_cle);
                        $motCleNormaliseP = $this->bdd->proteger($mot_cle_normalise);

                        $values[] = "($idImageP, $idAuteurP, $motCleP, $motCleNormaliseP, NOW(), 1, NOW())";
                }
                $clauseValues = implode(',', $values);
                return $clauseValues;
        }
}