Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1871 → Rev 1872

/trunk/jrest/lib/LiaisonMotsCles.php
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, ';;');
/trunk/jrest/services/InventoryKeyWordImageLink.php
1,26 → 1,19
<?php
// declare(encoding='UTF-8');
// 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
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @author Raphaël Droz <raphael@tela-botania.org>
* @copyright 2010, 2013 Tela-Botanica
* @license Licence CECILL <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
*
* Service de liaisons de mots clés à des images.
* Le service lie une ou plusieurs mots clés à une ou plusieurs images
*
*/
*/
 
require_once('InventoryKeyWordObsLink.php');
 
class InventoryKeyWordImageLink extends Cel {
public function getElement($uid) {
36,46 → 29,24
return;
}
$pairs['images'] = rtrim($pairs['images'],',');
$id_images = explode(',',$pairs['images']);
$id_images = array_filter(explode(',', $pairs['images']));
$mots_cles = array_filter(explode(',', $pairs['mots_cles']));
$pairs['mots_cles'] = rtrim($pairs['mots_cles'],',');
$mots_cles = explode(',',$pairs['mots_cles']);
// Pour le moment on ne peut que supprimer les mots clés et ajouter les nouveaux à cause du fonctionnement
// de l'arbre de mots clés des images
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'images');
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerToutesLiaisonsPourIdImageOuObs($pairs['ce_utilisateur'], $id_images);
$liaison_mot_cle = $gestionnaire_mots_cles->ajouterLiaisonMotsCles($pairs['ce_utilisateur'],$id_images, $mots_cles);
return $liaison_mot_cle;
return $gestionnaire_mots_cles->ajouterLiaisonMotsCles($pairs['ce_utilisateur'],$id_images, $mots_cles);
}
 
public function deleteElement($uid){
$retour = false;
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || !$this->estUnIdentifiantMotCle($uid[2])) {
return;
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || ! InventoryKeyWordObsLink::estUnIdentifiantMotCle($uid[2])) {
return FALSE;
}
$id_images = explode(',',$uid[1]);
$id_utilisateur = $uid[0];
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'images');
$mots_cles = $gestionnaire_mots_cles->nettoyerMotsCles($uid[2]);
$mots_cles = explode(',',$mots_cles);
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $id_images, $mots_cles);
 
return $suppression_liaison_mot_cle;
return InventoryKeyWordObsLink::unlinkKeyword($this->config, 'images', explode(',',$uid[1]), $uid[0], $uid[2]);
}
 
private function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
}
?>
/trunk/jrest/services/InventoryKeyWordObsLink.php
1,31 → 1,18
<?php
// declare(encoding='UTF-8');
/**
* 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
*
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010, 2013 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
*
* Service de liaisons de mots clés à des observations.
* Le service lie une ou plusieurs mots clés à une ou plusieurs observations
*
*/
*/
 
class InventoryKeyWordObsLink extends Cel {
public function getElement($uid) {
public function getElement($uid) { }
}
public function createElement($pairs) {
// Controle detournement utilisateur
45,30 → 32,25
}
 
public function deleteElement($uid){
$retour = false;
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || !$this->estUnIdentifiantMotCle($uid[2])) {
return;
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || ! self::estUnIdentifiantMotCle($uid[2])) {
return FALSE;
}
return self::unlinkKeyword($this->config, 'obs', explode(',',$uid[1]), $uid[0], $uid[2]);
}
 
static function unlinkKeyword($config, $type /* = obs|images */, Array $obsIds, $uid, $keywordIds /* comma-separated string */) {
if($type != 'obs' && $type != 'images') return FALSE;
$ids_obs = explode(',',$uid[1]);
$id_utilisateur = $uid[0];
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'obs');
$mots_cles = $gestionnaire_mots_cles->nettoyerMotsCles($uid[2]);
$mots_cles = explode(',',$mots_cles);
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_obs, $mots_cles);
$gestionnaire_mots_cles = new LiaisonMotsCles($config, $type);
$mots_cles = explode(',', LiaisonMotsCles::nettoyerMotsCles($keywordIds));
return $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($uid, $obsIds, $mots_cles);
}
 
return $suppression_liaison_mot_cle;
static function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
 
private function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
}
?>
/trunk/jrest/services/InventoryKeyWordList.php
42,27 → 42,69
// Controle detournement utilisateur
$id_utilisateur = $uid[1] ;
$this->controleUtilisateur($uid[1]);
$this->setChampsEtTablePourSuffixe($uid[0]);
$requete = 'SELECT mot_cle, id_mot_cle'.$this->suffixe_champ.', ce_mot_cle'.$this->suffixe_champ.'_parent '.
'FROM cel_mots_cles'.$this->suffixe_table.' '.
'WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' '.
'ORDER BY niveau ';
$resultats_mots_cles = Cel::db()->requeter($requete);
if (is_array($resultats_mots_cles)) {
$mots_cles = array();
foreach($resultats_mots_cles as $mot_cle) {
$mots_cles[] = $mot_cle;
}
$this->envoyerJson($mots_cles);
return true;
$this->envoyerJson(self::getMotsClefs($uid[1], $uid[0]));
return TRUE; // compat: pourquoi renvoyer true si vide ?
}
 
 
static function getMotsClefs($uid, $type) {
if($type == 'obs') {
return Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
' FROM cel_mots_cles_obs'.
' WHERE id_utilisateur = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid)));
}
 
if($type == 'images') {
return Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
' FROM cel_mots_cles_images'.
' WHERE id_utilisateur = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid)));
}
/* pour extraire un mot-clef en particulier (bien que getMotsClefId() soit plus adapté:
array_walk($ret,
create_function('&$val, $k, $keyword',
'if($val["mot_cle"] != $keyword) $val = NULL;' .
'else $val = $val["id_mot_cle_obs"];'),
'XXX');
$obsKeywordIdToDetach = array_filter($ret);
$obsKeywordIdToDetach = array_pop($obsKeywordIdToDetach); */
 
return array();
}
 
 
static function getMotsClefId($uid, $type, $keyword) {
if($type == 'obs') {
$ret = Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
' FROM cel_mots_cles_obs'.
' WHERE id_utilisateur = %s'.
' AND mot_cle = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid),
Cel::db()->proteger($keyword) ));
}
 
if($type == 'images') {
$ret = Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
' FROM cel_mots_cles_images'.
' WHERE id_utilisateur = %s'.
' AND mot_cle = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid),
Cel::db()->proteger($keyword) ));
}
return @$ret[0]['id_mot_cle_obs'];
}
 
public function updateElement($uid, $pairs) {
$id_utilisateur = $uid[1];
$this->controleUtilisateur($uid[1]);