| 823 | jpm | 1 | <?php
 | 
        
           |  |  | 2 | // declare(encoding='UTF-8');
 | 
        
           |  |  | 3 | /**
 | 
        
           |  |  | 4 |  * Classe mère permettant de rassembler les manipulation concernant les mots clés.
 | 
        
           |  |  | 5 |  * Pour l'utiliser, il suffit d'étendre votre service avec cette classe à la place de Cel.
 | 
        
           |  |  | 6 |  * Encodage en entrée : utf8
 | 
        
           |  |  | 7 |  * Encodage en sortie : utf8
 | 
        
           |  |  | 8 |  *
 | 
        
           |  |  | 9 |  * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
 | 
        
           |  |  | 10 |  * @author Aurélien PERONNET <aurelien@tela-botanica.org>
 | 
        
           |  |  | 11 |  * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 | 
        
           |  |  | 12 |  * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 | 
        
           |  |  | 13 |  * @version $Id$
 | 
        
           |  |  | 14 |  * @copyright © 2011, Tela-Botanica
 | 
        
           |  |  | 15 |  */
 | 
        
           |  |  | 16 | // TODO : compléter la classe avec des méthdodes de modification, suppression et consultation des mots-clés.
 | 
        
           |  |  | 17 | // TODO : ajout vérification de la non présence du caractère '|' dans les chaines utilisateurs...
 | 
        
           |  |  | 18 | class CelMotCle extends Cel {
 | 
        
           | 1353 | aurelien | 19 |   | 
        
           | 823 | jpm | 20 | 	const OBS_RACINE_ID = 'racine_obs';
 | 
        
           |  |  | 21 | 	const OBS_RACINE_NOM = 'Projets';
 | 
        
           |  |  | 22 | 	const OBS_TABLE_SUFFIXE = '_obs';
 | 
        
           | 1353 | aurelien | 23 |   | 
        
           | 823 | jpm | 24 | 	const IMG_RACINE_ID = 'racine';
 | 
        
           |  |  | 25 | 	const IMG_RACINE_NOM = 'Mots clés';
 | 
        
           |  |  | 26 | 	const IMG_TABLE_SUFFIXE = '_images';
 | 
        
           | 830 | jpm | 27 |   | 
        
           | 1353 | aurelien | 28 | 	const SEPARATEUR_MOT_CLE_TEXTE = ',';
 | 
        
           |  |  | 29 | 	const SEPARATEUR_MOT_CLE_ID_OBS = ',';
 | 
        
           |  |  | 30 | 	const SEPARATEUR_MOT_CLE_ID_IMG = ',';
 | 
        
           |  |  | 31 |   | 
        
           | 823 | jpm | 32 | 	/**
 | 
        
           |  |  | 33 | 	 * @var String permet de savoir si nous avons à faire à un mot clé d'observation ou d'image.
 | 
        
           |  |  | 34 | 	 */
 | 
        
           |  |  | 35 | 	private $suffix = '';
 | 
        
           | 1353 | aurelien | 36 |   | 
        
           | 823 | jpm | 37 | 	/**
 | 
        
           |  |  | 38 | 	 * @var String identifiant de l'utilisateur dont nous gérons les mots-clés.
 | 
        
           |  |  | 39 | 	 */
 | 
        
           |  |  | 40 | 	private $utilisateur_id = '';
 | 
        
           | 1353 | aurelien | 41 |   | 
        
           |  |  | 42 | 	public function lierMotCleObs($utilisateur_id, Array $mots_cles_ids, Array $ids) {
 | 
        
           |  |  | 43 | 		$this->suffix = self::OBS_TABLE_SUFFIXE;
 | 
        
           |  |  | 44 | 		$this->utilisateur_id = $utilisateur_id;
 | 
        
           | 1354 | aurelien | 45 | 		return $this->lierMotCle($utilisateur_id, $mots_cles_ids, $ids);
 | 
        
           | 1353 | aurelien | 46 | 	}
 | 
        
           | 1896 | jpm | 47 |   | 
        
           | 1353 | aurelien | 48 | 	public function lierMotCleImg($utilisateur_id, Array $mots_cles_ids, Array $ids) {
 | 
        
           |  |  | 49 | 		$this->suffix = self::IMG_TABLE_SUFFIXE;
 | 
        
           |  |  | 50 | 		$this->utilisateur_id = $utilisateur_id;
 | 
        
           | 1354 | aurelien | 51 | 		return $this->lierMotCle($utilisateur_id, $mots_cles_ids, $ids);
 | 
        
           | 1353 | aurelien | 52 | 	}
 | 
        
           | 1896 | jpm | 53 |   | 
        
           | 830 | jpm | 54 | 	/**
 | 
        
           | 1353 | aurelien | 55 | 	* Lie un mot-clé à une ou plusieurs images ou obs suivant le suffixe en cours.
 | 
        
           |  |  | 56 | 	*
 | 
        
           |  |  | 57 | 	* @param String $utilisateur_id identifiant de l'utilisateur.
 | 
        
           |  |  | 58 | 	* @param Array $mots_cles_ids tableau d'ids des mot-clé.
 | 
        
           |  |  | 59 | 	* @param Array $ids un tableau d'ids d'obs ou img (int) qui seront associées aux mots clés.
 | 
        
           |  |  | 60 | 	*/
 | 
        
           |  |  | 61 | 	public function lierMotCle($utilisateur_id, Array $mots_cles_ids, Array $ids) {
 | 
        
           | 830 | jpm | 62 | 		$retour = false;
 | 
        
           | 1353 | aurelien | 63 |   | 
        
           |  |  | 64 | 		if ($this->contenirNbresEntiers($ids)) {
 | 
        
           | 1896 | jpm | 65 |   | 
        
           | 1353 | aurelien | 66 | 			$champ_objet_lie = ($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'id_observation' : 'id_image';
 | 
        
           |  |  | 67 | 			$champ_mot_cle = ($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'id_mot_cle_obs' : 'id_mot_cle_image';
 | 
        
           |  |  | 68 |   | 
        
           |  |  | 69 | 			// le mot clé ignore est spécifique mysql, mais il est utilisé ici pour des raisons
 | 
        
           |  |  | 70 | 			// de performance, à remplacer par un test sur les mots clés déjà existant si ça gène
 | 
        
           |  |  | 71 | 			$requete = "INSERT IGNORE INTO cel{$this->suffix}_mots_cles ".
 | 
        
           | 1896 | jpm | 72 | 				'('.$champ_objet_lie.', '.$champ_mot_cle.') '.
 | 
        
           |  |  | 73 | 				'VALUES ';
 | 
        
           |  |  | 74 |   | 
        
           | 1353 | aurelien | 75 | 			foreach($ids as $id) {
 | 
        
           |  |  | 76 | 				foreach($mots_cles_ids as $mot) {
 | 
        
           | 1765 | raphael | 77 | 					$requete .= '('.$id.','.Cel::db()->proteger($mot).'),';
 | 
        
           | 1353 | aurelien | 78 | 				}
 | 
        
           |  |  | 79 | 			}
 | 
        
           |  |  | 80 | 			$requete = rtrim($requete,',');
 | 
        
           | 1765 | raphael | 81 | 			$resultat = Cel::db()->executer($requete);
 | 
        
           | 1896 | jpm | 82 |   | 
        
           | 1353 | aurelien | 83 | 			// J'en suis ici
 | 
        
           | 830 | jpm | 84 | 			if ($resultat) {
 | 
        
           |  |  | 85 | 				$retour = true;
 | 
        
           | 1353 | aurelien | 86 | 				foreach ($ids as $id) {
 | 
        
           |  |  | 87 | 					$regeneration = $this->regenererIndexTexteMotCle($id);
 | 
        
           | 830 | jpm | 88 | 					if ($regeneration === false) {
 | 
        
           |  |  | 89 | 						$retour = false;
 | 
        
           |  |  | 90 | 					}
 | 
        
           |  |  | 91 | 				}
 | 
        
           |  |  | 92 | 			} else {
 | 
        
           |  |  | 93 | 				$e = "Erreur de mise à jour des mots clés d'une obs : $requete";
 | 
        
           |  |  | 94 | 				$this->logger('CEL_bugs', $e);
 | 
        
           |  |  | 95 | 				$this->messages[] = $e;
 | 
        
           |  |  | 96 | 			}
 | 
        
           |  |  | 97 | 		} else {
 | 
        
           |  |  | 98 | 			$this->messages[] = "Le tableau des ordres des obs ne contenait pas que des nombres entiers.";
 | 
        
           |  |  | 99 | 		}
 | 
        
           |  |  | 100 | 		return $retour;
 | 
        
           |  |  | 101 | 	}
 | 
        
           | 1353 | aurelien | 102 |   | 
        
           |  |  | 103 | 	private function contenirNbresEntiers($ordres) {
 | 
        
           |  |  | 104 | 		$ok = true;
 | 
        
           |  |  | 105 | 		foreach ($ordres as $ordre) {
 | 
        
           |  |  | 106 | 			if (! preg_match('/^[0-9]+$/', $ordre)) {
 | 
        
           |  |  | 107 | 				$this->debug[] = "Ordre pb : $ordre";
 | 
        
           |  |  | 108 | 				$ok = false;
 | 
        
           |  |  | 109 | 			}
 | 
        
           |  |  | 110 | 		}
 | 
        
           |  |  | 111 | 		return $ok;
 | 
        
           |  |  | 112 | 	}
 | 
        
           |  |  | 113 |   | 
        
           |  |  | 114 | 	private function regenererIndexTexteMotCle($id) {
 | 
        
           | 830 | jpm | 115 | 		$ok = false;
 | 
        
           | 1354 | aurelien | 116 | 		$mots_cles = $this->obtenirMotsClesTexte($id);
 | 
        
           |  |  | 117 | 		$mots_cles_concatenes = $this->concatenerMotsCles($mots_cles);
 | 
        
           |  |  | 118 | 		$ok = $this->mettreAJourMotsClesConcatenes($mots_cles_concatenes, $id);
 | 
        
           | 830 | jpm | 119 | 		return $ok;
 | 
        
           |  |  | 120 | 	}
 | 
        
           | 1353 | aurelien | 121 |   | 
        
           | 1354 | aurelien | 122 | 	private function obtenirMotsClesTexte($id_image_ou_obs) {
 | 
        
           |  |  | 123 | 		$requete = 	'SELECT mot_cle '.
 | 
        
           | 1896 | jpm | 124 | 			'FROM '.'cel_mots_cles'.$this->suffix.' '.
 | 
        
           |  |  | 125 | 			'WHERE id_mot_cle_'.(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'obs' : 'image').' IN '.
 | 
        
           |  |  | 126 | 			'('.
 | 
        
           |  |  | 127 | 				'SELECT id_mot_cle_'.(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'obs' : 'image').' '.
 | 
        
           |  |  | 128 | 				'FROM cel'.$this->suffix.'_mots_cles '.
 | 
        
           |  |  | 129 | 				'WHERE '.(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs).
 | 
        
           |  |  | 130 | 			')';
 | 
        
           | 1353 | aurelien | 131 |   | 
        
           | 1765 | raphael | 132 | 		$resultats = Cel::db()->requeter($requete);
 | 
        
           | 1354 | aurelien | 133 | 		return $resultats;
 | 
        
           | 830 | jpm | 134 | 	}
 | 
        
           | 1353 | aurelien | 135 |   | 
        
           | 830 | jpm | 136 | 	private function formaterIdsMotClePourClauseInSql($mot_cle_ids) {
 | 
        
           |  |  | 137 | 		$mot_cle_ids = $this->nettoyerMotsCles($mot_cle_ids);
 | 
        
           | 1353 | aurelien | 138 | 		$mot_cle_ids = str_replace(self::SEPARATEUR_MOT_CLE_ID_OBS, ',', $mot_cle_ids);
 | 
        
           | 830 | jpm | 139 | 		$mot_cle_ids = trim($mot_cle_ids, ',');
 | 
        
           |  |  | 140 | 		$mot_cle_ids_proteges = implode(',', $this->protegerTableau(explode(',', $mot_cle_ids)));
 | 
        
           |  |  | 141 | 		return $mot_cle_ids_proteges;
 | 
        
           |  |  | 142 | 	}
 | 
        
           | 1353 | aurelien | 143 |   | 
        
           | 830 | jpm | 144 | 	private function concatenerMotsCles(Array $mots_cles) {
 | 
        
           |  |  | 145 | 		$mot_cles_concatenes = '';
 | 
        
           |  |  | 146 | 		if (count($mots_cles) > 0) {
 | 
        
           | 1896 | jpm | 147 | 			$dedoublonage = array();
 | 
        
           | 830 | jpm | 148 | 			foreach ($mots_cles as $mot_cle) {
 | 
        
           | 1896 | jpm | 149 | 				if (array_key_exists($mot_cle['mot_cle'], $dedoublonage) === false) {
 | 
        
           |  |  | 150 | 					$dedoublonage[$mot_cle['mot_cle']] = 1;
 | 
        
           |  |  | 151 | 					$mot_cles_concatenes .= $mot_cle['mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
 | 
        
           |  |  | 152 | 				} else {
 | 
        
           |  |  | 153 | 					$dedoublonage[$mot_cle['mot_cle']]++;
 | 
        
           |  |  | 154 | 				}
 | 
        
           | 830 | jpm | 155 | 			}
 | 
        
           |  |  | 156 | 		}
 | 
        
           |  |  | 157 | 		$mot_cles_concatenes = rtrim($mot_cles_concatenes, self::SEPARATEUR_MOT_CLE_TEXTE);
 | 
        
           |  |  | 158 | 		return $mot_cles_concatenes;
 | 
        
           |  |  | 159 | 	}
 | 
        
           | 1353 | aurelien | 160 |   | 
        
           | 1354 | aurelien | 161 | 	private function mettreAJourMotsClesConcatenes($mots_cles, $id) {
 | 
        
           | 1765 | raphael | 162 | 		$mots_cles = Cel::db()->proteger($mots_cles);
 | 
        
           |  |  | 163 | 		$utilisateur_id = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 1353 | aurelien | 164 |   | 
        
           | 1354 | aurelien | 165 | 		$requete = 	'UPDATE cel'.$this->suffix." ".
 | 
        
           | 1353 | aurelien | 166 | 					"SET mots_cles_texte = $mots_cles ".
 | 
        
           | 1354 | aurelien | 167 | 					"WHERE id_".(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'observation' : 'image')." = $id ";
 | 
        
           |  |  | 168 |   | 
        
           | 1765 | raphael | 169 | 		$ok = Cel::db()->executer($requete) ? true : false;
 | 
        
           | 830 | jpm | 170 | 		return $ok;
 | 
        
           |  |  | 171 | 	}
 | 
        
           | 1353 | aurelien | 172 |   | 
        
           |  |  | 173 |   | 
        
           | 830 | jpm | 174 | 	private function nettoyerMotsCles($chaine) {
 | 
        
           |  |  | 175 | 		$valeur = str_replace('null', '', $chaine);
 | 
        
           |  |  | 176 | 		$valeur = trim($valeur, ';;');
 | 
        
           | 1353 | aurelien | 177 |   | 
        
           | 830 | jpm | 178 | 		return $valeur;
 | 
        
           |  |  | 179 | 	}
 | 
        
           | 1353 | aurelien | 180 |   | 
        
           |  |  | 181 | 	public function ajouterMotCleObs($utilisateur_id, $mot_cle, $mot_cle_parent_id) {
 | 
        
           | 823 | jpm | 182 | 		$this->suffix = self::OBS_TABLE_SUFFIXE;
 | 
        
           |  |  | 183 | 		$this->utilisateur_id = $utilisateur_id;
 | 
        
           | 1353 | aurelien | 184 | 		return $this->ajouterMotCle($mot_cle, $mot_cle_parent_id);
 | 
        
           | 823 | jpm | 185 | 	}
 | 
        
           | 1353 | aurelien | 186 |   | 
        
           |  |  | 187 | 	public function ajouterMotCleImg($utilisateur_id, $mot_cle, $mot_cle_parent_id) {
 | 
        
           | 823 | jpm | 188 | 		$this->suffix = self::IMG_TABLE_SUFFIXE;
 | 
        
           |  |  | 189 | 		$this->utilisateur_id = $utilisateur_id;
 | 
        
           | 1353 | aurelien | 190 | 		return $this->ajouterMotCle($mot_cle, $mot_cle_parent_id);
 | 
        
           | 823 | jpm | 191 | 	}
 | 
        
           | 1353 | aurelien | 192 |   | 
        
           |  |  | 193 | 	private function ajouterMotCle($mot_cle, $mot_cle_parent_id) {
 | 
        
           | 830 | jpm | 194 | 		$retour = true;
 | 
        
           | 823 | jpm | 195 | 		$this->ajouterMotCleRacine();
 | 
        
           | 1353 | aurelien | 196 | 		if ($this->verifierAbsence($mot_cle, $mot_cle_parent_id)) {
 | 
        
           |  |  | 197 | 			$mot_cle_id = $this->genererTagId($mot_cle);
 | 
        
           |  |  | 198 |   | 
        
           | 830 | jpm | 199 | 			$this->commencerTransaction();
 | 
        
           | 1353 | aurelien | 200 |   | 
        
           | 830 | jpm | 201 | 			$bornes = $this->retrouverBornesEtNiveau($mot_cle_parent_id);
 | 
        
           | 1353 | aurelien | 202 | 			$borne_pere = $bornes['bd'];
 | 
        
           |  |  | 203 | 			$niveau = $bornes['niveau'] + 1;
 | 
        
           |  |  | 204 | 			$bg = $bornes['bd'];
 | 
        
           | 830 | jpm | 205 | 			$bd = $bg + 1;
 | 
        
           |  |  | 206 | 			$mot_cle_encode = $this->encoderMotCle($mot_cle);
 | 
        
           | 1353 | aurelien | 207 |   | 
        
           | 1765 | raphael | 208 | 			$mot_cle_protege = Cel::db()->proteger($mot_cle);
 | 
        
           |  |  | 209 | 			$bg = Cel::db()->proteger($bg);
 | 
        
           |  |  | 210 | 			$bd = Cel::db()->proteger($bd);
 | 
        
           |  |  | 211 | 			$mot_cle_encode = Cel::db()->proteger($mot_cle_encode);
 | 
        
           |  |  | 212 | 			$mot_cle_id = Cel::db()->proteger($mot_cle_id);
 | 
        
           |  |  | 213 | 			$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           |  |  | 214 | 			$mot_cle_parent_id_protege = Cel::db()->proteger($mot_cle_parent_id);
 | 
        
           |  |  | 215 | 			$niveau = Cel::db()->proteger($niveau);
 | 
        
           | 1353 | aurelien | 216 |   | 
        
           | 830 | jpm | 217 | 			$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere) ? true : false;
 | 
        
           | 1353 | aurelien | 218 |   | 
        
           | 830 | jpm | 219 | 			$requete = 	"INSERT INTO  cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 220 | 						"VALUES ($mot_cle_id, $id_utilisateur, $mot_cle_protege, $mot_cle_encode,".
 | 
        
           |  |  | 221 | 						" $bg, $bd, $niveau, $mot_cle_parent_id_protege) ";
 | 
        
           |  |  | 222 |   | 
        
           | 830 | jpm | 223 | 			$transaction_reussie_2 = $this->executerSQL($requete);
 | 
        
           |  |  | 224 | 			if (!$transaction_reussie_2) {
 | 
        
           |  |  | 225 | 				$e = "Échec d'insertion du mot-clé : $requete ";
 | 
        
           |  |  | 226 | 				$this->messages[] = $e;
 | 
        
           |  |  | 227 | 			}
 | 
        
           | 1353 | aurelien | 228 |   | 
        
           | 830 | jpm | 229 | 			if ($transaction_reussie_1 && $transaction_reussie_2) {
 | 
        
           |  |  | 230 | 				$retour = $this->completerTransaction();
 | 
        
           |  |  | 231 | 			} else {
 | 
        
           |  |  | 232 | 				$retour = $this->annulerTransaction();
 | 
        
           |  |  | 233 | 			}
 | 
        
           | 823 | jpm | 234 | 		} else {
 | 
        
           | 1353 | aurelien | 235 | 			$e = "Le mot-clé '$mot_cle' existe déjà dans la table cel_mots_cles{$this->suffix}.";
 | 
        
           | 830 | jpm | 236 | 			$this->debug[] = $e;
 | 
        
           | 823 | jpm | 237 | 		}
 | 
        
           | 1353 | aurelien | 238 |   | 
        
           |  |  | 239 | 		$id = ($retour) ? $this->getIdMotCle($mot_cle, $mot_cle_parent_id) : false;
 | 
        
           |  |  | 240 | 		return $id;
 | 
        
           | 823 | jpm | 241 | 	}
 | 
        
           | 1353 | aurelien | 242 |   | 
        
           |  |  | 243 | 	private function genererTagId($tag) {
 | 
        
           |  |  | 244 | 		$id = ($this->getHashCode($tag) + ((mt_rand() / (double)mt_getrandmax()) * 10000));
 | 
        
           |  |  | 245 | 		$id = str_replace(',', '.', $id);
 | 
        
           |  |  | 246 | 		return $id;
 | 
        
           |  |  | 247 | 	}
 | 
        
           |  |  | 248 |   | 
        
           |  |  | 249 | 	private function getHashCode($chaine){
 | 
        
           |  |  | 250 | 		$hash = 0;
 | 
        
           |  |  | 251 | 		$stringLength = strlen($chaine);
 | 
        
           |  |  | 252 | 		for ($i = 0; $i < $stringLength; $i++) {
 | 
        
           |  |  | 253 | 			$hash = 31 * $hash + $chaine[$i];
 | 
        
           |  |  | 254 | 		}
 | 
        
           |  |  | 255 | 		return $hash;
 | 
        
           |  |  | 256 | 	}
 | 
        
           |  |  | 257 |   | 
        
           | 823 | jpm | 258 | 	private function ajouterMotCleRacine() {
 | 
        
           |  |  | 259 | 		$nbre_mots_cles = $this->compterMotsCles();
 | 
        
           | 1353 | aurelien | 260 | 		$this->debug[] = "Nbre de mots-clés : $nbre_mots_cles";
 | 
        
           | 831 | jpm | 261 | 		if ($nbre_mots_cles == 0) {
 | 
        
           | 823 | jpm | 262 | 			switch ($this->suffix) {
 | 
        
           |  |  | 263 | 				case self::OBS_TABLE_SUFFIXE :
 | 
        
           |  |  | 264 | 					$nom_racine = self::OBS_RACINE_NOM;
 | 
        
           |  |  | 265 | 					$id_racine = self::OBS_RACINE_ID;
 | 
        
           |  |  | 266 | 					break;
 | 
        
           |  |  | 267 | 				case self::IMG_TABLE_SUFFIXE :
 | 
        
           |  |  | 268 | 					$nom_racine = self::IMG_RACINE_NOM;
 | 
        
           |  |  | 269 | 					$id_racine = self::IMG_RACINE_ID;
 | 
        
           |  |  | 270 | 					break;
 | 
        
           |  |  | 271 | 				default:
 | 
        
           |  |  | 272 | 					$nom_racine = $this->suffix;
 | 
        
           |  |  | 273 | 					$id_racine = $this->suffix;
 | 
        
           |  |  | 274 | 			}
 | 
        
           |  |  | 275 |   | 
        
           | 1765 | raphael | 276 | 			$md5_racine = Cel::db()->proteger($this->encoderMotCle($nom_racine));
 | 
        
           |  |  | 277 | 			$nom_racine = Cel::db()->proteger($nom_racine);
 | 
        
           |  |  | 278 | 			$id_racine = Cel::db()->proteger($id_racine);
 | 
        
           |  |  | 279 | 			$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 1400 | aurelien | 280 |   | 
        
           |  |  | 281 | 			$requete = "INSERT INTO cel_mots_cles{$this->suffix} ".
 | 
        
           |  |  | 282 | 			"VALUES ($id_racine, $id_utilisateur, $nom_racine, $md5_racine,".
 | 
        
           |  |  | 283 | 			" 1, 2, 0, '') ";
 | 
        
           |  |  | 284 |   | 
        
           | 831 | jpm | 285 | 			if ($this->executerSQL($requete) === false) {
 | 
        
           |  |  | 286 | 				$e = "La requête d'insertion du mot-clé racine a échoué.";
 | 
        
           |  |  | 287 | 				$this->messages[] = $e;
 | 
        
           | 823 | jpm | 288 | 			}
 | 
        
           |  |  | 289 | 		}
 | 
        
           |  |  | 290 | 	}
 | 
        
           | 1353 | aurelien | 291 |   | 
        
           |  |  | 292 | 	private function verifierAbsence($mot_cle, $mot_cle_parent_id) {
 | 
        
           | 831 | jpm | 293 | 		$absence = false;
 | 
        
           | 1765 | raphael | 294 | 		$mot_cle = Cel::db()->proteger($mot_cle);
 | 
        
           |  |  | 295 | 		$mot_cle_parent_id = Cel::db()->proteger($mot_cle_parent_id);
 | 
        
           |  |  | 296 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 830 | jpm | 297 | 		$requete = 	'SELECT COUNT(*) AS nbre '.
 | 
        
           | 1353 | aurelien | 298 | 			"FROM cel_mots_cles{$this->suffix} ".
 | 
        
           |  |  | 299 | 			"WHERE mot_cle = $mot_cle ".
 | 
        
           |  |  | 300 | 			"	AND id_utilisateur = $id_utilisateur ".
 | 
        
           |  |  | 301 | 			"	AND ce_mot_cle_".(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'obs' : 'image')."_parent = $mot_cle_parent_id";
 | 
        
           |  |  | 302 |   | 
        
           | 830 | jpm | 303 | 		$nbre = $this->recupererValeur($requete);
 | 
        
           | 831 | jpm | 304 | 		if ($nbre === false) {
 | 
        
           | 1353 | aurelien | 305 | 			$e = "La requête de vérification d'absence d'un mot-clé a échoué.";
 | 
        
           | 831 | jpm | 306 | 			$this->messages[] = $e;
 | 
        
           |  |  | 307 | 		} else if ($nbre == 0) {
 | 
        
           |  |  | 308 | 			$absence = true;
 | 
        
           | 830 | jpm | 309 | 		}
 | 
        
           |  |  | 310 | 		return $absence;
 | 
        
           |  |  | 311 | 	}
 | 
        
           | 1353 | aurelien | 312 |   | 
        
           |  |  | 313 | 	private function getIdMotCle($mot_cle, $mot_cle_parent_id) {
 | 
        
           | 1765 | raphael | 314 | 		$mot_cle = Cel::db()->proteger($mot_cle);
 | 
        
           |  |  | 315 | 		$mot_cle_parent_id = Cel::db()->proteger($mot_cle_parent_id);
 | 
        
           |  |  | 316 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 1353 | aurelien | 317 | 		$requete = 	'SELECT id_mot_cle_'.(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'obs' : 'image').' AS id '.
 | 
        
           |  |  | 318 | 			"FROM cel_mots_cles{$this->suffix} ".
 | 
        
           |  |  | 319 | 			"WHERE mot_cle = $mot_cle ".
 | 
        
           |  |  | 320 | 			"	AND id_utilisateur = $id_utilisateur ".
 | 
        
           |  |  | 321 | 			"	AND ce_mot_cle_".(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'obs' : 'image')."_parent = $mot_cle_parent_id";
 | 
        
           |  |  | 322 | 		$resultat = $this->recupererResultat($requete);
 | 
        
           |  |  | 323 | 		$mot_cle_id = ($resultat) ? $resultat['id'] : false;
 | 
        
           |  |  | 324 | 		return $mot_cle_id;
 | 
        
           |  |  | 325 | 	}
 | 
        
           |  |  | 326 |   | 
        
           | 823 | jpm | 327 | 	private function compterMotsCles() {
 | 
        
           | 831 | jpm | 328 | 		$nbre = 0;
 | 
        
           | 1765 | raphael | 329 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 823 | jpm | 330 | 		$requete = 	'SELECT COUNT(*) AS nbre '.
 | 
        
           |  |  | 331 | 					"FROM cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 332 | 					"WHERE id_utilisateur = $id_utilisateur ";
 | 
        
           |  |  | 333 |   | 
        
           | 830 | jpm | 334 | 		$nbre = $this->recupererValeur($requete);
 | 
        
           | 831 | jpm | 335 | 		if ($nbre === false) {
 | 
        
           |  |  | 336 | 			$e = "La requête de comptage du nombre de mots-clés a échoué.";
 | 
        
           |  |  | 337 | 			$this->messages[] = $e;
 | 
        
           |  |  | 338 | 		}
 | 
        
           | 823 | jpm | 339 | 		return $nbre;
 | 
        
           |  |  | 340 | 	}
 | 
        
           | 1353 | aurelien | 341 |   | 
        
           | 823 | jpm | 342 | 	/**
 | 
        
           |  |  | 343 | 	 * Désactive l'auto-commit puis débute la transaction
 | 
        
           |  |  | 344 | 	 */
 | 
        
           |  |  | 345 | 	private function commencerTransaction() {
 | 
        
           |  |  | 346 | 		// Désactive l'autocommit le temps de la manipulation de l'arbre
 | 
        
           |  |  | 347 | 		$requete = 'SET AUTOCOMMIT = 0 ';
 | 
        
           |  |  | 348 | 		$reussite_autocommit = $this->executerSQL($requete);
 | 
        
           |  |  | 349 |   | 
        
           |  |  | 350 | 		// Débute une nouvelle transaction
 | 
        
           |  |  | 351 | 		$requete = 'BEGIN ';
 | 
        
           |  |  | 352 | 		$reussite_begin = $this->executerSQL($requete);
 | 
        
           |  |  | 353 | 	}
 | 
        
           |  |  | 354 |   | 
        
           |  |  | 355 | 	/**
 | 
        
           |  |  | 356 | 	 * Termine la transaction puis réactive l'auto-commit
 | 
        
           |  |  | 357 | 	 */
 | 
        
           |  |  | 358 | 	private function completerTransaction() {
 | 
        
           |  |  | 359 | 		// Complète la transaction
 | 
        
           |  |  | 360 | 		$requete = 'COMMIT ';
 | 
        
           |  |  | 361 | 		$reussite_commit = $this->executerSQL($requete);
 | 
        
           |  |  | 362 |   | 
        
           |  |  | 363 | 		// Réactive l'autocommit le temps de la manipulation de l'arbre
 | 
        
           |  |  | 364 | 		$requete = 'SET AUTOCOMMIT = 1 ';
 | 
        
           |  |  | 365 | 		$reussite_autocommit = $this->executerSQL($requete);
 | 
        
           |  |  | 366 |   | 
        
           | 830 | jpm | 367 | 		return true;
 | 
        
           | 823 | jpm | 368 | 	}
 | 
        
           | 1353 | aurelien | 369 |   | 
        
           | 823 | jpm | 370 | 	/**
 | 
        
           |  |  | 371 | 	 * Annule la transaction et réactive l'auto-commit
 | 
        
           |  |  | 372 | 	 */
 | 
        
           |  |  | 373 | 	private function annulerTransaction() {
 | 
        
           |  |  | 374 | 		// Annule la transaction
 | 
        
           |  |  | 375 | 		$requete = 'ROLLBACK ';
 | 
        
           |  |  | 376 | 		$reussite_rollback = $this->executerSQL($requete);
 | 
        
           |  |  | 377 |   | 
        
           |  |  | 378 | 		// Réactive l'autocommit le temps de la manipulation de l'arbre
 | 
        
           |  |  | 379 | 		$requete = 'SET AUTOCOMMIT = 1 ';
 | 
        
           |  |  | 380 | 		$reussite_autocommit = $this->executerSQL($requete);
 | 
        
           |  |  | 381 |   | 
        
           | 830 | jpm | 382 | 		return false;
 | 
        
           | 823 | jpm | 383 | 	}
 | 
        
           |  |  | 384 |   | 
        
           | 1353 | aurelien | 385 | 	/**
 | 
        
           | 823 | jpm | 386 | 	 * Renvoie les bornes d'un noeud de l'arbre des mots clés
 | 
        
           |  |  | 387 | 	 */
 | 
        
           |  |  | 388 | 	private function retrouverBornesEtNiveau($mot_cle_id) {
 | 
        
           | 1765 | raphael | 389 | 		$mot_cle_id = Cel::db()->proteger($mot_cle_id);
 | 
        
           |  |  | 390 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 1353 | aurelien | 391 | 		$requete = 	'SELECT bd, bg, niveau '.
 | 
        
           | 823 | jpm | 392 | 					"FROM cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 393 | 					"WHERE id_mot_cle_".(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'obs' : 'image')." = $mot_cle_id ".
 | 
        
           |  |  | 394 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           |  |  | 395 |   | 
        
           | 823 | jpm | 396 | 		$resultat = $this->recupererResultat($requete);
 | 
        
           |  |  | 397 | 		return $resultat;
 | 
        
           |  |  | 398 | 	}
 | 
        
           |  |  | 399 |   | 
        
           |  |  | 400 | 	/**
 | 
        
           |  |  | 401 | 	 * Décale les bornes de deux pour insérer un nouvel élément
 | 
        
           | 1353 | aurelien | 402 | 	 */
 | 
        
           | 823 | jpm | 403 | 	private function decalerBornesPlusDeux($valeur) {
 | 
        
           |  |  | 404 | 		// Décalage borne droite
 | 
        
           | 1765 | raphael | 405 | 		$valeur = Cel::db()->proteger($valeur);
 | 
        
           |  |  | 406 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 823 | jpm | 407 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 408 | 					'SET bd = bd + 2 '.
 | 
        
           |  |  | 409 | 					"WHERE bd >= $valeur ".
 | 
        
           |  |  | 410 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           | 823 | jpm | 411 | 		$reussi_1 = $this->executerSQL($requete);
 | 
        
           | 830 | jpm | 412 | 		if (!$reussi_1) {
 | 
        
           |  |  | 413 | 			$e = "Échec du décalage de la borne droite de +2 : $requete ";
 | 
        
           |  |  | 414 | 			$this->messages[] = $e;
 | 
        
           |  |  | 415 | 		}
 | 
        
           | 1353 | aurelien | 416 |   | 
        
           | 823 | jpm | 417 | 		// Décalage borne gauche
 | 
        
           |  |  | 418 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 419 | 					'SET bg = bg + 2 '.
 | 
        
           |  |  | 420 | 					"WHERE bg >= $valeur ".
 | 
        
           |  |  | 421 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           | 823 | jpm | 422 | 		$reussi_2 = $this->executerSQL($requete);
 | 
        
           | 830 | jpm | 423 | 		if (!$reussi_2) {
 | 
        
           |  |  | 424 | 			$e = "Échec du décalage de la borne gauche de +2 : $requete";
 | 
        
           |  |  | 425 | 			$this->messages[] = $e;
 | 
        
           |  |  | 426 | 		}
 | 
        
           | 1353 | aurelien | 427 |   | 
        
           | 830 | jpm | 428 | 		return ($reussi_1 && $reussi_2);
 | 
        
           | 823 | jpm | 429 | 	}
 | 
        
           |  |  | 430 |   | 
        
           |  |  | 431 | 	/**
 | 
        
           |  |  | 432 | 	 * Décale les bornes d'un intervalle négatif donné (pour la suppression d'un sous arbre).
 | 
        
           |  |  | 433 | 	 */
 | 
        
           |  |  | 434 | 	private function decalerBornesMoinsIntervalle($bg, $bd) {
 | 
        
           |  |  | 435 | 		$decalage = $bd - $bg + 1;
 | 
        
           | 1765 | raphael | 436 | 		$bg = Cel::db()->proteger($bg);
 | 
        
           |  |  | 437 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 1353 | aurelien | 438 |   | 
        
           | 823 | jpm | 439 | 		// Décalage borne droite
 | 
        
           |  |  | 440 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 441 | 					"SET bd = cmc_bd - $decalage ".
 | 
        
           |  |  | 442 | 					"WHERE bd >= $bg ".
 | 
        
           |  |  | 443 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           | 823 | jpm | 444 | 		$reussi_1 = $this->executerSQL($requete);
 | 
        
           |  |  | 445 |   | 
        
           |  |  | 446 | 		// Décalage borne gauche
 | 
        
           |  |  | 447 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 448 | 					"SET bg = bg - $decalage ".
 | 
        
           |  |  | 449 | 					"WHERE bg > $bg ".
 | 
        
           |  |  | 450 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           | 823 | jpm | 451 | 		$reussi_2 = $this->executerSQL($requete);
 | 
        
           | 1353 | aurelien | 452 |   | 
        
           | 823 | jpm | 453 | 		return $reussi_1 && $reussi_2;
 | 
        
           |  |  | 454 | 	}
 | 
        
           |  |  | 455 |   | 
        
           |  |  | 456 | 	/**
 | 
        
           |  |  | 457 | 	 * Décale à droite des bornes donées d'un intervalle positif donné (pour l'ajout d'un sous arbre).
 | 
        
           | 1353 | aurelien | 458 | 	 */
 | 
        
           | 823 | jpm | 459 | 	private function decalerBornesPlusIntervalle($valeur_bornes, $largeur) {
 | 
        
           | 1765 | raphael | 460 | 		$valeur_bornes = Cel::db()->proteger($valeur_bornes);
 | 
        
           |  |  | 461 | 		$largeur = Cel::db()->proteger($largeur);
 | 
        
           |  |  | 462 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 1353 | aurelien | 463 |   | 
        
           | 823 | jpm | 464 | 		// Décalage borne droite
 | 
        
           |  |  | 465 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 466 | 					"SET bd = bd + $largeur ".
 | 
        
           |  |  | 467 | 					"WHERE bd >= $valeur_bornes ".
 | 
        
           |  |  | 468 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           | 823 | jpm | 469 | 		$reussi_1 = $this->executerSQL($requete);
 | 
        
           |  |  | 470 |   | 
        
           |  |  | 471 | 		// Décalage borne gauche
 | 
        
           |  |  | 472 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 473 | 					"SET bg = bg + $largeur ".
 | 
        
           |  |  | 474 | 					"WHERE bg >= $valeur_bornes ".
 | 
        
           |  |  | 475 | 					"	AND id_utilisateur = $id_utilisateur| ";
 | 
        
           | 823 | jpm | 476 | 		$reussi_2 = $this->executerSQL($requete);
 | 
        
           |  |  | 477 |   | 
        
           |  |  | 478 | 		return $reussi_1 && $reussi_2;
 | 
        
           |  |  | 479 | 	}
 | 
        
           |  |  | 480 |   | 
        
           |  |  | 481 | 	/**
 | 
        
           |  |  | 482 | 	 * Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie.
 | 
        
           |  |  | 483 | 	 */
 | 
        
           |  |  | 484 | 	private function exclureIntervalle($bg, $bd) {
 | 
        
           | 1765 | raphael | 485 | 		$bg = Cel::db()->proteger($bg);
 | 
        
           |  |  | 486 | 		$bd = Cel::db()->proteger($bd);
 | 
        
           |  |  | 487 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 823 | jpm | 488 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 489 | 					"SET bd = bd - $bd - 1 , ".
 | 
        
           |  |  | 490 | 					"	bg =  bg - $bd - 1 ".
 | 
        
           |  |  | 491 | 					"WHERE bd <= $bd ".
 | 
        
           |  |  | 492 | 					"	AND bg >= $bg ".
 | 
        
           |  |  | 493 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           | 823 | jpm | 494 | 		return $this->executerSQL($requete);
 | 
        
           |  |  | 495 | 	}
 | 
        
           |  |  | 496 |   | 
        
           | 1353 | aurelien | 497 | 	/**
 | 
        
           | 823 | jpm | 498 | 	 * Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place.
 | 
        
           |  |  | 499 | 	 * Décalage borne droite
 | 
        
           |  |  | 500 | 	 */
 | 
        
           |  |  | 501 | 	private function inclureIntervalle($bg, $bd, $largeur, $modif_niveau) {
 | 
        
           | 1765 | raphael | 502 | 		$bg = Cel::db()->proteger($bg);
 | 
        
           |  |  | 503 | 		$bd = Cel::db()->proteger($bd);
 | 
        
           |  |  | 504 | 		$largeur = Cel::db()->proteger($largeur);
 | 
        
           |  |  | 505 | 		$modif_niveau = Cel::db()->proteger($modif_niveau);
 | 
        
           |  |  | 506 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 823 | jpm | 507 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 508 | 					"SET bg =  bg + $largeur , ".
 | 
        
           |  |  | 509 | 					"	bd = bd + $largeur, ".
 | 
        
           |  |  | 510 | 					"	niveau = niveau + $modif_niveau ".
 | 
        
           |  |  | 511 | 					"WHERE bg >=  $bg ".
 | 
        
           |  |  | 512 | 					"	AND bd <=  $bd ".
 | 
        
           |  |  | 513 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           | 823 | jpm | 514 |   | 
        
           |  |  | 515 | 		return $this->executerSQL($requete);
 | 
        
           |  |  | 516 | 	}
 | 
        
           |  |  | 517 |   | 
        
           |  |  | 518 | 	private function changerPere($mot_cle_id, $id_pere) {
 | 
        
           | 1765 | raphael | 519 | 		$mot_cle_id = Cel::db()->proteger($mot_cle_id);
 | 
        
           |  |  | 520 | 		$id_pere = Cel::db()->proteger($id_pere);
 | 
        
           |  |  | 521 | 		$id_utilisateur = Cel::db()->proteger($this->utilisateur_id);
 | 
        
           | 823 | jpm | 522 | 		$requete = 	"UPDATE cel_mots_cles{$this->suffix} ".
 | 
        
           | 1353 | aurelien | 523 | 					"SET ce_mot_cle_".(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'obs' : 'image')."_parent = $id_pere ".
 | 
        
           |  |  | 524 | 					"WHERE id_mot_cle_".(($this->suffix == self::OBS_TABLE_SUFFIXE) ? 'obs' : 'image')." = $mot_cle_id ".
 | 
        
           |  |  | 525 | 					"	AND id_utilisateur = $id_utilisateur ";
 | 
        
           |  |  | 526 |   | 
        
           | 823 | jpm | 527 | 		return $this->executerSQL($requete);
 | 
        
           |  |  | 528 | 	}
 | 
        
           | 1353 | aurelien | 529 |   | 
        
           | 823 | jpm | 530 | 	private function executerSQL($requete) {
 | 
        
           | 1765 | raphael | 531 | 		$execution = Cel::db()->executer($requete);
 | 
        
           | 830 | jpm | 532 | 		$execution = ($execution === false) ? false : true;
 | 
        
           | 823 | jpm | 533 | 		return $execution;
 | 
        
           |  |  | 534 | 	}
 | 
        
           | 1353 | aurelien | 535 |   | 
        
           | 830 | jpm | 536 | 	private function recupererValeur($requete) {
 | 
        
           | 1765 | raphael | 537 | 		$resultat = Cel::db()->requeter($requete, Cel::SQL_RETOUR_COLONNE);
 | 
        
           | 830 | jpm | 538 | 		return $resultat;
 | 
        
           |  |  | 539 | 	}
 | 
        
           | 1353 | aurelien | 540 |   | 
        
           | 823 | jpm | 541 | 	private function recupererResultat($requete) {
 | 
        
           | 1765 | raphael | 542 | 		$resultat = Cel::db()->requeter($requete, Cel::SQL_RETOUR_LIGNE, Cel::SQL_MODE_ASSOC);
 | 
        
           | 823 | jpm | 543 | 		return $resultat;
 | 
        
           |  |  | 544 | 	}
 | 
        
           | 1353 | aurelien | 545 |   | 
        
           | 830 | jpm | 546 | 	private function recupererResultats($requete) {
 | 
        
           | 1765 | raphael | 547 | 		$resultat = Cel::db()->requeter($requete, Cel::SQL_RETOUR_COMPLET, Cel::SQL_MODE_ASSOC);
 | 
        
           | 830 | jpm | 548 | 		return $resultat;
 | 
        
           |  |  | 549 | 	}
 | 
        
           | 1353 | aurelien | 550 |   | 
        
           | 823 | jpm | 551 | 	private function verifierLignesAffectees($requete) {
 | 
        
           | 1765 | raphael | 552 | 		$execution = Cel::db()->executer($requete);
 | 
        
           | 823 | jpm | 553 | 		return $execution;
 | 
        
           |  |  | 554 | 	}
 | 
        
           |  |  | 555 | }
 | 
        
           |  |  | 556 | ?>
 |