Rev 828 | Rev 958 | 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 utilisateursession_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 utilisateursession_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 refaireprivate 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);}}?>