1,24 → 1,14 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botania.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
|
/** |
* in : utf8 |
* out : utf8 |
* |
* Librairie de liaison d'images et d'observation à des mots clés |
* |
*/ |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botania.org> |
* @author Raphaël Droz <raphael@tela-botania.org> |
* @copyright 2010, 2013 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* |
* Librairie de liaison d'images et d'observation à des mots clés |
*/ |
|
class LiaisonMotsCles extends Cel { |
|
const SEPARATEUR_MOT_CLE_TEXTE = ','; |
30,34 → 20,45 |
} |
|
public function ajouterLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) { |
$mode = $this->mode; |
|
$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image'; |
$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image'; |
|
// le mot clé ignore est spécifique mysql, mais il est utilisé ici pour des raisons |
// de performance, à remplacer par un test sur les mots clés déjà existant si ça gène |
$requete_liaison_mots_cles = 'INSERT IGNORE INTO cel_'.$this->mode.'_mots_cles '. |
'('.$champ_objet_lie.', '.$champ_mot_cle.') '. |
'VALUES '; |
|
$requete_liaison_mots_cles = sprintf('INSERT IGNORE INTO cel_%s_mots_cles '. |
'(%s, %s) VALUES ', |
$mode, |
$mode == 'obs' ? 'id_observation' : 'id_image', |
$mode == 'obs' ? 'id_mot_cle_obs' : 'id_mot_cle_image'); |
$insert = array(); |
foreach($ids_images_ou_obs as $id_image_ou_obs) { |
foreach($mots_cles as $mot) { |
$requete_liaison_mots_cles .= '('.$id_image_ou_obs.','.Cel::db()->proteger($mot).'),'; |
// TODO!! ce_utilisateur |
$insert[] = '('.$id_image_ou_obs.','.Cel::db()->proteger($mot).')'; |
} |
} |
|
$requete_liaison_mots_cles = rtrim($requete_liaison_mots_cles,','); |
$resultat_liaison_mots_cles = Cel::db()->executer($requete_liaison_mots_cles); |
|
foreach($ids_images_ou_obs as $id_image_ou_obs) { |
$this->regenererIndexTexteMotCle($id_image_ou_obs, $id_utilisateur); |
|
if(!$insert) { |
// peut arriver, par exemple lorsqu'on décoche tous les mots-clef associés à une image |
$this->logger('CEL_bugs', 'Pas de mot-clef à ajouter à des '.$mode.' : '. implode(',', $ids_images_ou_obs)); |
} |
else { |
$resultat_liaison_mots_cles = Cel::db()->executer($requete_liaison_mots_cles . implode(',',$insert)); |
if(! $resultat_liaison_mots_cles) { |
$this->logger('CEL_bugs', 'Erreur d\'ajout de mots clés à des '.$mode.' : '.$requete_liaison_mots_cles); |
// ne pas retourner car si nous sommes passés par InventoryKeyWordImageLink updateElement(), |
// alors celui-ci à *purgé* les mots-clefs en amont et compte sur nous pour faire une réinitialisation |
/// correcte ... |
// return FALSE; |
} |
} |
|
if(!$resultat_liaison_mots_cles) { |
$this->logger('CEL_bugs', 'Erreur d\'ajout de mots clés à des '.$this->mode.' : '.$requete_liaison_mots_cles); |
// ... donc dans tous les cas nous devons conserver une cohérence entre les deux modes de stockage des mots-clefs |
$ret = TRUE; |
foreach($ids_images_ou_obs as $id_image_ou_obs) { |
$bool = self::regenererIndexTexteMotCle($id_image_ou_obs, $id_utilisateur, $mode); |
$ret = $ret & ($bool !== FALSE); // peut légitimement retourner 0 |
} |
|
return $resultat_liaison_mots_cles; |
return $ret; |
} |
|
public function supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_images_ou_obs, $mots_cles) { |
65,7 → 66,7 |
$retour = $this->supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles); |
|
foreach($ids_images_ou_obs as $image_ou_obs) { |
$this->regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur); |
self::regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur, $this->mode); |
} |
|
return $retour; |
82,16 → 83,10 |
|
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle); |
|
if ($requete_suppression_liaison_mot_cle !== false) { |
$retour = true; |
} else { |
$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete"; |
$this->logger($message); |
|
$retour = false; |
} |
|
return $retour; |
if ($requete_suppression_liaison_mot_cle !== false) return TRUE; |
|
$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete"); |
return FALSE; |
} |
|
public function supprimerToutesLiaisonsPourIdImageOuObs($id_utilisateur, $ids_images_ou_obs) { |
105,15 → 100,11 |
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle); |
|
if ($requete_suppression_liaison_mot_cle !== false) { |
$retour = true; |
} else { |
$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete"; |
$this->logger($message); |
|
$retour = false; |
return TRUE; |
} |
|
return $retour; |
|
$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete"); |
return FALSE; |
} |
|
public function supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles) { |
133,7 → 124,7 |
|
$resultat_requete_objets_lies_mot_cle = Cel::db()->requeter($requete_objets_lies_mot_cle); |
foreach($resultat_requete_objets_lies_mot_cle as $objet_lie) { |
$this->regenererIndexTexteMotCle($objet_lie['id'], $id_utilisateur); |
self::regenererIndexTexteMotCle($objet_lie['id'], $id_utilisateur, $this->mode); |
} |
|
if ($requete_suppression_liaison_mot_cle !== false) { |
148,42 → 139,37 |
return $retour; |
} |
|
private function regenererIndexTexteMotCle($image_ou_obs, $identifiant_utilisateur) { |
|
$mots_cles = $this->obtenirMotsClesTexte($image_ou_obs, $identifiant_utilisateur); |
static private function regenererIndexTexteMotCle($id_image_ou_obs, $identifiant_utilisateur, $mode) { |
$mots_cles = self::obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode); |
$mots_cles_texte_chaine = ""; |
if (count($mots_cles) > 0) { |
$mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($mots_cles); |
$mots_cles_texte_chaine = self::formaterTableauMotCleTextePourInsertion($mots_cles); |
} |
|
$this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $image_ou_obs, $identifiant_utilisateur); |
// self::executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $identifiant_utilisateur, $mode); |
return Cel::db()->executer(sprintf('UPDATE %s SET mots_cles_texte = %s WHERE %s = %s AND ce_utilisateur = %s -- %s:%d', |
$mode == 'obs' ? 'cel_obs' : 'cel_images', |
Cel::db()->proteger($mots_cles_texte_chaine), |
$mode == 'obs' ? 'id_observation' : 'id_image', |
Cel::db()->proteger($id_image_ou_obs), |
Cel::db()->proteger($identifiant_utilisateur), |
__FILE__ , __LINE__)); |
|
} |
|
private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $identifiant_utilisateur) { |
$requete = 'UPDATE '.(($this->mode == 'obs') ? 'cel_obs' : 'cel_images').' '. |
'SET mots_cles_texte = '.Cel::db()->proteger($mots_cles_texte_chaine).' '. |
'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs). |
' AND ce_utilisateur = '.Cel::db()->proteger($identifiant_utilisateur); |
|
return Cel::db()->executer($requete); |
private static function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode) { |
return Cel::db()->requeter(sprintf('SELECT mot_cle FROM cel_mots_cles_%1$s WHERE id_mot_cle_%2$s IN '. |
' (SELECT id_mot_cle_%2$s FROM cel_%1$s_mots_cles WHERE %3$s = %4$s)'. |
' AND id_utilisateur = %5$s -- %6$s:%7$d', |
$mode, |
$mode == 'obs' ? 'obs' : 'image', |
$mode == 'obs' ? 'id_observation' : 'id_image', |
Cel::db()->proteger($id_image_ou_obs), |
Cel::db()->proteger($identifiant_utilisateur), |
__FILE__ , __LINE__)); |
} |
|
private function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur) { |
$requete = 'SELECT mot_cle '. |
'FROM '.'cel_mots_cles_'.$this->mode.' '. |
'WHERE id_mot_cle_'.(($this->mode == 'obs') ? 'obs' : 'image').' IN '. |
'('. |
'SELECT id_mot_cle_'.(($this->mode == 'obs') ? 'obs' : 'image').' '. |
'FROM cel_'.$this->mode.'_mots_cles '. |
'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs). |
')'. |
' AND id_utilisateur = '.Cel::db()->proteger($identifiant_utilisateur); |
|
$resultats = Cel::db()->requeter($requete); |
return $resultats; |
} |
|
private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) { |
private static function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) { |
$mot_cles_texte_chaine = ''; |
|
if (is_array($tableau_mots_cles_texte)) { |
197,7 → 183,7 |
return $mot_cles_texte_chaine; |
} |
|
public function nettoyerMotsCles($chaine) { |
static function nettoyerMotsCles($chaine) { |
$valeur = str_replace('null', '', $chaine); |
$valeur = trim($valeur, ';;'); |
|