Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

<?php

/**
* PHP Version 5
*
* @category  PHP
* @package   jrest
* @author    Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version   SVN: <svn_id>
* @link      /doc/jrest/
*/

/**
* Classe de gestion de l'ajout, modification et suppression des champs supplémentaires des obs et images
* 
* in=utf8
* out=utf8
*
*/ 
class GestionChampsTags extends Cel {
        
        private $mode = null;
        private $table_tags = null;
        private $champ_id = null;
        
        public function GestionChampsTags($config, $mode) {
                parent::__construct($config);
                $this->mode = $mode;
                
                if($this->mode == 'obs') {
                        $this->mode = 'obs';
                        $this->table_tags = 'cel_obs_tags';
                        $this->champ_id = 'id_observation';
                } else if($this->mode == 'image') {
                        $this->mode = 'image';
                        $this->table_tags = 'cel_images_tags';
                        $this->champ_id = 'id_image';
                } else {
                        throw new Exception('Mode inconnu, les modes autorisés sont "obs" et "image"');
                }               
        }
        
        /**
        * Renvoie true ou false suivant que l'element indiqué possède une valeur
        * pour la clé indiquée
        *
        * @param int $id_element_lie
        * @param string $cle
        * @param string $valeur
        * @return bool
        */
        public function tagExistePourElement($id_element_lie, $cle) {
                $requete = "SELECT COUNT(*) >= 1 as existe FROM ".$this->table_tags." ".
                                        "WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie)." ".
                                        "AND cle = ".$this->proteger($cle);

                $resultat = $this->executerRequete($requete);
                return ($resultat[0]['existe'] == "1");
        }
        
        /**
        * Renvoie tous les champs taggés associé à l'élément passé en paramètre
        *
        * @param int $id_element_lie
        * @return array
        */
        public function obtenirTagsPourElement($id_element_lie) {
                $requete = "SELECT * FROM ".$this->table_tags." ".
                                                "WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie)." ";
        
                $resultat = $this->executerRequete($requete);
                return $resultat;
        }
        
        /**
        * Renvoie tous les champs taggés associé aux éléments passés en paramètre
        * Sous forme tableau de tableaux associatifs clé valeur regroupé par id d'élement
        *
        * @param array $ids_element_lies
        * @return array
        */
        public function obtenirTagsPourElementsMultiples($ids_element_lies) {
                
                $ids_element_lies = array_map(array($this, 'proteger'),$ids_element_lies);
                
                $requete = "SELECT * FROM ".$this->table_tags." ".
                                                        "WHERE ".$this->champ_id." IN (".implode(',',$ids_element_lies).") ";

                $resultats = $this->executerRequete($requete);
                
                $champs_tagges_par_element = array();
                
                foreach ($resultats as &$ligne) {
                        $id_element = $ligne[$this->champ_id];
                        if(!isset($champs_tagges_par_element[$id_element])) {
                                $champs_tagges_par_element[$id_element] = array();
                        }
                        $champs_tagges_par_element[$id_element][$ligne['cle']] = $ligne['valeur'];
                }
                
                return $champs_tagges_par_element;
        }
        
        /**
         * Ajoute un champ taggé à l'élément passé en paramètre, 
         * si la clé existe déjà, seule valeur du champ est mise à jour
         *
         * @param int $id_element_lie
         * @param string $cle
         * @param string $valeur
         * @return bool 
         */
        public function ajouterTag($id_element_lie, $cle, $valeur) {
                $requete = "INSERT INTO ".$this->table_tags." ".
                           "(".$this->champ_id.", cle, valeur) ".
                           "VALUES (".$this->proteger($id_element_lie).",".$this->proteger($cle).",".$this->proteger($valeur).") ".
                           "ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";

                // la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour 
                // où l'on change de sgbd
                $ajout = $this->executerRequeteSimple($requete);
                return ($ajout !== false);
        }
        
        /**
        * Ajoute des champs taggés à l'élément passé en paramètre,
        * si la clé existe déjà, seule la valeur du champ est mise à jour
        *
        * @param int $id_element_lie
        * @param array $cles_valeurs tableau de clés => valeurs à associer à l'élément
        * @return bool
        */
        public function ajouterTagsMultiples($id_element_lie, $cles_valeurs) {
                                
                $lignes = array();
                foreach($cles_valeurs as $cle => $valeur) {
                        $lignes[] = "(".$this->proteger($id_element_lie).",".$this->proteger($cle).",".$this->proteger($valeur).")";
                }
                
                $requete = "INSERT INTO ".$this->table_tags." ".
                                   "(".$this->champ_id.", cle, valeur) ".
                                   "VALUES ".implode(',', $lignes)." ".
                                   "ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
        
                // la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
                // où l'on change de sgbd
                $ajout = $this->executerRequeteSimple($requete);
                return ($ajout !== false);
        }
        
        /**
        * Ajoute des champs taggés aux éléments passés en paramètre,
        * si la clé existe déjà, seule la valeur du champ est mise à jour
        *
        * @param array $elements_cles_valeurs tableau associatif de la forme id, cle, valeur
        * @return bool
        */
        public function ajouterTagsMultiplesAElementsMultiples($elements_cles_valeurs) {
        
                $lignes = array();
                foreach($elements_cles_valeurs as &$element) {
                        $lignes[] = "(".$this->proteger($element['id']).",".$this->proteger($element['cle']).",".$this->proteger($element['valeur']).")";
                }
        
                $requete = "INSERT INTO ".$this->table_tags." ".
                                           "(".$this->champ_id.", cle, valeur) ".
                                           "VALUES ".implode(',', $lignes)." ".
                                           "ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";

                // la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
                // où l'on change de sgbd
                $ajout = $this->executerRequeteSimple($requete);
                return ($ajout !== false);
        }
        
        /**
         * Modifie un champ taggé associé à l'élément passé en paramètre
         *
         * @param int $id_element_lie
         * @param string $cle
         * @param string $valeur
         * @return bool 
         */
        public function modifierTag($id_element_lie, $cle, $valeur) {
                $requete = "UPDATE ".$this->table_tags." ".
                                           "SET valeur = ".$this->proteger($valeur)." ".
                                           "WHERE cle = ".$this->proteger($cle)." AND ".
                                                   $this->champ_id." = ".$this->proteger($id_element_lie);
                
                $modif = $this->executerRequeteSimple($requete);
                return ($modif !== false);
        }
        
        /**
        * Supprime le champ taggé associé à l'élément et au nom de clé passés en paramètre 
        *
        * @param int $id_element_lie
        * @param string $cle
        * @return bool
        */
        public function supprimerTag($id_element_lie, $cle) {
                $requete = "DELETE FROM ".$this->table_tags." ".
                                        "WHERE cle = ".$this->proteger($cle)." AND ".
                                        $this->champ_id." = ".$this->proteger($id_element_lie);
                
                $suppr = $this->executerRequeteSimple($requete);
                return ($suppr !== false);
        }
        
        /**
        * Supprime tous les champs taggé associés à l'élément passés en paramètre
        *
        * @param int $id_element_lie
        * @return bool
        */
        public function supprimerTagsAElement($id_element_lie) {
                $requete = "DELETE FROM ".$this->table_tags." ".
                                                        "WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie);
                
                $suppr = $this->executerRequeteSimple($requete);
                return ($suppr !== false);
        }
}
?>