New file |
0,0 → 1,394 |
<?php |
// declare(encoding='UTF-8'); |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* Service de recherche et modification de l'arbre des mots clés associés à un id. |
* 1: Le service recoit un mot clé à ajouter à l'arbre |
* 2: Le service recherche l'arbre ou sous arbre correspondant au critères demandé |
* 3: Le service renvoie l'arbre au format json |
* |
* 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 InventoryKeyWordList extends Cel { |
|
protected $suffix = ''; |
|
public function getElement($uid) { |
// Controle detournement utilisateur |
session_start(); |
$this->suffix = '_'.$uid[0]; |
$id_utilisateur = $uid[1] ; |
$this->controleUtilisateur($uid[1]); |
|
$requete = 'SELECT mot_cle, id_mot_cle_utilisateur, ce_mot_cle_utilisateur_parent '. |
'FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE ce_utilisateur = '.$this->proteger($id_utilisateur).' '. |
'ORDER BY niveau '; |
|
$resultats_mots_cles = $this->requeter($requete); |
|
if (is_array($resultats_mots_cles)) { |
$mots_cles = array(); |
foreach($resultats_mots_cles as $mot_cle) { |
$mots_cles[] = $mot_cle; |
} |
|
$infos = json_encode($mots_cles); |
header('content-type: application/json'); |
print $infos; |
exit(); |
} |
} |
|
public function updateElement($uid, $pairs) { |
session_start(); |
$this->suffix = '_'.$uid[0]; |
$id_utilisateur = $uid[1]; |
$this->controleUtilisateur($uid[1]); |
|
$id_mot_cle = $pairs['id']; |
$action = $pairs['action']; |
|
if ($action == 'modification') { |
$nouveau_nom = $pairs['motcle']; |
$nouvel_id_general = md5(strtolower($nouveau_nom)); |
|
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET mot_cle = '.$this->proteger($nouveau_nom).' , '. |
' md5 = '.$this->proteger($nouvel_id_general).' '. |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur) ; |
$reussite = $this->executer($requete); |
if ($reussite) { |
echo 'OK'; |
} |
} else if ($action == 'deplacement') { |
|
$this->commencerTransaction(); |
|
$transaction_reussie_1 = true; |
$id_pere = $pairs['parent']; |
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur); |
$bg = $bornes['bg']; |
$bd = $bornes['bd']; |
$niveau = $bornes['niveau']; |
|
// on inverse l'intervalle de l'élément déplacé et du sous arbre |
$transaction_reussie_2 = $this->exclureIntervalle($bg, $bd, $id_utilisateur); |
|
$bg_negative = $bg - $bd - 1; |
$bd_negative = $bd - $bd - 1; |
|
// on recalcule les intervalles de l'arbre privé de ce sous arbre |
$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur); |
|
$bornes_pere = $this->calculerBornesEtNiveau($id_pere, $id_utilisateur); |
$bg_pere = $bornes_pere['bg']; |
$bd_pere = $bornes_pere['bd']; |
|
$niveau_pere = $bornes_pere['niveau']; |
|
$decalage = $bd - $bg + 1; |
|
// on decale les bornes droite du pere pour préparer l'insertion |
$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur); |
|
$nouvelle_bd = $bd_pere + $decalage; |
$modif_niveau = $niveau_pere - $niveau + 1; |
|
$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur); |
|
$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur); |
|
if ($transaction_reussie_1 && $transaction_reussie_2 && $transaction_reussie_3 && $transaction_reussie_4 && $transaction_reussie_5 && $transaction_reussie_6) { |
$this->completerTransaction(); |
} else { |
$this->annulerTransaction(); |
} |
|
} |
} |
|
public function createElement($pairs) { |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($pairs['ce_utilisateur']); |
|
$this->suffix = '_'.$pairs['mode']; |
$id_utilisateur = $pairs['ce_utilisateur']; |
$mot_cle = $pairs['motcle']; |
|
// TODO supprimer accents |
$id_mot_cle_general = md5(mb_strtolower($mot_cle)); |
$id_mot_cle = $pairs['id']; |
$id_parent = $pairs['parent']; |
|
$this->ajouterMotCleRacine($id_utilisateur); |
|
$this->commencerTransaction(); |
|
$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur); |
$borne_pere = $bornes['bd']; |
$niveau = $bornes['niveau'] + 1; |
$bg = $bornes['bd']; |
$bd = $bg + 1; |
|
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false; |
|
$requete = 'INSERT INTO cel_mots_cles'.$this->suffix.' '. |
'VALUES ( '. |
$this->proteger($id_mot_cle).', '. |
$this->proteger($id_utilisateur).', '. |
$this->proteger($mot_cle).', '. |
$this->proteger($id_mot_cle_general).', '. |
$this->proteger($bg).', '. |
$this->proteger($bd).', '. |
$this->proteger($niveau).', '. |
$this->proteger($id_parent).') ' ; |
|
$transaction_reussie_2 = $this->executer($requete); |
|
if ($transaction_reussie_1 && $transaction_reussie_2) { |
$this->completerTransaction(); |
echo 'OK'; |
} else { |
$this->annulerTransaction(); |
} |
} |
|
public function deleteElement($uid) { |
session_start(); |
|
$this->suffix = '_'.$uid[0]; |
$id_utilisateur = $uid[1]; |
$id_mot_cle = $uid[2]; |
|
$this->controleUtilisateur($id_utilisateur); |
$this->commencerTransaction(); |
|
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur); |
$bg = $bornes['bg']; |
$bd = $bornes['bd']; |
|
$requete = 'DELETE FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE bg >= '.$this->proteger($bg).' '. |
' AND bd <= '.$this->proteger($bd).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
|
$transaction_reussie_1 = $this->executer($requete); |
$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false; |
|
if ($transaction_reussie_1 && $transaction_reussie_2) { |
$this->completerTransaction(); |
} else { |
$this->annulerTransaction(); |
} |
} |
|
private function ajouterMotCleRacine($id) { |
$requete = 'SELECT COUNT(*) as nb_mc '. |
'FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE ce_utilisateur = '.$this->proteger($id).' '; |
$resultat = $this->requeter($requete); |
|
if (is_array($resultat) && count($resultat) > 0) { |
$valeurs = $resultat[0]['nb_mc']; |
|
switch ($this->suffix) { |
case '_obs' : |
$nom_racine = 'Projets'; |
$id_racine = 'racine_obs'; |
break; |
case '_images' : |
$nom_racine = 'Mots clés'; |
$id_racine = 'racine'; |
break; |
default: |
$nom_racine = $this->suffix; |
$id_racine = $this->suffix; |
} |
|
if ($valeurs == 0) { |
$requete = 'INSERT INTO cel_mots_cles'.$this->suffix.' '. |
'VALUES ("'.$nom_racine.'", 1, 2, "'.$id_racine.'", "'.$id_racine.'", '.$this->proteger($id).', "", 0) '; |
$this->executer($requete); |
} |
} |
} |
|
/** |
* Désactive l'auto-commit puis débute la transaction |
*/ |
private function commencerTransaction() { |
// Désactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 0 '; |
$reussite_autocommit = $this->executer($requete); |
|
// Débute une nouvelle transaction |
$requete = 'BEGIN '; |
$reussite_begin = $this->executer($requete); |
} |
|
/** |
* Termine la transaction puis réactive l'auto-commit |
*/ |
private function completerTransaction() { |
// Complète la transaction |
$requete = 'COMMIT '; |
$reussite_commit = $this->executer($requete); |
|
// Réactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 1 '; |
$reussite_autocommit = $this->executer($requete); |
|
echo 'OK'; |
} |
|
/** |
* Annule la transaction et réactive l'auto-commit |
*/ |
private function annulerTransaction() { |
// Annule la transaction |
$requete = 'ROLLBACK '; |
$reussite_rollback = $this->executer($requete); |
|
// Réactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 1 '; |
$reussite_autocommit = $this->executer($requete); |
|
echo 'ERROR'; |
} |
|
/** |
* Renvoie les bornes d'un noeud de l'arbre des mots clés |
*/ |
private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) { |
$requete = 'SELECT bd, bg, niveau '. |
'FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$resultat = $this->requeter($requete); |
|
if(is_array($resultat) && count($resultat) > 0) { |
$valeurs = $resultat[0]; |
} |
|
return $valeurs; |
} |
|
/** |
* Décale les bornes de deux pour insérer un nouvel élément |
*/ |
private function decalerBornesPlusDeux($valeur, $id_utilisateur) { |
// Décalage borne droite |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bd = bd + 2 WHERE bd >= '.$this->proteger($valeur).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($requete); |
|
// Décalage borne gauche |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bg = bg + 2 '. |
'WHERE bg >= '.$this->proteger($valeur).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
|
return $reussi_1 && $reussi_2; |
} |
|
/** |
* Décale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre). |
*/ |
private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) { |
$decalage = $bd - $bg + 1; |
|
// Décalage borne droite |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bd = bd - '.$this->proteger($decalage).' '. |
'WHERE bd >= '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($requete); |
|
// Décalage borne gauche |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bg = bg - '.$this->proteger($decalage).' '. |
'WHERE bg > '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
|
return $reussi_1 && $reussi_2; |
} |
|
/** |
* Décale à droite des bornes donées d'un intervalle positif donne (pour l'ajout d'un sous arbre). |
*/ |
private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) { |
$decalage = $largeur; |
|
// decalage borne droite |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bd = bd + '.$this->proteger($decalage).' '. |
'WHERE bd >= '.$this->proteger($valeur_bornes).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($requete); |
|
// decalage borne gauche |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bg = bg + '.$this->proteger($decalage).' '. |
'WHERE bg >= '.$this->proteger($valeur_bornes).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
|
return $reussi_1 && $reussi_2; |
} |
|
/** |
* Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie. |
*/ |
private function exclureIntervalle($bg, $bd, $id_utilisateur) { |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bd = bd - '.$this->proteger($bd).' - 1 , '. |
' bg = bg - '.$this->proteger($bd).' - 1 '. |
'WHERE bd <= '.$this->proteger($bd).' '. |
' AND bg >= '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
|
return $this->executer($requete); |
} |
|
/** |
* Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place. |
* Décalage borne droite |
*/ |
private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) { |
|
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bg = bg + '.$this->proteger($decalage).' , '. |
' bd = bd + '.$this->proteger($decalage).', '. |
' niveau = niveau + '.$modif_niveau.' '. |
' WHERE bg >= '.$this->proteger($bg).' '. |
' AND bd <= '.$this->proteger($bd).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
|
return $this->executer($requete); |
} |
|
private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) { |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET ce_mot_cle_utilisateur_parent = '.$this->proteger($id_pere).' '. |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
|
return $this->executer($requete); |
} |
} |
?> |