Subversion Repositories eFlore/Applications.cel

Rev

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

<?php
// declare(encoding='UTF-8');
/**
 * Service de liaisons de mots clés à des observations.
 * Le service lie une ou plusieurs mots clés à une ou plusieurs observations
 * 
 * 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) {
        
        }
        
        public function createElement($pairs) {
                
                // Controle detournement utilisateur
                session_start();
                $this->controleUtilisateur($pairs['ce_utilisateur']);
        
                if (!isset($pairs['mots_cles']) || !isset($pairs['observations']) || !isset($pairs['ce_utilisateur'])) {
                        return;
                }
                
                $observations = explode(',',$pairs['observations']);
                $mots_cles = explode(',',$pairs['mots_cles']);
                
                $gestionnaire_observation = new RechercheObservation($this->config);
                $ids_obs = $gestionnaire_observation->obtenirIdObservationsPourOrdre($pairs['ce_utilisateur'],$observations);
                                
                $requete_liaison_mots_cles = 'INSERT INTO cel_obs_mots_cles '.
                                                                   '(id_observation, id_mot_cle_utilisateur)'.
                                                                   'VALUES (';
                                                                   
                foreach($ids_obs as $obs) {
                        foreach($mots_cles as $mot) {
                                $requete_liaison_mots_cles .= '('.$obs.','.$mot.')';
                        }
                        $this->regenererIndexTexteMotCleObservation($obs, $pairs['ce_utilisateur']);
                }

                $resultat_liaison_mots_cles = $this->executer($requete_liaison_mots_cles);
                
                if(!$resultat_liaison_mots_cles) {
                        $this->logger('CEL_bugs', "Erreur d'ajout de mots clés à des obs : ".$requete_liaison_mots_cles);     
                }
                
                return $resultat_liaison_mots_cles;             
        }

        public function deleteElement($uid){
                $retour = false;
                
                // Controle detournement utilisateur
                session_start();
                $this->controleUtilisateur($uid[0]);
        
                if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2])) {
                        return;
                }
                
                $mots_cle = $this->nettoyerMotsCles($uid[2]);
                $mots_cle = $this->proteger($mots_cle);
                
                $ordre_observations = $uid[1];
                $id_utilisateur = $uid[0];
                
                $gestionnaire_observation = new RechercheObservation($this->config);
                $ids_obs = $gestionnaire_observation->obtenirIdObservationsPourOrdre($id_utilisateur,$ordre_observations);
                
                $requete_suppression_liaison_mot_cle = 'DELETE FROM cel_obs_mots_cles WHERE ';
                                                                                           'id_observation IN ('.implode(',',$ids_obs).') '.
                                                                                           'AND id_mot_cle_utilisateur IN ('.$mots_cle.')';
                
                $resultat_suppression_mot_cle = $this->executer($requete_suppression_liaison_mot_cle);
                
                if ($resultat_suppression_mot_cle) {
                        $retour = true;
                } else {
                        $message = "Erreur de suppression des mots clés de plusieurs observations : $requete";
                        $this->logger($message);
                }
                
                foreach($ids_obs as $obs) {
                        $this->regenererIndexTexteMotCleObservation($obs, $id_utilisateur);     
                }

                return $retour;
        }
        
        private function regenererIndexTexteMotCleObservation($id_observation, $identifiant_utilisateur) {
                $mots_cles_obs = $this->obtenirMotsClesObs($id_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, $id_observation, $identifiant_utilisateur);
                }
        }
        
        //TODO : a refaire 
        
        private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_observation, $identifiant_utilisateur) {
                $requete =      'UPDATE cel_obs '.
                                        'SET mots_cles_texte = '.$this->proteger($mots_cles_texte_chaine).' '.
                                        'WHERE id_observation = '.$this->proteger($id_observation).
                                        '       AND identifiant = '.$this->proteger($identifiant_utilisateur);
                
                $this->executerRequeteSimple($requete);
        }
        
        private function obtenirMotsClesTexte($id_observation, $identifiant_utilisateur) {
                $requete =      'SELECT mots_cles_texte '.
                                        'FROM cel_obs '.
                                        'WHERE id_observation = '.$this->proteger($id_observation).
                                        '       AND identifiant = '.$this->proteger($identifiant_utilisateur);
                
                $resultats = $this->executerRequete($requete);
                                
                return $resultats;
        }
        
        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 (id_observation, id_mot_cle_utilisateur) '.
                                                                'VALUES '.$requete_values.' ';
                                        echo $requete.'<br />';
                                        $i++;
                                }
                        }
                }
        }
        
        private function estUnIdentifiantMotCle($chaine) {
                return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
        }
}
?>