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);
}
}
?>