Subversion Repositories eFlore/Applications.cel

Rev

Rev 816 | Rev 930 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Service de liaisons d'images à des observations.
 * Le service lie une ou plusieurs images à une ou plusieurs observations
 * Le service renvoie les observations liées à une image
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 *
 * Cas d'utilisation :
 *
 * @author Aurélien 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>
 * @version $Id$
 * @copyright © 2011, Tela-Botanica
 */
class InventoryKeyWordObsLink extends Cel {
        
        const SEPARATEUR_MOT_CLE_TEXTE = '##';
        const SEPARATEUR_MOT_CLE_ID = ';';
        
        public function getRessource() {
                //$this->migrerMotsClesDansTableLiaison();      
        }
        
        public function getElement($uid) {
        
        }

        // met à jour les associations des mots clés des observations
        public function updateElement($uid,$pairs) {
                // Controle detournement utilisateur
                session_start();
                if (($_SESSION['user'] != '') && $_SESSION['user']['name'] != $uid[0]) {
                        print "Acces interdit";
                        return;
                }
        
                if (!isset($pairs['mots_cles']) || !isset($uid[1])) {
                        return;
                }

                if (isset($pairs['action'])) {
                        $action = $pairs['action'];
                }

                $valeur = $pairs['mots_cles'];
                $valeur = $this->nettoyerMotsCles($valeur);
                $requete =      'UPDATE cel_inventory '.
                                        "SET mots_cles = REPLACE(CONCAT(IFNULL(mots_cles,''), '$valeur;'), 'null', '') ".
                                        "WHERE ordre IN ({$uid[1]}) AND identifiant = ".$this->proteger($uid[0]);

                $resultat = $this->executerRequeteSimple($requete);
                
                $retour = false;
                if ($resultat) {
                        $retour = true;
                } else {
                        $this->logger('CEL_bugs', "Erreur de mise à jour des mots clés d'une obs : $requete");
                }
                
                $tableau_id_obs = split(',', $uid[1]);
                foreach($tableau_id_obs as $ordre_obs) {
                        $this->regenererIndexTexteMotCleObservation($ordre_obs, $uid[0]);
                }

                return $retour;
        }

        public function deleteElement($uid){
                $retour = false;
                
                // Controle detournement utilisateur
                session_start();
                if ($_SESSION['user'] != '' && $_SESSION['user']['name'] != $uid[0]) {
                        print "Acces interdit";
                } else {
                        if (!isset($uid[2]) || !isset($uid[1])) {
                                print 'pas de mots clés';
                        } else {
                                $mot_cle = $this->nettoyerMotsCles($uid[2]);
                                $mot_cle = $this->proteger($mot_cle);
                
                                $requete =      'UPDATE cel_inventory '.
                                                        "SET mots_cles = REPLACE(REPLACE(mots_cles, '$mot_cle', ''), ';;', ';') ".
                                                        "WHERE ordre IN ({$uid[1]}) ".
                                                        "       AND identifiant = '".$DB->escapeSimple($uid[0])."'";
                                $resultat = $this->executerRequeteSimple($requete);
                
                                if ($resultat) {
                                        $retour = true;
                                } else {
                                        $e = "Erreur de suppression des mots clés de plusieurs observations : $requete";
                                        $this->logger('CEL_bugs', $e);
                                }
                        }
                }

                return $retour;
        }
        
        private function regenererIndexTexteMotCleObservation($ordre_observation, $identifiant_utilisateur) {
                $mots_cles_obs = $this->obtenirMotsClesObs($ordre_observation, $identifiant_utilisateur);
                
                if (count($mots_cles_obs) > 0) {
                        $tableau_texte_mots_cles = $this->obtenirMotClesTexte($mots_cles_obs[0]['mots_cles'], $identifiant_utilisateur);
                        $mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($tableau_texte_mots_cles);
                        $this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $ordre_observation, $identifiant_utilisateur);
                }
        }
        
        private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $ordre_observation, $identifiant_utilisateur) {
                $requete =      'UPDATE cel_inventory '.
                                        'SET mots_cles_texte = '.$this->proteger($mots_cles_texte_chaine).' '.
                                        'WHERE ordre = '.$this->proteger($ordre_observation).
                                        '       AND identifiant = '.$this->proteger($identifiant_utilisateur);
                
                $this->executerRequeteSimple($requete);
        }
        
        private function obtenirMotsClesObs($ordre_observation, $identifiant_utilisateur) {
                $requete =      'SELECT mots_cles '.
                                        'FROM cel_inventory '.
                                        'WHERE ordre = '.$this->proteger($ordre_observation).
                                        '       AND identifiant = '.$this->proteger($identifiant_utilisateur);
                
                $resultats = $this->executerRequete($requete);
                                
                return $resultats;
        }
        
        private function obtenirMotClesTexte($chaine_mot_cle, $identifiant_utilisateur) {
                $chaine_mot_cle_obs = $this->formaterChaineMotClePourConditionSql($chaine_mot_cle);
                
                $requete = 'SELECT cmc_mot_cle FROM cel_mots_cles_obs '.
                                        'WHERE cmc_id_mot_cle_utilisateur IN ('.$chaine_mot_cle_obs.') '.
                                        'AND cmc_id_proprietaire = '.$this->proteger($identifiant_utilisateur);
                                                                                                
                $resultat = $this->executerRequete($requete);
                
                return $resultat;
        }
        
        private function formaterChaineMotClePourConditionSql($chaine_mot_cle_obs) {
                $chaine_mot_cle_obs = $this->nettoyerMotsCles($chaine_mot_cle_obs);
                $chaine_mot_cle_obs = str_replace(self::SEPARATEUR_MOT_CLE_ID, ',', $chaine_mot_cle_obs);
                $chaine_mot_cle_obs = trim($chaine_mot_cle_obs, ',');
                
                return $chaine_mot_cle_obs;
        }
        
        private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
                $mot_cles_texte_chaine = '';
                
                if (is_array($tableau_mots_cles_texte)) { 
                        foreach ($tableau_mots_cles_texte as $mot_cle) {
                                $mot_cles_texte_chaine .= $mot_cle['cmc_mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
                        }
                }
                
                $mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
                
                return $mot_cles_texte_chaine;
        }
        
        private function nettoyerMotsCles($chaine) {
                $valeur = str_replace('null', '', $chaine);
                $valeur = trim($valeur, ';;');
                
                return $valeur;
        }
        
        private function migrerMotsClesDansTableLiaison() {
                $requete =      'SELECT id, ordre, identifiant, mots_cles '.
                                        'FROM cel_inventory '.
                                        'WHERE TRIM(mots_cles) != "" ';
                $obs_mots_cles = $this->executerRequete($requete);
                
                echo '<pre>'.print_r($obs_mots_cles, true).'</pre>';
                
                $max = 20000;
                $i = 0;
                foreach ($obs_mots_cles as $obs_mc) {
                        $mots_cles_nettoyes = $this->nettoyerMotsCles($obs_mc['mots_cles']);
                        $tableau_mots_cles_codes = split(self::SEPARATEUR_MOT_CLE_ID, $mots_cles_nettoyes);
                        
                        $requete_values = '';
                        
                        if (count($tableau_mots_cles_codes) > 0) {
                                foreach($tableau_mots_cles_codes as $mots_cles_codes) {
                                        $mots_cles_codes = trim($mots_cles_codes, self::SEPARATEUR_MOT_CLE_ID);
                                        if ($this->estUnIdentifiantMotCle($mots_cles_codes)) {                                                  
                                                $requete_values .= '('.$mots_cles_codes.','.$obs_mc['id'].'),';
                                        }
                                }
                                
                                $requete_values = rtrim($requete_values, ',');
                                if (trim($requete_values) != '') { 
                                        $requete =      'INSERT IGNORE INTO cel_obs_mots_cles (ce_observation, ce_mot_cle) '.
                                                                'VALUES '.$requete_values.' ';
                                        echo $requete.'<br />';
                                        $i++;
                                }
                        }
                }
        }
        
        private function estUnIdentifiantMotCle($chaine) {
                return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
        }
}
?>