Subversion Repositories eFlore/Applications.cel

Rev

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

<?php
/**
* @package   jrest
* @author    Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010, 2013 Tela-Botanica
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
*
* Librairie de liaison d'images et d'observation à des mots clés en utilisant la méthode
* path enumeration
*/

class GestionMotsClesChemin {
        
        private $config;
        private $mode;
        
        private $table_liaison;
        private $table_mots_cles;
        
        public function GestionMotsClesChemin($config, $mode) {
                $this->config = $config;
                //TODO: switch suivant mode
                $this->table_liaison = 'cel_obs_tag_path_liaison';
                $this->table_mots_cles = 'cel_obs_tag_path';
        }
        
        public function obtenirArbre($id_utilisateur, $chemin = "/") {

                $requete = "SELECT * FROM ".$this->table_mots_cles." ".
                "WHERE id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." AND ".
                "chemin LIKE = ".Cel::db()->proteger($chemin."%")." ".
                "ORDER BY chemin"
                
                $arbre = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);    
                usort($arbre, array('GestionMotsClesChemin', 'comparerProfNoeuds');
                
                return $arbre;
        }
        
        public function insererParChemin($mot_cle, $chemin, $id_utilisateur) {
                
                $chemin_mot_cle = rtrim($chemin, '/').'/'.self::simplifier($mot_cle);
                
                $requete = "INSERT INTO ".$this->table_mots_cles." (chemin, id_utilisateur, tag) ".
                           "VALUES (".
                                        Cel::db()->proteger($chemin_mot_cle).", ".
                                                Cel::db()->proteger($id_utilisateur).", ".
                                                Cel::db()->proteger($tag).", ".
                           ")";
                
                $insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
                
                return $insertion;
        }
        
        public function insererParIdParent($mot_cle, $id_parent, $id_utilisateur) {
                
                $mot_cle_simp = self::simplifier($mot_cle);
                
                $sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." ".
                                       "WHERE id_tag = "Cel::db()->proteger($id_parent).")";
                
                $requete = "INSERT INTO ".$this->table_mots_cles."(chemin, id_utilisateur, tag) ".
                           "VALUES (".
                                                "CONCAT($sous_requete_chemin.",",".Cel::db()->proteger($mot_cle_simp).",'/') ".
                                                Cel::db()->proteger($id_utilisateur).", ".
                                                Cel::db()->proteger($tag).", ".
                           ")";
                
                $insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
                
                return $insertion;
        }
        
        public function lierParId($id_mot_cle, $id_observation, $id_utilisateur) {
                
                $sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." ".
                                                "WHERE id_tag = ".Cel::db()->proteger($id_mot_cle).") ";
                
                $requete = "INSERT INTO ".$this->table_liaison." (id_obs, chemin, id_utilisateur) ".
                                        "VALUES (".
                                                Cel::db()->proteger($id_observation).", ".
                                                $sous_requete_chemin.","
                                                Cel::db()->proteger($id_utilisateur)." ".
                                        ") ".
                                        "ON DUPLICATE KEY UPDATE id_obs = id_obs; ";
                
                $liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
                
                return $liaison;
        }
        
        public function lierParChemin($chemin, $id_observation, $id_utilisateur) {
                                
                $requete = "INSERT INTO ".$this->table_liaison." (id_obs, chemin, id_utilisateur) ".
                                        "VALUES (".
                                                Cel::db()->proteger($id_observation).", ".
                                                Cel::db()->proteger($sous_requete_chemin).", ".
                                                Cel::db()->proteger($id_utilisateur)." ".
                                        ") ".
                                        "ON DUPLICATE KEY UPDATE id_obs = id_obs; ";
                
                $liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
                
                return $liaison;
        }
        
        // Déplacer un mot clé et le renommer est une même opération, dans le cas du renommage,
        // seule la fin du chemin change
        public function renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur) {
                // TODO : triggers pour les tables liées ?
                $requete = "UPDATE ".$this->$table_mots_cles." ".
                       //    "SET tag = "                                   
                                   "WHERE chemin LIKE ".Cel::db()->proteger($ancien_chemin."%")." AND ".
                           "id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";   
                
        }
        
        public function supprimerChemin($chemin, $id_utilisateur) {
                // TODO : triggers pour les tables liées ?
                $requete = "DELETE FROM ".$this->$table_mots_cles." ".
                        "WHERE chemin LIKE ".Cel::db()->proteger($chemin."%")." AND ".
                        "id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";   

                $suppression = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
                
                return $suppression;
                        
        }
        
        // Fonctions utilitaires        
        static public function comparerProfNoeuds($a, $b) {
                
                $nb_slashs_a = substr_count($a['chemin'], '/');
                $nb_slashs_b = substr_count($a['chemin'], '/');
                $cmp = 0;
                
                if($nb_slashs_a == $nb_slashs_b) {
                        $cmp = strcmp($a['chemin'], $b['chemin']);
                } else {
                        $cmp = ($a['chemin'] > $b['chemin']) ? +1 : -1;
                }
                
                return $cmp;
        }
        
        /*
                CREATE TRIGGER maj_chemin BEFORE UPDATE
                ON cel_obs_tag_path FOR EACH ROW 
                BEGIN
                        UPDATE cel_obs_tag_path_liaison
                        SET cel_obs_tag_path_liaison.chemin = NEW.CHEMIN
                        WHERE cel_obs_tag_path_liaison.chemin LIKE CONCAT(OLD.chemin,'%')
                        AND cel_obs_tag_path_liaison.id_utilisateur = OLD.id_utilisateur
                END;
                
                CREATE TRIGGER suppr_chemin BEFORE UPDATE
                ON cel_obs_tag_path FOR EACH ROW 
                BEGIN
                        DELETE FROM cel_obs_tag_path_liaison
                        WHERE cel_obs_tag_path_liaison.chemin LIKE CONCAT(OLD.chemin,'%')
                        AND cel_obs_tag_path_liaison.id_utilisateur = OLD.id_utilisateur
                END;
                
                CREATE TRIGGER suppr_obs BEFORE DELETE
                ON cel_obs FOR EACH ROW 
                BEGIN
                        DELETE FROM cel_obs_tag_path_liaison
                        WHERE cel_obs_tag_path_liaison.id_obs = OLD.id_observation
                END;
        */
        
        // fonction de slugification du mot clé
        // http://stackoverflow.com/questions/2955251/php-function-to-make-slug-url-string
        static public function simplifier($text)
        {
                // replace non letter or digits by -
                $text = preg_replace('~[^\\pL\d]+~u', '-', $text);
        
                // trim
                $text = trim($text, '-');
        
                // transliterate
                $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
        
                // lowercase
                $text = strtolower($text);
        
                // remove unwanted characters
                $text = preg_replace('~[^-\w]+~', '', $text);
        
                if (empty($text))
                {
                        return 'n-a';
                }
        
                return $text;
        }
}

?>