/trunk/jrest/lib/RechercheObservation.php |
---|
243,7 → 243,12 |
case 'id_mots_cles': |
$liste_mc = '"'.str_replace(';','","',$valeur).'"'; |
$sous_requete .= '' ; |
$sous_requete .= 'id_observation IN (SELECT id_observation FROM cel_obs_mots_cles WHERE id_mot_cle_obs IN ('.$liste_mc.'))'; |
$sous_requete .= 'id_observation IN '. |
'(SELECT id_element_lie |
FROM cel_mots_cles_obs_liaison |
WHERE id_mot_cle IN ('.$liste_mc.') '. |
')'; |
$sous_requete .= ' AND ' ; |
break; |
case 'recherche': |
/trunk/jrest/lib/LiaisonMotsCles.php |
---|
9,97 → 9,71 |
* Librairie de liaison d'images et d'observation à des mots clés |
*/ |
//TODO : cette classe devrait disparaitre pour être intégrée dans la classe |
// gestionMotsClesChemin, si possible, mais elle existe pour garder une certaine |
// indépendance entre le mecanisme des mots clés texte dans les tables obs et images |
// et les tables de mots clés (elle sera supprimée lorsque le champ mots_cles_texte le sera aussi) |
class LiaisonMotsCles extends Cel { |
const SEPARATEUR_MOT_CLE_TEXTE = ','; |
private $mode = 'obs'; |
private $table_elements_lies; |
private $champ_id_element_lie; |
public function LiaisonMotsCles($config, $mode) { |
parent::__construct($config); |
$this->mode = $mode; |
list($this->table_elements_lies, $this->champ_id_element_lie) = self::getNomTables($mode); |
} |
public function ajouterLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) { |
private static function getNomTables($mode) { |
$tables = array(); |
if($mode == 'obs') { |
$tables = array('cel_obs','id_observation'); |
} else { |
$tables = array('cel_images','id_image'); |
} |
return $tables; |
} |
public function ajouterLiaisonMotsCles($id_utilisateur, $ids_elements_lies, $ids_mots_cles) { |
$mode = $this->mode; |
// 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 = 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) { |
// TODO!! ce_utilisateur |
$insert[] = '('.$id_image_ou_obs.','.Cel::db()->proteger($mot).')'; |
} |
} |
$gestion_mots_cles = new GestionMotsClesChemin($this->config, $mode); |
$insertion = $gestion_mots_cles->lierParTableaux($ids_mots_cles, $ids_elements_lies, $id_utilisateur); |
if(!$insert) { |
if(!$insertion) { |
// 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)); |
$this->logger('CEL_bugs', 'Pas de mot-clef à ajouter à des '.$mode.' : '. implode(',', $ids_elements_lies)); |
} |
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; |
} |
} |
// ... 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); |
foreach($ids_elements_lies as $id_element_lie) { |
$bool = self::regenererIndexTexteMotCle($id_element_lie, $mode); |
$ret = $ret & ($bool !== FALSE); // peut légitimement retourner 0 |
} |
return $ret; |
} |
public function supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_images_ou_obs, $mots_cles) { |
public function supprimerLiaisonsMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_elements_lies, $chemins) { |
$retour = $this->supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles); |
$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode); |
$retour = $gestion_mots_cles->supprimerLiaisonsMotsCles($chemins, $ids_elements_lies, $id_utilisateur); |
foreach($ids_images_ou_obs as $image_ou_obs) { |
self::regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur, $this->mode); |
foreach($ids_elements_lies as $id_element_lie) { |
self::regenererIndexTexteMotCle($id_element_lie, $this->mode); |
} |
return $retour; |
} |
public function supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) { |
public function supprimerToutesLiaisonsPourIdsElementsLies($id_utilisateur, $ids_elements_lie) { |
$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image'; |
$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image'; |
$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_'.$this->mode.'_mots_cles WHERE '. |
$champ_objet_lie.' IN ('.implode(',',$ids_images_ou_obs).') '. |
'AND '.$champ_mot_cle.' IN ('.implode(',',$mots_cles).')'; |
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle); |
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) { |
$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image'; |
$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image'; |
$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_'.$this->mode.'_mots_cles WHERE '. |
$champ_objet_lie.' IN ('.implode(',',$ids_images_ou_obs).') '; |
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle); |
if ($requete_suppression_liaison_mot_cle !== false) { |
$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode); |
$suppression_mot_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lie, $id_utilisateur); |
if ($suppression_mot_cles !== false) { |
return TRUE; |
} |
107,25 → 81,16 |
return FALSE; |
} |
public function supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles) { |
$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image'; |
$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image'; |
$chaine_mot_cles_ids = '('.implode(',', $tableau_ids_mots_cles).')'; |
public function supprimerToutesLiaisonsPourChemins($id_utilisateur, $chemins) { |
$requete_objets_lies_mot_cle = 'SELECT '.$champ_objet_lie.' as id FROM cel_'.$this->mode.'_mots_cles WHERE '. |
$champ_mot_cle.' IN '.$chaine_mot_cles_ids; |
$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode); |
$ids_elements_lies = $gestion_mots_cles->obtenirIdElementsLiesPourChemins($chemins); |
$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_'.$this->mode.'_mots_cles WHERE '. |
$champ_mot_cle.' IN '.$chaine_mot_cles_ids; |
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle); |
$resultat_requete_objets_lies_mot_cle = Cel::db()->requeter($requete_objets_lies_mot_cle); |
foreach($resultat_requete_objets_lies_mot_cle as $objet_lie) { |
self::regenererIndexTexteMotCle($objet_lie['id'], $id_utilisateur, $this->mode); |
foreach($ids_elements_lies as $id_element_lie) { |
self::regenererIndexTexteMotCle($id_element_lie['id_element_lie'], $this->mode); |
} |
$suppression_mot_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourChemins($chemins, $id_utilisateur); |
if ($requete_suppression_liaison_mot_cle !== false) { |
$retour = true; |
138,25 → 103,46 |
return $retour; |
} |
public function supprimerLiaisonsPourIdEtEnfants($id_utilisateur, $id_mot_cle) { |
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 = self::formaterTableauMotCleTextePourInsertion($mots_cles); |
$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode); |
// même s'il n'a pas d'enfants, le tableau contient au moins l'id du mot clé lui même |
$ids_mot_cle_et_enfants = $gestion_mots_cles->obtenirIdsMotsClesParIdParent($id_utilisateur, $id_mot_cle); |
// obtention des ids des éléments liés au mot clé ainsi qu'à ces enfants (afin de pouvoir |
// régénérer les index texte de mots clés sur les éléments liés |
$ids_a_delier = array(); |
// création de deux tableaux pour éviter un bug du au passage par référence |
// TODO: corriger ça bien proprement |
foreach($ids_mot_cle_et_enfants as &$id) { |
$ids_a_delier[] = $id['id_mot_cle']; |
$id = $id['id_mot_cle']; |
} |
// 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__)); |
$ids_elements_lies = $gestion_mots_cles->obtenirIdElementsLiesPourIds($ids_a_delier); |
$suppression_liaison = $gestion_mots_cles->supprimerToutesLiaisonsIdsMotsCles($ids_mot_cle_et_enfants, $id_utilisateur); |
foreach($ids_elements_lies as $id_element_lie) { |
self::regenererIndexTexteMotCle($id_element_lie, $this->mode); |
} |
return Cel::db()->executer($requete, __FILE__ , __LINE__); |
} |
static private function regenererIndexTexteMotCle($id_element_lie, $mode) { |
$sous_requete_concat = '('.sprintf(GestionMotsClesChemin::obtenirTemplateRequeteMotsClesTexte($mode), |
Cel::db()->proteger($id_element_lie)).')'; |
list($table, $champ_id) = self::getNomTables($mode); |
$requete = 'UPDATE '.$table.' SET mots_cles_texte = '.$sous_requete_concat.' '. |
'WHERE '.$champ_id.' = '.Cel::db()->proteger($id_element_lie).' '; |
return Cel::db()->executer($requete, __FILE__ , __LINE__); |
} |
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)'. |
/trunk/jrest/lib/RechercheImage.php |
---|
161,7 → 161,7 |
case "id_mots_cles"; |
$liste_mc = '"'.str_replace(';','","',$valeur).'"'; |
$sous_requete .= '' ; |
$sous_requete .= 'id_image IN (SELECT id_image FROM cel_images_mots_cles WHERE id_mot_cle_image IN ('.$liste_mc.'))'; |
$sous_requete .= 'id_image IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison WHERE id_mot_cle IN ('.$liste_mc.'))'; |
$sous_requete .= ' AND ' ; |
break; |
/trunk/jrest/lib/GestionMotsClesChemin.php |
---|
25,11 → 25,11 |
$this->mode = $mode; |
if($mode == 'obs') { |
$this->table_liaison = 'cel_obs_tags_path_liaison'; |
$this->table_mots_cles = 'cel_obs_tags_path'; |
$this->table_liaison = 'cel_mots_cles_obs_liaison'; |
$this->table_mots_cles = 'cel_arbre_mots_cles_obs'; |
} else { |
$this->table_liaison = 'cel_images_tags_path_liaison'; |
$this->table_mots_cles = 'cel_images_tags_path'; |
$this->table_liaison = 'cel_mots_cles_images_liaison'; |
$this->table_mots_cles = 'cel_arbre_mots_cles_images'; |
} |
} |
54,11 → 54,11 |
$premier = array_pop($mots_cles); |
$requete = "SELECT * FROM ".$this->table_liaison." lmc ". |
"INNER JOIN ".$this->table_mots_cles." mc ". |
"ON mc.tag = ".Cel::db()->proteger($premier)." AND lmc.id_tag = mc.id_tag "; |
"ON mc.tag = ".Cel::db()->proteger($premier)." AND lmc.id_mot_cle = mc.id_mot_cle "; |
foreach ($mots_cles as $mot_cle) { |
$requete .= " ".$operateur." id_element_lie IN (SELECT id_element_lie FROM ".$this->table_liaison." lmc ". |
"INNER JOIN ".$this->table_mots_cles." mc ". |
"ON mc.tag = ".Cel::db()->proteger($mot_cle)." AND lmc.id_tag = mc.id_tag ". |
"ON mc.tag = ".Cel::db()->proteger($mot_cle)." AND lmc.id_mot_cle = mc.id_mot_cle ". |
") "; |
} |
66,16 → 66,16 |
return $images; |
} |
private function construireRequeteChemin($mots_cles, $operateur = 'AND') { |
$criteres = array(); |
private function construireRequeteChemin($mots_cles, $operateur = 'AND') { |
$criteres = array(); |
$premier = array_pop($mots_cles); |
$requete = "SELECT * FROM ".$this->table_liaison." lmc ". |
"INNER JOIN ".$this->table_mots_cles." mc ". |
"ON mc.chemin LIKE ".Cel::db()->proteger('%'.$premier.'%')." AND lmc.id_tag = mc.id_tag "; |
"ON mc.chemin LIKE ".Cel::db()->proteger('%'.$premier.'%')." AND lmc.id_mot_cle = mc.id_mot_cle "; |
foreach ($mots_cles as $mot_cle) { |
$requete .= " ".$operateur." id_element_lie IN (SELECT id_element_lie FROM ".$this->table_liaison." lmc ". |
"INNER JOIN ".$this->table_mots_cles." mc ". |
"ON mc.chemin LIKE ".Cel::db()->proteger('%'.$mot_cle.'%')." AND lmc.id_tag = mc.id_tag ". |
"ON mc.chemin LIKE ".Cel::db()->proteger('%'.$mot_cle.'%')." AND lmc.id_mot_cle = mc.id_mot_cle ". |
") "; |
} |
84,7 → 84,6 |
} |
public function obtenirArbre($id_utilisateur, $chemin = "/") { |
$requete = "SELECT * FROM ".$this->table_mots_cles." ". |
"WHERE id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." AND ". |
"chemin LIKE ".Cel::db()->proteger($chemin."%")." ". |
96,8 → 95,19 |
return $arbre; |
} |
public function insererParChemin($mot_cle, $chemin_parent, $id_utilisateur) { |
public function obtenirIdsMotsClesParIdParent($id_utilisateur, $id_mot_cle) { |
$requete = "SELECT id_mot_cle FROM ".$this->table_mots_cles." ". |
"WHERE chemin LIKE CONCAT(". |
"(SELECT chemin FROM ".$this->table_mots_cles." ". |
"WHERE id_mot_cle = ".Cel::db()->proteger($id_mot_cle)."), ". |
"'%')"; |
$ids_enfants = Cel::db()->requeter($requete.' -- '.__FILE__.':'.__LINE__); |
return $ids_enfants; |
} |
public function insererParChemin($mot_cle, $chemin_parent, $id_utilisateur) { |
$chemin_mot_cle = self::getCheminHarmonise($chemin_parent, $mot_cle); |
$requete = "INSERT IGNORE INTO ".$this->table_mots_cles." (chemin, id_utilisateur, tag) ". |
108,18 → 118,25 |
")"; |
$insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
$resultat = false; |
if($insertion !== false) { |
$resultat = Cel::db()->obtenirDernierId(); |
} |
return $insertion; |
return $resultat; |
} |
public function insererParIdParent($mot_cle, $id_parent, $id_utilisateur) { |
public function insererParIdParent($mot_cle, $id_parent, $id_utilisateur) { |
$mot_cle_simp = self::simplifier($mot_cle); |
$sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." ctp ". |
"WHERE ctp.id_tag = ".Cel::db()->proteger($id_parent).")"; |
if($id_parent != "") { |
$sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." ctp ". |
"WHERE ctp.id_mot_cle = ".Cel::db()->proteger($id_parent).")"; |
} else { |
$sous_requete_chemin = Cel::db()->proteger("/"); |
} |
$requete = "INSERT INTO ".$this->table_mots_cles."(chemin, id_utilisateur, tag) ". |
$requete = "INSERT INTO ".$this->table_mots_cles."(chemin, id_utilisateur, mot_cle) ". |
"VALUES (". |
"CONCAT(".$sous_requete_chemin.",".Cel::db()->proteger($mot_cle_simp).",'/'), ". |
Cel::db()->proteger($id_utilisateur).", ". |
128,12 → 145,16 |
$insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
return $insertion; |
if($insertion !== false) { |
$resultat = Cel::db()->obtenirDernierId(); |
} |
return $resultat; |
} |
public function lierParId($id_mot_cle, $id_element_lie) { |
$requete = "INSERT INTO ".$this->table_liaison." (id_element_lie, id_tag) ". |
$requete = "INSERT INTO ".$this->table_liaison." (id_element_lie, id_mot_cle) ". |
"VALUES (". |
Cel::db()->proteger($id_element_lie).", ". |
Cel::db()->proteger($id_mot_cle)." ". |
147,12 → 168,12 |
public function lierParChemin($chemin, $id_element_lie, $id_utilisateur) { |
$sous_requete_chemin = '(SELECT id_tag FROM '.$this->table_mots_cles.' '. |
$sous_requete_chemin = '(SELECT id_mot_cle FROM '.$this->table_mots_cles.' '. |
'WHERE chemin = '.Cel::db()->proteger(self::harmoniserChemin($chemin)).' '. |
'AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' '. |
')'; |
$requete = "INSERT INTO ".$this->table_liaison." (id_element_lie, id_tag) ". |
$requete = "INSERT INTO ".$this->table_liaison." (id_element_lie, id_mot_cle) ". |
"VALUES (". |
Cel::db()->proteger($id_element_lie).", ". |
$sous_requete_chemin." ". |
164,10 → 185,115 |
return $liaison; |
} |
// OK jusqu'ici ! |
public function lierParTableaux($ids_mots_cles, $ids_elements_lies, $id_utilisateur) { |
foreach($ids_mots_cles as $id_mot_cle) { |
foreach($ids_elements_lies as $id_element_lie) { |
$combinaisons[] = '('. |
Cel::db()->proteger($id_element_lie).', '. |
Cel::db()->proteger($id_mot_cle). |
')'; |
} |
} |
$requete = "INSERT INTO ".$this->table_liaison." (id_element_lie, id_mot_cle) ". |
"VALUES ". |
implode(',', $combinaisons).' '. |
"ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie "; |
$liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
// Déplacer un mot clé et le renommer est une même opération, dans le cas du renommage, |
// seule la fin du chemin change |
return $liaison; |
} |
public function supprimerLiaisonsMotsCles($ids_mots_cles, $ids_elements_lies, $id_utilisateur) { |
$requete = 'DELETE FROM '.$this->table_liaison.' WHERE '; |
$combinaisons = array(); |
foreach($ids_mots_cles as $id_mot_cle) { |
foreach($ids_elements_lies as $id_element_lie) { |
$combinaisons[] = '('. |
'id_element_lie = '.Cel::db()->proteger($id_element_lie).' AND '. |
'id_mot_cle = '.Cel::db()->proteger($id_mot_cle). |
')'; |
} |
} |
$requete .= implode(' OR ', $combinaisons); |
$suppression = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
return $suppression; |
} |
public function supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lies, $id_utilisateur) { |
foreach($ids_elements_lies as &$id_element_lie) { |
$id_element_lie = Cel::db()->proteger($id_element_lie); |
} |
$requete = 'DELETE FROM '.$this->table_liaison.' '. |
'WHERE id_element_lie IN ('.implode(',', $ids_elements_lies).')'; |
$suppression = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
return $suppression; |
} |
public function supprimerToutesLiaisonsIdsMotsCles($ids_mots_cles, $id_utilisateur) { |
foreach($ids_mots_cles as &$id_mot_cle) { |
$id_mot_cle = Cel::db()->proteger($id_mot_cle); |
} |
$requete = 'DELETE FROM '.$this->table_liaison.' '. |
'WHERE id_mot_cle IN ('.implode(',', $ids_mots_cles).') '; |
$suppression = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
return $suppression; |
} |
public function renommerMotCle($id_mot_cle, $nouveau_nom) { |
$requete_ancien_chemin = 'SELECT chemin, id_utilisateur FROM '.$this->table_mots_cles.' '. |
'WHERE id_mot_cle = '.Cel::db()->proteger($id_mot_cle); |
$res_ancien_chemin = Cel::db()->requeter($requete_ancien_chemin.' -- '.__FILE__.':'.__LINE__); |
$ancien_chemin = $res_ancien_chemin[0]['chemin']; |
$id_utilisateur = $res_ancien_chemin[0]['id_utilisateur']; |
$tab_chemin = explode('/', $ancien_chemin); |
// le dernier élément du tableau est vide (à cause du / terminal) |
// c'est également le cas pour le premier (à cause du / qui commence le chemin) |
$tab_chemin[count($tab_chemin) - 2] = $nouveau_nom; |
$nouveau_chemin = implode('/', $tab_chemin); |
$requete = 'UPDATE '.$this->table_mots_cles.' '. |
'SET mot_cle = '.Cel::db()->proteger($nouveau_nom).' '. |
'WHERE id_mot_cle = '.Cel::db()->proteger($id_mot_cle).' '; |
$renommage = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
$this->renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur); |
return $renommage; |
} |
public function deplacerMotCle($id_mot_cle, $id_pere, $id_utilisateur) { |
$selection_chemin_pere = 'SELECT chemin FROM '.$this->table_mots_cles.' '. |
'WHERE id_mot_cle = '.Cel::db()->proteger($id_pere); |
$chemin_pere = Cel::db()->requeter($selection_chemin_pere.' -- '.__FILE__.':'.__LINE__); |
$chemin_pere = $chemin_pere[0]['chemin']; |
$selection_infos_mot_cle = 'SELECT chemin, mot_cle FROM '.$this->table_mots_cles.' '. |
'WHERE id_mot_cle = '.Cel::db()->proteger($id_mot_cle); |
$infos_mot_cle = Cel::db()->requeter($selection_infos_mot_cle.' -- '.__FILE__.':'.__LINE__); |
$ancien_chemin = $infos_mot_cle[0]['chemin']; |
$nouveau_chemin = $chemin_pere.'/'.$infos_mot_cle[0]['mot_cle']; |
return $this->renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur); |
} |
public function renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur) { |
$ancien_chemin = self::harmoniserChemin($ancien_chemin); |
176,15 → 302,14 |
$ancien_chemin_p = Cel::db()->proteger($ancien_chemin); |
$nouveau_chemin_p = Cel::db()->proteger($nouveau_chemin); |
// TODO : triggers pour les tables liées ? |
$condition_chemin = Cel::db()->proteger($ancien_chemin.'%'); |
$requete = "UPDATE ".$this->table_mots_cles." ". |
"SET chemin = REPLACE(chemin,".$ancien_chemin_p.", ".$nouveau_chemin_p.") ". |
"WHERE chemin LIKE ".Cel::db()->proteger($ancien_chemin."%")." AND ". |
"id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." "; |
"SET chemin = REPLACE(chemin,".$ancien_chemin_p.", ".$nouveau_chemin_p.") ". |
"WHERE chemin LIKE ".$condition_chemin." AND ". |
"id_utilisateur = ".$id_utilisateur." "; |
$deplacement = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
return $deplacement; |
return Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
} |
public function supprimerChemin($chemin, $id_utilisateur) { |
193,12 → 318,71 |
"WHERE chemin LIKE ".Cel::db()->proteger($chemin."%")." AND ". |
"id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." "; |
$suppression = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
return Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
} |
public function supprimerMotCleEtEnfantsParId($id_mot_cle, $id_utilisateur) { |
return $suppression; |
$selection_chemin = 'SELECT chemin FROM '.$this->table_mots_cles.' '. |
'WHERE id_mot_cle = '.Cel::db()->proteger($id_mot_cle); |
$chemin = Cel::db()->requeter($selection_chemin.' -- '.__FILE__.':'.__LINE__); |
$chemin = $chemin[0]['chemin']; |
$requete = "DELETE FROM ".$this->table_mots_cles." WHERE chemin LIKE ". |
Cel::db()->proteger($chemin.'%')." ". |
"AND id_utilisateur =".Cel::db()->proteger($id_utilisateur); |
return Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
} |
public function obtenirIdElementsLiesPourChemins($chemins) { |
foreach($chemins as &$chemin) { |
$chemin = Cel::db()->proteger(self::harmoniserChemin($chemin)); |
} |
$requete = 'SELECT id_element_lie FROM '.$this->table_liaison.' cl '. |
'INNER JOIN '.$this->table_mots_cles.' cm '. |
'ON cm.id_mot_cle = cl.id_mot_cle AND chemin IN ('.implode(',', $chemin).')'; |
$ids_pour_chemin = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
return $ids_pour_chemin; |
} |
public function obtenirIdElementsLiesPourIds($ids_mots_cles) { |
foreach($ids_mots_cles as $id_mot_cle) { |
$id_mot_cle = Cel::db()->proteger($id_mot_cle); |
} |
$requete = 'SELECT id_element_lie FROM '.$this->table_liaison.' '. |
'WHERE id_mot_cle IN ('.implode(',', $ids_mots_cles).')'; |
$ids_elements_lies = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__); |
return $ids_elements_lies; |
} |
public static function obtenirTemplateRequeteMotsClesTexte($mode) { |
if($mode == 'obs') { |
$table_liaison = 'cel_mots_cles_obs_liaison'; |
$table_mots_cles = 'cel_arbre_mots_cles_obs'; |
} else { |
$table_liaison = 'cel_mots_cles_images_liaison'; |
$table_mots_cles = 'cel_arbre_mots_cles_images'; |
} |
// renvoie un template de requete pour selectionner la concatenation |
// de mots clé pour un element donné (utilisable avec sprintf) |
return 'SELECT GROUP_CONCAT(mot_cle) '. |
'FROM '.$table_mots_cles.' cm '. |
'INNER JOIN '.$table_liaison.' cml '. |
'ON cml.id_mot_cle = cm.id_mot_cle '. |
'AND cml.id_element_lie = %s '; |
} |
// Fonctions utilitaires |
static public function comparerProfNoeuds($a, $b) { |
261,5 → 445,4 |
return $needle === "" || substr($haystack, -strlen($needle)) === $needle; |
} |
} |
?> |
/trunk/jrest/lib/Bdd2.php |
---|
133,5 → 133,9 |
} |
return $sortie; |
} |
public function obtenirDernierId() { |
return $this->lastInsertId(); |
} |
} |
/trunk/src/org/tela_botanica/client/modeles/dao/MotsClesAsynchroneDAO.java |
---|
12,6 → 12,7 |
import com.google.gwt.json.client.JSONArray; |
import com.google.gwt.json.client.JSONParser; |
import com.google.gwt.json.client.JSONValue; |
import com.google.gwt.user.client.Window; |
/** |
* DAO d'accès à l'arbre de mots clés |
23,6 → 24,8 |
private String identifiant = "" ; |
private String mode = ""; |
private String nomService = "InventoryKeywordTree"; |
//private String nomService = "InventoryKeyWordList"; |
public MotsClesAsynchroneDAO() { |
mode = "images"; |
43,7 → 46,7 |
public void obtenirListeMotsCles(final Rafraichissable r) { |
// on demande tous les mots clés associés à l'utilisateur |
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, Configuration.getServiceBaseUrl() |
+ "/InventoryKeyWordList/"+mode+"/"+identifiant+"/"); |
+ "/"+nomService+"/"+mode+"/"+identifiant+"/"); |
try { |
rb.sendRequest(null, new RequestCallback() { |
86,14 → 89,15 |
* |
* @param motcle |
* le mots clés à ajouter avec son parent et son identifiant |
* @param r |
*/ |
public void ajouterBaseDeDonnees(String motcle) { |
public void ajouterBaseDeDonnees(String motcle, final Rafraichissable r) { |
if (!motcle.equals("")) { |
String postData = motcle+"&mode="+mode; |
// on fait un post asynchrone |
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.POST, Configuration.getServiceBaseUrl() |
+ "/InventoryKeyWordList/"); |
+ "/"+nomService+"/"); |
try { |
rb.sendRequest(postData, new RequestCallback() { |
109,13 → 113,12 |
// TODO: les messages ne devraient pas être affichés ici |
// mais l'architecture par très malléable complique les choses |
if (response.getText().equals("OK")) { |
try { |
Integer idMotcle = Integer.parseInt(response.getText()); |
r.rafraichir(idMotcle, false); |
} catch (Exception e) { |
com.google.gwt.user.client.Window |
.alert("Le mot clé a été ajouté"); |
return; |
} else { |
com.google.gwt.user.client.Window |
.alert("Problème lors de la mise à jour des données, le serveur a répondu "+response.getText()); |
.alert("Problème lors de la mise à jour des données, le serveur a répondu "+response.getText()); |
} |
} |
139,7 → 142,7 |
postData += "&action=DELETE"; |
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.POST, Configuration.getServiceBaseUrl() |
+ "/InventoryKeyWordList/" |
+ "/"+nomService+"/" |
+ mode+"/" |
+ identifiant |
+ "/" |
183,8 → 186,9 |
* @param motcle |
* le mots clés à modifier avec son parent et son identifiant |
*/ |
public void modifierBaseDeDonnees(String motcle) { |
public void modifierBaseDeDonnees(String motcle, final Rafraichissable r) { |
//TODO : cette fonction n'a aucun sens, on lui passe une sorte de chaine |
// de requete url, elle devrait avoir au moins trois paramètres qu'elle assemble elle même |
if (!motcle.equals("")) { |
String postData = ""; |
191,7 → 195,7 |
postData += "&action=modification"+motcle; |
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.POST, Configuration.getServiceBaseUrl() |
+ "/InventoryKeyWordList/"+mode+"/"+ identifiant); |
+ "/"+nomService+"/"+mode+"/"+ identifiant); |
try { |
rb.sendRequest(postData, new RequestCallback() { |
209,6 → 213,7 |
if (response.getText().equals("OK")) { |
com.google.gwt.user.client.Window |
.alert("Le mot clé a été renommé"); |
r.rafraichir("OK", false); |
return; |
} else { |
com.google.gwt.user.client.Window |
231,7 → 236,7 |
* le mots clés à ajouter avec son ancien parent, son nouveau et |
* son identifiant |
*/ |
public void deplacerBaseDeDonnees(String motcle) { |
public void deplacerBaseDeDonnees(String motcle, final Rafraichissable r) { |
if (!motcle.equals("")) { |
239,7 → 244,7 |
postData += "&action=deplacement"+motcle; |
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.POST, Configuration.getServiceBaseUrl() |
+ "/InventoryKeyWordList/"+mode+"/"+identifiant); |
+ "/"+nomService+"/"+mode+"/"+identifiant); |
try { |
rb.sendRequest(postData, new RequestCallback() { |
252,8 → 257,7 |
@Override |
public void onResponseReceived(Request request, |
Response response) { |
// TODO Auto-generated method stub |
r.rafraichir("OK", false); |
} |
}); |
262,7 → 266,5 |
e.printStackTrace(); |
} |
} |
} |
} |
/trunk/src/org/tela_botanica/client/observation/ObservationModele.java |
---|
28,8 → 28,11 |
import org.tela_botanica.client.modeles.objets.Observation; |
import org.tela_botanica.client.modeles.objets.Utilisateur; |
import org.tela_botanica.client.modeles.objets.ListeReferentielPerso.TypesReferentiels; |
import org.tela_botanica.client.util.MotsClesUtilitaire; |
import com.google.gwt.json.client.JSONArray; |
import com.google.gwt.json.client.JSONObject; |
import com.google.gwt.user.client.Window; |
import com.gwtext.client.data.Node; |
import com.gwtext.client.data.Tree; |
import com.gwtext.client.widgets.tree.TreeNode; |
409,67 → 412,15 |
@Override |
public void rafraichir(Object nouvelleDonnees, |
boolean repandreRaffraichissement) { |
boolean repandreRaffraichissement) { |
if(nouvelleDonnees instanceof JSONArray) { |
// alors on a reçu les informations sur les mots clés |
JSONArray reponse = (JSONArray) nouvelleDonnees; |
final int taillemax = reponse.size(); |
// si le tableau est vide |
if (taillemax == 0) { |
// on crée un arbre vide |
TreeNode root = new TreeNode(); |
root.setId("racine_obs"); |
root.setText("Projets"); |
String[] usObj = { "Projets", "racine_obs" }; |
root.setUserObject(usObj); |
arbreMotsCles.setRootNode(root); |
} |
// pour chacun des élements du tableau |
for (int j = 0; j < taillemax; j++) { |
// on extrait les élements du tableau |
if (reponse.get(j).isObject() != null) { |
JSONObject noeud = (JSONObject) reponse.get(j); |
String id_noeud = noeud.get("id_mot_cle_obs") |
.isString().stringValue(); |
String mot_cle = noeud.get("mot_cle").isString() |
.stringValue(); |
String parent = noeud.get("ce_mot_cle_obs_parent").isString() |
.stringValue(); |
String[] usObj = { mot_cle, id_noeud }; |
// et on construit l'arbre à partir de la racine (qui est |
// toujoursl e premier élément) |
if (id_noeud.equals("racine_obs")) { |
TreeNode root = new TreeNode(); |
root.setId(id_noeud); |
root.setText(mot_cle); |
root.setUserObject(usObj); |
arbreMotsCles.setRootNode(root); |
} else { |
// et en ajoutant les noeuds un à un (qui sont renvoyé |
// dans l'ordre hierarchique de leur niveau |
// ce qui permet de les traiter séquentiellement) |
TreeNode node = new TreeNode(); |
node.setId(id_noeud); |
node.setText(mot_cle); |
node.setChecked(false); |
Node parentNode = arbreMotsCles.getNodeById(parent); |
node.setUserObject(usObj); |
parentNode.appendChild(node); |
} |
motsCles.put(id_noeud, mot_cle); |
} |
} |
JSONArray donneesArbre = (JSONArray)nouvelleDonnees; |
Object[] arbreEtCorrespondancesIds = MotsClesUtilitaire.construireArbre("Projets", "racine_obs", donneesArbre); |
arbreMotsCles = (Tree)arbreEtCorrespondancesIds[0]; |
motsCles = (HashMap<String, String>)arbreEtCorrespondancesIds[1]; |
// enfin on met à jour l'arbre des mots clés contenu dans le modèle |
//rafraichirArbreMotsCles(arbreMotsCles); |
// et on notifie le médiateur de la mise à jour en lui passant une |
592,7 → 543,7 |
* l'arbre des mots cles en cours |
*/ |
public void ajouterMotCleDansArbre(TreeNode n, |
com.gwtext.client.data.Tree arbreMC) { |
com.gwtext.client.data.Tree arbreMC, Rafraichissable r) { |
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("obs"); |
String[] usObj = (String[]) n.getUserObject(); |
602,16 → 553,21 |
if (!id.equals("racine_obs")) { |
String[] parentUsObj = (String[]) n.getParentNode().getUserObject(); |
parentId = parentUsObj[1]; |
if(parentUsObj[1].equals("racine_obs")) { |
parentId= ""; |
} else { |
parentId = parentUsObj[1]; |
} |
} else { |
parentId = "racine_obs"; |
parentId = ""; |
} |
rafraichirArbreMotsCles(arbreMC); |
motsCles.put(id, motCle); |
String nouveauMotCle = "&identifiant=" + Utilisateur.getInstance().getIdentifiantUtilisateurConsulte() + "&motcle=" |
+ motCle + "&id=" + id + "&parent=" + parentId; |
MCDao.ajouterBaseDeDonnees(nouveauMotCle); |
MCDao.ajouterBaseDeDonnees(nouveauMotCle, r); |
} |
/** |
645,7 → 601,7 |
* @param arbreMC |
* l'arbre des mots clés en cours |
*/ |
public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC) { |
public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) { |
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("obs"); |
665,7 → 621,7 |
String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent=" |
+ parentId; |
MCDao.modifierBaseDeDonnees(motCleModifie); |
MCDao.modifierBaseDeDonnees(motCleModifie, r); |
} |
678,7 → 634,7 |
* @param arbreMC |
* l'arbre des mots cles en cours |
*/ |
public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC) { |
public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) { |
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("obs"); |
String[] usObj = (String[]) n.getUserObject(); |
696,7 → 652,7 |
String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent=" |
+ parentId; |
MCDao.deplacerBaseDeDonnees(motCleModifie); |
MCDao.deplacerBaseDeDonnees(motCleModifie, r); |
} |
/** |
/trunk/src/org/tela_botanica/client/observation/ObservationMediateur.java |
---|
1021,10 → 1021,8 |
* @param arbreMC |
* le nouvel arbre de mots clés à mettre à jour |
*/ |
public void ajouterMotCleDansArbre(TreeNode n, Tree arbreMC) { |
observationModele.ajouterMotCleDansArbre(n, arbreMC); |
getPanneauFiltres().getArbreMotsClesObservationVue().rafraichir(n, false); |
public void ajouterMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) { |
observationModele.ajouterMotCleDansArbre(n, arbreMC, r); |
} |
/** |
1053,10 → 1051,7 |
* le nouvel arbre de mots clés à mettre à jour |
*/ |
public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC) { |
observationModele.modifierMotCleDansArbre(n, arbreMC); |
getPanneauFiltres().getArbreMotsClesObservationVue().rafraichir(n, false); |
observationModele.modifierMotCleDansArbre(n, arbreMC, getPanneauFiltres().getArbreMotsClesObservationVue()); |
} |
/** |
1070,7 → 1065,7 |
*/ |
public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC) { |
observationModele.deplacerMotCleDansArbre(n, arbreMC); |
observationModele.deplacerMotCleDansArbre(n, arbreMC, getPanneauFiltres().getArbreMotsClesObservationVue()); |
} |
/trunk/src/org/tela_botanica/client/util/MotsClesUtilitaire.java |
---|
New file |
0,0 → 1,116 |
package org.tela_botanica.client.util; |
import java.util.HashMap; |
import com.google.gwt.json.client.JSONArray; |
import com.google.gwt.json.client.JSONObject; |
import com.google.gwt.user.client.Window; |
import com.gwtext.client.data.Node; |
import com.gwtext.client.data.Tree; |
import com.gwtext.client.widgets.tree.TreeNode; |
public class MotsClesUtilitaire { |
//TODO rassembler tout ce qui construit les arbres de mots clés ici |
public static String obtenirCheminParent(String cheminMotCle, String motCle) { |
return cheminMotCle.substring(0, cheminMotCle.length() - motCle.length() -1); |
} |
public static Object[] construireArbre(String NomRacine, String idRacine, |
JSONArray arbreJson) { |
Tree arbreMotsCles = new Tree() ; |
HashMap<String, String> motsCles = new HashMap<String, String>(0); |
HashMap<String, String> parentes = new HashMap<String, String>(); |
final int taillemax = arbreJson.size(); |
// on crée un arbre vide |
TreeNode root = new TreeNode(); |
root.setId(idRacine); |
root.setText(NomRacine); |
String[] usObjRacine = {NomRacine, idRacine}; |
root.setUserObject(usObjRacine); |
arbreMotsCles.setRootNode(root); |
// le mot clé racine possède le chemin racine ("/") |
parentes.put("/", idRacine); |
// pour chacun des élements du tableau |
for (int j = 0; j < taillemax; j++) { |
// on extrait les élements du tableau |
if (arbreJson.get(j).isObject() != null) { |
JSONObject noeud = (JSONObject) arbreJson.get(j); |
String idMotCle = noeud.get("id_mot_cle") |
.isString().stringValue(); |
String motCle = noeud.get("mot_cle").isString() |
.stringValue(); |
String chemin = noeud.get("chemin").isString() |
.stringValue(); |
String cheminParent = MotsClesUtilitaire.obtenirCheminParent(chemin, motCle); |
String parent = parentes.get(cheminParent); |
String[] usObj = {motCle, idMotCle}; |
// et on construit l'arbre en ajoutant les noeuds un à un (qui sont renvoyés |
// dans l'ordre hierarchique de leur niveau |
// ce qui permet de les traiter séquentiellement) |
TreeNode node = new TreeNode(); |
node.setId(idMotCle); |
node.setText(motCle); |
node.setChecked(false); |
Node parentNode = arbreMotsCles.getNodeById(parent); |
node.setUserObject(usObj); |
parentNode.appendChild(node); |
parentes.put(chemin, idMotCle); |
motsCles.put(idMotCle, motCle); |
} |
} |
Object[] retour = {arbreMotsCles, motsCles}; |
return retour; |
} |
public static String construireChemin(TreeNode nd) { |
String chemin = "/"; |
Node node = nd; |
while(node != null) { |
String[] usObj = (String[])node.getUserObject(); |
chemin = usObj[0]+"/"+chemin; |
node = node.getParentNode(); |
} |
return chemin; |
} |
/** |
* Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un |
* copie du sous arbre du premier noeud, qu'elle concatène au deuxième |
* |
* @param ndPereOriginal |
* le père des noeuds de l'arbre original |
* @param ndPereCopie |
* le père qui va recevoir les copies |
*/ |
public static void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) { |
if (ndPereCopie != null && ndPereOriginal != null) { |
Node[] ndNodeFils = ndPereOriginal.getChildNodes(); |
for (int i = 0; i < ndNodeFils.length; i++) { |
String[] usObj = (String[]) ndNodeFils[i].getUserObject(); |
TreeNode child = new TreeNode(usObj[0]); |
child.setId(usObj[1]); |
child.setChecked(false); |
child.setUserObject(usObj); |
ndPereCopie.appendChild(child); |
if (!ndNodeFils[i].isLeaf()) { |
copierFilsNoeud(ndNodeFils[i], child); |
} |
} |
} |
} |
} |
/trunk/src/org/tela_botanica/client/image/ImageMediateur.java |
---|
1117,8 → 1117,8 |
* @param arbreMC |
* le nouvel arbre de mots clés à mettre à jour |
*/ |
public void ajouterMotCleDansArbre(TreeNode n, Tree arbreMC) { |
getIModele().ajouterMotCleDansArbre(n, arbreMC); |
public void ajouterMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) { |
getIModele().ajouterMotCleDansArbre(n, arbreMC, r); |
filtres.getMotsClesFiltre().rafraichir(arbreMC, false); |
mettreAJourListeMotsClesAffiches(); |
} |
1148,9 → 1148,8 |
* le nouvel arbre de mots clés à mettre à jour |
*/ |
public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC) { |
getIModele().modifierMotCleDansArbre(n, arbreMC); |
getIModele().modifierMotCleDansArbre(n, arbreMC, filtres.getMotsClesFiltre()); |
getIModele().mettreAjourMotsClesId(n.getText(), n.getId()); |
filtres.getMotsClesFiltre().rafraichir(arbreMC, false); |
mettreAJourListeMotsClesAffiches(); |
} |
1164,8 → 1163,7 |
* le nouvel arbre de mots clés à mettre à jour |
*/ |
public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC) { |
getIModele().deplacerMotCleDansArbre(n, arbreMC); |
filtres.getMotsClesFiltre().rafraichir(arbreMC, false); |
getIModele().deplacerMotCleDansArbre(n, arbreMC, filtres.getMotsClesFiltre()); |
mettreAJourListeMotsClesAffiches(); |
} |
1786,7 → 1784,7 |
@Override |
protected void surAjoutMotCle(TreeNode node, Tree arbre) { |
ajouterMotCleDansArbre(node, arbre); |
ajouterMotCleDansArbre(node, arbre, fnMc); |
} |
@Override |
/trunk/src/org/tela_botanica/client/image/ImageModele.java |
---|
20,6 → 20,7 |
import org.tela_botanica.client.modeles.objets.ListeImageCarnet; |
import org.tela_botanica.client.modeles.objets.ListeObservation; |
import org.tela_botanica.client.modeles.objets.Utilisateur; |
import org.tela_botanica.client.util.MotsClesUtilitaire; |
import com.google.gwt.json.client.JSONArray; |
import com.google.gwt.json.client.JSONObject; |
482,65 → 483,14 |
// si on reçoit un tableau JSON |
if (nouvelleDonnees instanceof JSONArray) { |
// alors on a reçu les informations sur les mots clés |
JSONArray reponse = (JSONArray) nouvelleDonnees; |
final int taillemax = reponse.size(); |
// si le tableau est vide |
if (taillemax == 0) { |
// on crée un arbre vide |
TreeNode root = new TreeNode(); |
root.setId("racine"); |
root.setText("Tags"); |
String[] usObj = { "Tags", "racine" }; |
root.setUserObject(usObj); |
arbreMotsCles.setRootNode(root); |
} |
// alors on a reçu les informations sur les mots clés |
JSONArray donneesArbre = (JSONArray)nouvelleDonnees; |
HashMap<String, String> motsCles = new HashMap<String, String>(taillemax); |
Object[] arbreEtCorrespondancesIds = MotsClesUtilitaire.construireArbre("Tags", "racine", donneesArbre); |
arbreMotsCles = (Tree)arbreEtCorrespondancesIds[0]; |
motsCles = (HashMap<String, String>)arbreEtCorrespondancesIds[1]; |
// pour chacun des élements du tableau |
for (int j = 0; j < taillemax; j++) { |
// on extrait les élements du tableau |
if (reponse.get(j).isObject() != null) { |
JSONObject noeud = (JSONObject) reponse.get(j); |
String id_noeud = noeud.get("id_mot_cle_image") |
.isString().stringValue(); |
String mot_cle = noeud.get("mot_cle").isString() |
.stringValue(); |
String parent = noeud.get("ce_mot_cle_image_parent").isString() |
.stringValue(); |
String[] usObj = { mot_cle, id_noeud }; |
// et on construit l'arbre à partir de la racine (qui est |
// toujours le premier élément) |
if (id_noeud.equals("racine")) { |
TreeNode root = new TreeNode(); |
root.setId(id_noeud); |
root.setText(mot_cle); |
root.setUserObject(usObj); |
arbreMotsCles.setRootNode(root); |
} else { |
// et en ajoutant les noeuds un à un (qui sont renvoyé |
// dans l'ordre hierarchique de leur niveau |
// ce qui permet de les traiter séquentiellement) |
TreeNode node = new TreeNode(); |
node.setId(id_noeud); |
node.setText(mot_cle); |
node.setChecked(false); |
Node parentNode = arbreMotsCles.getNodeById(parent); |
node.setUserObject(usObj); |
parentNode.appendChild(node); |
} |
motsCles.put(id_noeud, mot_cle); |
} |
} |
// enfin on met à jour l'arbre des mots clés contenu dans le modèle |
rafraichirArbreMotsCles(arbreMotsCles); |
// la table de hachage |
653,7 → 603,7 |
* l'arbre des mots cles en cours |
*/ |
public void ajouterMotCleDansArbre(TreeNode n, |
com.gwtext.client.data.Tree arbreMC) { |
com.gwtext.client.data.Tree arbreMC, Rafraichissable r) { |
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images"); |
String[] usObj = (String[]) n.getUserObject(); |
673,7 → 623,7 |
String nouveauMotCle = "&identifiant=" + getIdentifiant() + "&motcle=" |
+ motCle + "&id=" + id + "&parent=" + parentId; |
MCDao.ajouterBaseDeDonnees(nouveauMotCle); |
MCDao.ajouterBaseDeDonnees(nouveauMotCle, r); |
} |
/** |
705,7 → 655,7 |
* @param arbreMC |
* l'arbre des mots clés en cours |
*/ |
public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC) { |
public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) { |
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images"); |
725,7 → 675,7 |
String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent=" |
+ parentId; |
MCDao.modifierBaseDeDonnees(motCleModifie); |
MCDao.modifierBaseDeDonnees(motCleModifie, r); |
} |
738,7 → 688,7 |
* @param arbreMC |
* l'arbre des mots cles en cours |
*/ |
public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC) { |
public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) { |
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images"); |
String[] usObj = (String[]) n.getUserObject(); |
756,7 → 706,7 |
String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent=" |
+ parentId; |
MCDao.deplacerBaseDeDonnees(motCleModifie); |
MCDao.deplacerBaseDeDonnees(motCleModifie, r); |
} |
/** |
/trunk/src/org/tela_botanica/client/vues/ArbreMotsClesFiltreVue.java |
---|
4,6 → 4,7 |
import org.tela_botanica.client.interfaces.Filtrable; |
import org.tela_botanica.client.interfaces.Rafraichissable; |
import org.tela_botanica.client.observation.ObservationMediateur; |
import org.tela_botanica.client.util.MotsClesUtilitaire; |
import com.gwtext.client.core.EventObject; |
import com.gwtext.client.data.Node; |
248,7 → 249,7 |
} |
// et on recopie le nouvel arbre |
copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles |
MotsClesUtilitaire.copierFilsNoeud(nouvelArbre.getRootNode(), arbreMotsCles |
.getRootNode()); |
// si l'arbre n'était pas encore considéré comme instancié |
334,35 → 335,6 |
} |
/** |
* Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un |
* copie du sous arbre du premier noeud, qu'elle concatène au deuxième |
* |
* @param ndPereOriginal |
* le père des noeuds de l'arbre original |
* @param ndPereCopie |
* le père qui va recevoir les copies |
*/ |
private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) { |
if (ndPereCopie != null && ndPereOriginal != null) { |
Node[] ndNodeFils = ndPereOriginal.getChildNodes(); |
for (int i = 0; i < ndNodeFils.length; i++) { |
String[] usObj = (String[]) ndNodeFils[i].getUserObject(); |
TreeNode child = new TreeNode(usObj[0]); |
child.setId(usObj[1] +prefixe); |
child.setUserObject(usObj); |
ndPereCopie.appendChild(child); |
if (!ndNodeFils[i].isLeaf()) { |
copierFilsNoeud(ndNodeFils[i], child); |
} |
} |
} |
} |
/** |
* Méthode héritée de Filtrable Renvoie l'état du filtre (modifié ou non) |
*/ |
@Override |
/trunk/src/org/tela_botanica/client/vues/observation/filtres/ArbreMotsClesObservationVue.java |
---|
2,6 → 2,8 |
import org.tela_botanica.client.interfaces.Filtrable; |
import org.tela_botanica.client.interfaces.Rafraichissable; |
import org.tela_botanica.client.observation.ObservationMediateur; |
import org.tela_botanica.client.util.MotsClesUtilitaire; |
import com.google.gwt.user.client.Window; |
import com.gwtext.client.core.EventObject; |
import com.gwtext.client.data.Node; |
94,6 → 96,8 |
MultiSelectionModel msModel = null; |
private String cheminTemporaireAjout = null; |
/** |
* Constructeur sans paramètre (privé car interdit d'utilisation) |
*/ |
243,6 → 247,8 |
* Ajoute les listeners nécessaires pour la gestion des évènements |
*/ |
private void ajouterListeners() { |
final Rafraichissable r = this; |
arbreMotsCles.addListener(new TreePanelListenerAdapter() { |
// gestion du clic sur un noeud |
292,7 → 298,7 |
// on notifie le médiateur de l'ajout et on lui passe |
// l'arbre |
getOMediateur().ajouterMotCleDansArbre(nd, |
getArbreMotsCles().getTree()); |
getArbreMotsCles().getTree(), r); |
// et considère l'ajout achevé |
ajoutNoeud = false; |
} |
307,7 → 313,7 |
modifNoeud = false; |
} |
} |
arbreMotsCles.disable(); |
} |
// gestion du déplacement d'un noeud |
442,8 → 448,8 |
String[] usObject = new String[2]; |
// l'objet contient le nom du noeud |
usObject[0] = ""; |
usObject[1] = genererIdMotCle(nd); |
nd.setId(usObject[1]); |
usObject[1] = ""; |
nd.setUserObject(usObject); |
// l'identifiant d'un noeud c'est son hashcode |
// l'objet associé au noeud contient aussi son identifiant |
450,13 → 456,16 |
// on le concatène au parent et on étend ses enfants |
parent.appendChild(nd); |
// en attendant qu'il soit ajouté on lui affecte son chemin en tant qu'id |
// ce qui permettra de le retrouver et de lui affecter son id sur retour du web service |
cheminTemporaireAjout = MotsClesUtilitaire.construireChemin(nd); |
nd.setId(cheminTemporaireAjout); |
parent.expand(); |
// enfin on place le curseur et on fait apparaitre le champ d'édition |
// pour que l'utilisateur nomme son mot clé |
te.startEdit(nd); |
} |
/** |
* Fonction de gestion sur le clic sur le noeud |
* |
580,7 → 589,7 |
rootChild[i].remove(); |
} |
copierFilsNoeud(nouvelArbre.getRootNode(),getArbreMotsCles().getRootNode()); |
MotsClesUtilitaire.copierFilsNoeud(nouvelArbre.getRootNode(),getArbreMotsCles().getRootNode()); |
// si l'arbre n'était pas encore considéré comme instancié |
if (!arbreCharge) { |
622,41 → 631,20 |
motsClesEnAttente = motsClesIds; |
} |
} |
} |
private String genererIdMotCle(TreeNode nd) { |
double IdMC = (nd.hashCode() + ((Math.random() * 10000) + 1)); |
return ""+IdMC; |
} |
/** |
* Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un |
* copie du sous arbre du premier noeud, qu'elle concatène au deuxième |
* |
* @param ndPereOriginal |
* le père des noeuds de l'arbre original |
* @param ndPereCopie |
* le père qui va recevoir les copies |
*/ |
private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) { |
if (ndPereCopie != null && ndPereOriginal != null) { |
Node[] ndNodeFils = ndPereOriginal.getChildNodes(); |
for (int i = 0; i < ndNodeFils.length; i++) { |
String[] usObj = (String[]) ndNodeFils[i].getUserObject(); |
TreeNode child = new TreeNode(usObj[0]); |
child.setId(usObj[1]); |
child.setUserObject(usObj); |
ndPereCopie.appendChild(child); |
if (!ndNodeFils[i].isLeaf()) { |
copierFilsNoeud(ndNodeFils[i], child); |
} |
// reception d'un nouvel identifiant de mot clé |
if(nouvelleDonnees instanceof Integer) { |
if(cheminTemporaireAjout != null) { |
String id = ((Integer)(nouvelleDonnees)).toString(); |
TreeNode noeudEnAjout = arbreMotsCles.getNodeById(cheminTemporaireAjout); |
String[] userObj = {noeudEnAjout.getText(), id}; |
noeudEnAjout.setUserObject(userObj); |
noeudEnAjout.setId(id); |
cheminTemporaireAjout = null; |
} |
} |
arbreMotsCles.enable(); |
} |
public void raz() { |
/trunk/src/org/tela_botanica/client/vues/observation/filtres/ArbreDateObservationFiltreVue.java |
---|
52,8 → 52,6 |
* La structure de donnees qui stocke l'arbre. Utilisee a ce niveau car trop liee a la vue |
*/ |
private Tree donneesDates = new Tree(); |
/** |
* booléen d'initialisation |
*/ |
/trunk/src/org/tela_botanica/client/vues/image/filtres/ArbreDateImageFiltreVue.java |
---|
49,8 → 49,6 |
* La structure de donnees qui stocke l'arbre. Utilisee a ce niveau car trop liee a la vue |
*/ |
private Tree donneesDates = new Tree(); |
/** |
* booléen d'initialisation |
*/ |
/trunk/src/org/tela_botanica/client/vues/ArbreMotsClesVue.java |
---|
2,6 → 2,7 |
import org.tela_botanica.client.image.ImageMediateur; |
import org.tela_botanica.client.interfaces.Rafraichissable; |
import org.tela_botanica.client.util.MotsClesUtilitaire; |
import com.google.gwt.user.client.Window; |
import com.gwtext.client.core.EventObject; |
80,6 → 81,8 |
*/ |
private boolean motsCleInitialises; |
private String cheminTemporaireAjout; |
/** |
* Constructeur sans paramètre (privé car interdit d'utilisation) |
*/ |
178,6 → 181,8 |
* Ajoute les listeners nécessaires pour la gestion des évènements |
*/ |
private void ajouterListeners() { |
final Rafraichissable r = this; |
arbreMotsCles.addListener(new TreePanelListenerAdapter() { |
@Override |
226,7 → 231,7 |
// et on notifie le médiateur de l'ajout et on lui passe |
// l'arbre |
getIMediateur().ajouterMotCleDansArbre(nd, |
getArbreMotsCles().getTree()); |
getArbreMotsCles().getTree(), r); |
} |
// si c'est noeud déjà existant |
else { |
347,8 → 352,9 |
String[] usObject = new String[2]; |
// l'objet contient le nom du noeud |
usObject[0] = ""; |
usObject[1] = genererIdMotCle(nd); |
nd.setId(usObject[1]); |
cheminTemporaireAjout = MotsClesUtilitaire.construireChemin(nd); |
usObject[1] = cheminTemporaireAjout; |
nd.setId(cheminTemporaireAjout); |
nd.setUserObject(usObject); |
// l'identifiant d'un noeud c'est son hashcode |
// l'objet associé au noeud contient aussi son identifiant |
441,7 → 447,7 |
rootChild[i].remove(); |
} |
copierFilsNoeud(nouvelArbre.getRootNode(),getArbreMotsCles().getRootNode()); |
MotsClesUtilitaire.copierFilsNoeud(nouvelArbre.getRootNode(),getArbreMotsCles().getRootNode()); |
// si l'arbre n'était pas encore considéré comme instancié |
if (!arbreCharge) { |
460,39 → 466,19 |
tableauMotsClesEnCours = (String[]) nouvelleDonnees; |
cocherMotsCles(tableauMotsClesEnCours); |
} |
} |
private String genererIdMotCle(TreeNode nd) { |
return "" + (nd.hashCode() + (Math.random() * 10000)); |
} |
/** |
* Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un |
* copie du sous arbre du premier noeud, qu'elle concatène au deuxième |
* |
* @param ndPereOriginal |
* le père des noeuds de l'arbre original |
* @param ndPereCopie |
* le père qui va recevoir les copies |
*/ |
private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) { |
if (ndPereCopie != null && ndPereOriginal != null) { |
Node[] ndNodeFils = ndPereOriginal.getChildNodes(); |
for (int i = 0; i < ndNodeFils.length; i++) { |
String[] usObj = (String[]) ndNodeFils[i].getUserObject(); |
TreeNode child = new TreeNode(usObj[0]); |
child.setId(usObj[1]); |
child.setChecked(false); |
child.setUserObject(usObj); |
ndPereCopie.appendChild(child); |
if (!ndNodeFils[i].isLeaf()) { |
copierFilsNoeud(ndNodeFils[i], child); |
} |
// reception d'un nouvel identifiant de mot clé |
if(nouvelleDonnees instanceof Integer) { |
if(cheminTemporaireAjout != null) { |
String id = ((Integer)(nouvelleDonnees)).toString(); |
TreeNode noeudEnAjout = arbreMotsCles.getNodeById(cheminTemporaireAjout); |
String[] userObj = {noeudEnAjout.getText(), id}; |
noeudEnAjout.setUserObject(userObj); |
noeudEnAjout.setId(id); |
cheminTemporaireAjout = null; |
} |
} |
arbreMotsCles.enable(); |
} |
} |