| 934 | aurelien | 1 | <?php
 | 
        
           |  |  | 2 | // ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 | 
        
           |  |  | 3 | /**
 | 
        
           |  |  | 4 | * PHP Version 5
 | 
        
           |  |  | 5 | *
 | 
        
           |  |  | 6 | * @category  PHP
 | 
        
           |  |  | 7 | * @package   jrest
 | 
        
           |  |  | 8 | * @author    Aurélien Peronnet <aurelien@tela-botania.org>
 | 
        
           |  |  | 9 | * @copyright 2010 Tela-Botanica
 | 
        
           |  |  | 10 | * @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
 | 
        
           |  |  | 11 | * @version   SVN: <svn_id>
 | 
        
           |  |  | 12 | * @link      /doc/jrest/
 | 
        
           |  |  | 13 | */
 | 
        
           |  |  | 14 |   | 
        
           |  |  | 15 | /**
 | 
        
           |  |  | 16 | * in : utf8
 | 
        
           |  |  | 17 | * out : utf8
 | 
        
           |  |  | 18 | *
 | 
        
           |  |  | 19 | * Librairie de liaison d'images et d'observation à des mots clés
 | 
        
           |  |  | 20 | *
 | 
        
           |  |  | 21 | */
 | 
        
           |  |  | 22 | class LiaisonMotsCles extends Cel {
 | 
        
           |  |  | 23 |   | 
        
           |  |  | 24 | 	const SEPARATEUR_MOT_CLE_TEXTE = '##';
 | 
        
           |  |  | 25 | 	private $mode = 'obs';
 | 
        
           |  |  | 26 |   | 
        
           |  |  | 27 | 	public function LiaisonMotsCles($config, $mode) {
 | 
        
           | 958 | aurelien | 28 | 		parent::__construct($config);
 | 
        
           | 934 | aurelien | 29 | 		$this->mode = $mode;
 | 
        
           |  |  | 30 | 	}
 | 
        
           |  |  | 31 |   | 
        
           |  |  | 32 | 	public function ajouterLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) {
 | 
        
           |  |  | 33 |   | 
        
           | 970 | aurelien | 34 | 		$champ = ($this->mode == 'obs') ? 'id_observation' : 'id_image';
 | 
        
           |  |  | 35 |   | 
        
           | 958 | aurelien | 36 | 		// le mot clé ignore est spécifique mysql, mais il est utilisé ici pour des raisons
 | 
        
           |  |  | 37 | 		// de performance, à remplacer par un test sur les mots clés déjà existant si ça gène
 | 
        
           |  |  | 38 | 		$requete_liaison_mots_cles = 'INSERT IGNORE INTO cel_'.$this->mode.'_mots_cles '.
 | 
        
           | 970 | aurelien | 39 | 								   '('.$champ.', id_mot_cle_utilisateur) '.
 | 
        
           | 958 | aurelien | 40 | 								   'VALUES ';
 | 
        
           | 934 | aurelien | 41 |   | 
        
           |  |  | 42 | 		foreach($ids_images_ou_obs as $id_image_ou_obs) {
 | 
        
           |  |  | 43 | 			foreach($mots_cles as $mot) {
 | 
        
           | 958 | aurelien | 44 | 				$requete_liaison_mots_cles .= '('.$id_image_ou_obs.','.$this->proteger($mot).'),';
 | 
        
           | 934 | aurelien | 45 | 			}
 | 
        
           | 958 | aurelien | 46 | 			$this->regenererIndexTexteMotCle($id_image_ou_obs, $id_utilisateur);
 | 
        
           | 934 | aurelien | 47 | 		}
 | 
        
           | 958 | aurelien | 48 |   | 
        
           |  |  | 49 | 		$requete_liaison_mots_cles = rtrim($requete_liaison_mots_cles,',');
 | 
        
           | 970 | aurelien | 50 |   | 
        
           |  |  | 51 | 		echo $requete_liaison_mots_cles;
 | 
        
           | 934 | aurelien | 52 | 		$resultat_liaison_mots_cles = $this->executer($requete_liaison_mots_cles);
 | 
        
           |  |  | 53 |   | 
        
           |  |  | 54 | 		if(!$resultat_liaison_mots_cles) {
 | 
        
           |  |  | 55 | 			$this->logger('CEL_bugs', 'Erreur d\'ajout de mots clés à des '.$this->mode.' : '.$requete_liaison_mots_cles);
 | 
        
           |  |  | 56 | 		}
 | 
        
           |  |  | 57 |   | 
        
           |  |  | 58 | 		return $resultat_liaison_mots_cles;
 | 
        
           |  |  | 59 | 	}
 | 
        
           |  |  | 60 |   | 
        
           | 970 | aurelien | 61 | 	public function supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_images_ou_obs, $mots_cles) {
 | 
        
           |  |  | 62 |   | 
        
           |  |  | 63 | 		$retour = $this->supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles);
 | 
        
           |  |  | 64 |   | 
        
           |  |  | 65 | 		foreach($ids_images_ou_obs as $image_ou_obs) {
 | 
        
           |  |  | 66 | 			$this->regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur);
 | 
        
           |  |  | 67 | 		}
 | 
        
           |  |  | 68 |   | 
        
           |  |  | 69 | 		return $retour;
 | 
        
           |  |  | 70 | 	}
 | 
        
           |  |  | 71 |   | 
        
           | 934 | aurelien | 72 | 	public function supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) {
 | 
        
           |  |  | 73 |   | 
        
           |  |  | 74 | 		$champ = ($this->mode == 'obs') ? 'id_observation' : 'id_image';
 | 
        
           |  |  | 75 |   | 
        
           | 958 | aurelien | 76 | 		$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_'.$this->mode.'_mots_cles WHERE '.
 | 
        
           | 934 | aurelien | 77 | 											   $champ.' IN ('.implode(',',$ids_images_ou_obs).') '.
 | 
        
           | 958 | aurelien | 78 | 											   'AND id_mot_cle_utilisateur IN ('.implode(',',$mots_cles).')';
 | 
        
           | 934 | aurelien | 79 |   | 
        
           |  |  | 80 | 		$resultat_suppression_mot_cle = $this->executer($requete_suppression_liaison_mot_cle);
 | 
        
           | 970 | aurelien | 81 |   | 
        
           |  |  | 82 | 		if ($requete_suppression_liaison_mot_cle !== false) {
 | 
        
           |  |  | 83 | 			$retour = true;
 | 
        
           |  |  | 84 | 		} else {
 | 
        
           |  |  | 85 | 			$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
 | 
        
           |  |  | 86 | 			$this->logger($message);
 | 
        
           |  |  | 87 |   | 
        
           |  |  | 88 | 			$retour = false;
 | 
        
           |  |  | 89 | 		}
 | 
        
           | 934 | aurelien | 90 |   | 
        
           | 970 | aurelien | 91 | 		return $retour;
 | 
        
           |  |  | 92 | 	}
 | 
        
           |  |  | 93 |   | 
        
           |  |  | 94 | 	public function supprimerToutesLiaisonsPourIdImageOuObs($id_utilisateur, $ids_images_ou_obs) {
 | 
        
           |  |  | 95 |   | 
        
           |  |  | 96 | 		$champ = ($this->mode == 'obs') ? 'id_observation' : 'id_image';
 | 
        
           |  |  | 97 |   | 
        
           |  |  | 98 | 		$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_'.$this->mode.'_mots_cles WHERE '.
 | 
        
           |  |  | 99 | 											   $champ.' IN ('.implode(',',$ids_images_ou_obs).') ';
 | 
        
           |  |  | 100 |   | 
        
           |  |  | 101 | 		$resultat_suppression_mot_cle = $this->executer($requete_suppression_liaison_mot_cle);
 | 
        
           |  |  | 102 |   | 
        
           |  |  | 103 | 		if ($requete_suppression_liaison_mot_cle !== false) {
 | 
        
           | 934 | aurelien | 104 | 			$retour = true;
 | 
        
           |  |  | 105 | 		} else {
 | 
        
           |  |  | 106 | 			$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
 | 
        
           |  |  | 107 | 			$this->logger($message);
 | 
        
           | 958 | aurelien | 108 |   | 
        
           |  |  | 109 | 			$retour = false;
 | 
        
           | 934 | aurelien | 110 | 		}
 | 
        
           |  |  | 111 |   | 
        
           | 958 | aurelien | 112 | 		return $retour;
 | 
        
           | 934 | aurelien | 113 | 	}
 | 
        
           |  |  | 114 |   | 
        
           |  |  | 115 | 	private function regenererIndexTexteMotCle($image_ou_obs, $identifiant_utilisateur) {
 | 
        
           |  |  | 116 |   | 
        
           | 958 | aurelien | 117 | 		$mots_cles = $this->obtenirMotsClesTexte($image_ou_obs, $identifiant_utilisateur);
 | 
        
           | 934 | aurelien | 118 |   | 
        
           |  |  | 119 | 		if (count($mots_cles) > 0) {
 | 
        
           |  |  | 120 | 			$mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($mots_cles);
 | 
        
           |  |  | 121 | 			$this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $image_ou_obs, $identifiant_utilisateur);
 | 
        
           |  |  | 122 | 		}
 | 
        
           |  |  | 123 | 	}
 | 
        
           |  |  | 124 |   | 
        
           |  |  | 125 | 	private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $identifiant_utilisateur) {
 | 
        
           | 958 | aurelien | 126 | 		$requete = 	'UPDATE '.(($this->mode == 'obs') ? 'cel_obs' : 'cel_images').' '.
 | 
        
           | 934 | aurelien | 127 | 					'SET mots_cles_texte = '.$this->proteger($mots_cles_texte_chaine).' '.
 | 
        
           |  |  | 128 | 					'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.$this->proteger($id_image_ou_obs).
 | 
        
           | 958 | aurelien | 129 | 					' AND ce_utilisateur = '.$this->proteger($identifiant_utilisateur);
 | 
        
           | 934 | aurelien | 130 |   | 
        
           | 958 | aurelien | 131 | 		return $this->executer($requete);
 | 
        
           | 934 | aurelien | 132 | 	}
 | 
        
           |  |  | 133 |   | 
        
           |  |  | 134 | 	private function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur) {
 | 
        
           | 958 | aurelien | 135 | 		$requete = 	'SELECT mot_cle '.
 | 
        
           |  |  | 136 | 					'FROM '.'cel_mots_cles_'.$this->mode.' '.
 | 
        
           |  |  | 137 | 					'WHERE id_mot_cle_utilisateur IN '.
 | 
        
           |  |  | 138 | 						'('.
 | 
        
           |  |  | 139 | 							'SELECT id_mot_cle_utilisateur '.
 | 
        
           |  |  | 140 | 							'FROM cel_'.$this->mode.'_mots_cles '.
 | 
        
           |  |  | 141 | 							'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.$this->proteger($id_image_ou_obs).
 | 
        
           |  |  | 142 | 						')'.
 | 
        
           |  |  | 143 | 					' AND ce_utilisateur = '.$this->proteger($identifiant_utilisateur);
 | 
        
           | 934 | aurelien | 144 |   | 
        
           | 958 | aurelien | 145 | 		$resultats = $this->requeter($requete);
 | 
        
           | 934 | aurelien | 146 |   | 
        
           |  |  | 147 | 		return $resultats;
 | 
        
           |  |  | 148 | 	}
 | 
        
           |  |  | 149 |   | 
        
           |  |  | 150 | 	private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
 | 
        
           |  |  | 151 | 		$mot_cles_texte_chaine = '';
 | 
        
           |  |  | 152 |   | 
        
           |  |  | 153 | 		if (is_array($tableau_mots_cles_texte)) {
 | 
        
           |  |  | 154 | 			foreach ($tableau_mots_cles_texte as $mot_cle) {
 | 
        
           |  |  | 155 | 				$mot_cles_texte_chaine .= $mot_cle['mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
 | 
        
           |  |  | 156 | 			}
 | 
        
           |  |  | 157 | 		}
 | 
        
           |  |  | 158 |   | 
        
           |  |  | 159 | 		$mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
 | 
        
           |  |  | 160 |   | 
        
           |  |  | 161 | 		return $mot_cles_texte_chaine;
 | 
        
           |  |  | 162 | 	}
 | 
        
           |  |  | 163 |   | 
        
           | 958 | aurelien | 164 | 	public function nettoyerMotsCles($chaine) {
 | 
        
           | 934 | aurelien | 165 | 		$valeur = str_replace('null', '', $chaine);
 | 
        
           |  |  | 166 | 		$valeur = trim($valeur, ';;');
 | 
        
           |  |  | 167 |   | 
        
           |  |  | 168 | 		return $valeur;
 | 
        
           |  |  | 169 | 	}
 | 
        
           |  |  | 170 | }
 | 
        
           |  |  | 171 | ?>
 |