Subversion Repositories eFlore/Applications.cel

Rev

Rev 821 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
416 aurelien 1
<?php
821 jpm 2
// declare(encoding='UTF-8');
856 aurelien 3
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
416 aurelien 4
/**
821 jpm 5
 * Service de recherche et modification de l'arbre des mots clés associés à un id.
6
 * 1: Le service recoit un mot clé à ajouter à l'arbre
7
 * 2: Le service recherche l'arbre ou sous arbre correspondant au critères demandé
8
 * 3: Le service renvoie l'arbre au format json
9
 *
10
 * Encodage en entrée : utf8
11
 * Encodage en sortie : utf8
416 aurelien 12
 *
13
 * Cas d'utilisation :
14
 *
821 jpm 15
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
16
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
17
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
18
 * @version $Id$
19
 * @copyright © 2011, Tela-Botanica
416 aurelien 20
 */
856 aurelien 21
class InventoryKeyWordList extends Cel {
22
 
821 jpm 23
	protected $suffix = '';
416 aurelien 24
 
821 jpm 25
	public function getElement($uid) {
26
		// Controle detournement utilisateur
27
		session_start();
28
		$this->suffix = '_'.$uid[0];
29
		$id_utilisateur = $uid[1] ;
30
		$this->controleUtilisateur($uid[1]);
31
 
856 aurelien 32
		$requete = 	'SELECT mot_cle, id_mot_cle_utilisateur, ce_mot_cle_utilisateur_parent '.
821 jpm 33
					'FROM cel_mots_cles'.$this->suffix.' '.
856 aurelien 34
					'WHERE ce_utilisateur = '.$this->proteger($id_utilisateur).' '.
35
					'ORDER BY niveau ';
821 jpm 36
 
856 aurelien 37
		$resultats_mots_cles = $this->requeter($requete);
38
 
39
		if (is_array($resultats_mots_cles)) {
821 jpm 40
			$mots_cles = array();
856 aurelien 41
			foreach($resultats_mots_cles as $mot_cle) {
821 jpm 42
				$mots_cles[] = $mot_cle;
416 aurelien 43
			}
856 aurelien 44
 
821 jpm 45
			$infos = json_encode($mots_cles);
856 aurelien 46
			header('content-type: application/json');
821 jpm 47
			print $infos;
48
			exit();
416 aurelien 49
		}
50
	}
51
 
821 jpm 52
	public function updateElement($uid, $pairs) {
53
		session_start();
54
		$this->suffix = '_'.$uid[0];
55
		$id_utilisateur = $uid[1];
56
		$this->controleUtilisateur($uid[1]);
416 aurelien 57
 
821 jpm 58
		$id_mot_cle = $pairs['id'];
59
		$action = $pairs['action'];
416 aurelien 60
 
821 jpm 61
		if ($action == 'modification') {
62
			$nouveau_nom = $pairs['motcle'];
63
			$nouvel_id_general = md5(strtolower($nouveau_nom));
416 aurelien 64
 
821 jpm 65
			$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 66
						'SET mot_cle = '.$this->proteger($nouveau_nom).' , '.
67
						'	md5 = '.$this->proteger($nouvel_id_general).' '.
68
						'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '.
69
						'	AND ce_utilisateur = '.$this->proteger($id_utilisateur) ;
70
			$reussite = $this->executer($requete);
821 jpm 71
			if ($reussite) {
72
				echo 'OK';
73
			}
74
		} else if ($action == 'deplacement') {
856 aurelien 75
 
821 jpm 76
			$this->commencerTransaction();
856 aurelien 77
 
821 jpm 78
			$transaction_reussie_1 = true;
79
			$id_pere = $pairs['parent'];
80
			$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
856 aurelien 81
			$bg = $bornes['bg'];
82
			$bd = $bornes['bd'];
83
			$niveau = $bornes['niveau'];
416 aurelien 84
 
821 jpm 85
			// on inverse l'intervalle de l'élément déplacé et du sous arbre
856 aurelien 86
			$transaction_reussie_2 = $this->exclureIntervalle($bg, $bd, $id_utilisateur);
416 aurelien 87
 
821 jpm 88
			$bg_negative = $bg - $bd - 1;
89
			$bd_negative = $bd - $bd - 1;
416 aurelien 90
 
821 jpm 91
			// on recalcule les intervalles de l'arbre privé de ce sous arbre
856 aurelien 92
			$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur);
416 aurelien 93
 
821 jpm 94
			$bornes_pere = $this->calculerBornesEtNiveau($id_pere, $id_utilisateur);
856 aurelien 95
			$bg_pere = $bornes_pere['bg'];
96
			$bd_pere = $bornes_pere['bd'];
416 aurelien 97
 
856 aurelien 98
			$niveau_pere = $bornes_pere['niveau'];
416 aurelien 99
 
821 jpm 100
			$decalage = $bd - $bg + 1;
416 aurelien 101
 
821 jpm 102
			// on decale les bornes droite du pere pour préparer l'insertion
856 aurelien 103
			$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur);
821 jpm 104
 
105
			$nouvelle_bd = $bd_pere + $decalage;
106
			$modif_niveau = $niveau_pere - $niveau + 1;
416 aurelien 107
 
856 aurelien 108
			$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur);
109
 
110
			$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur);
416 aurelien 111
 
821 jpm 112
			if ($transaction_reussie_1 && $transaction_reussie_2 && $transaction_reussie_3 && $transaction_reussie_4 && $transaction_reussie_5 && $transaction_reussie_6) {
113
				$this->completerTransaction();
114
			} else {
115
				$this->annulerTransaction();
116
			}
416 aurelien 117
 
821 jpm 118
		}
119
	}
416 aurelien 120
 
821 jpm 121
	public function createElement($pairs) {
122
		// Controle detournement utilisateur
123
		session_start();
856 aurelien 124
		$this->controleUtilisateur($pairs['ce_utilisateur']);
416 aurelien 125
 
821 jpm 126
		$this->suffix = '_'.$pairs['mode'];
856 aurelien 127
		$id_utilisateur = $pairs['ce_utilisateur'];
821 jpm 128
		$mot_cle = $pairs['motcle'];
416 aurelien 129
 
856 aurelien 130
		// TODO supprimer accents
821 jpm 131
		$id_mot_cle_general = md5(mb_strtolower($mot_cle));
132
		$id_mot_cle = $pairs['id'];
133
		$id_parent = $pairs['parent'];
416 aurelien 134
 
821 jpm 135
		$this->ajouterMotCleRacine($id_utilisateur);
416 aurelien 136
 
821 jpm 137
		$this->commencerTransaction();
416 aurelien 138
 
821 jpm 139
		$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
856 aurelien 140
		$borne_pere = $bornes['bd'];
141
		$niveau = $bornes['niveau'] + 1;
142
		$bg = $bornes['bd'];
821 jpm 143
		$bd = $bg + 1;
416 aurelien 144
 
821 jpm 145
		$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
146
 
147
		$requete = 	'INSERT INTO  cel_mots_cles'.$this->suffix.' '.
148
					'VALUES ( '.
856 aurelien 149
					$this->proteger($id_mot_cle).', '.
150
					$this->proteger($id_utilisateur).', '.
151
					$this->proteger($mot_cle).', '.
152
					$this->proteger($id_mot_cle_general).', '.
153
					$this->proteger($bg).', '.
154
					$this->proteger($bd).', '.
155
					$this->proteger($niveau).', '.
156
					$this->proteger($id_parent).') ' ;
157
 
158
		$transaction_reussie_2 = $this->executer($requete);
416 aurelien 159
 
821 jpm 160
		if ($transaction_reussie_1 && $transaction_reussie_2) {
161
			$this->completerTransaction();
162
			echo 'OK';
163
		} else {
164
			$this->annulerTransaction();
416 aurelien 165
		}
166
	}
167
 
821 jpm 168
	public function deleteElement($uid) {
169
		session_start();
170
 
171
		$this->suffix = '_'.$uid[0];
172
		$id_utilisateur = $uid[1];
173
		$id_mot_cle = $uid[2];
416 aurelien 174
 
821 jpm 175
		$this->controleUtilisateur($id_utilisateur);
176
		$this->commencerTransaction();
416 aurelien 177
 
821 jpm 178
		$bornes  = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
856 aurelien 179
		$bg = $bornes['bg'];
180
		$bd = $bornes['bd'];
416 aurelien 181
 
821 jpm 182
		$requete = 	'DELETE FROM cel_mots_cles'.$this->suffix.' '.
856 aurelien 183
					'WHERE bg >= '.$this->proteger($bg).' '.
184
					'	AND bd <= '.$this->proteger($bd).' '.
185
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
186
 
187
		$transaction_reussie_1 = $this->executer($requete);
821 jpm 188
		$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
416 aurelien 189
 
821 jpm 190
		if ($transaction_reussie_1 && $transaction_reussie_2) {
191
			$this->completerTransaction();
192
		} else {
193
			$this->annulerTransaction();
416 aurelien 194
		}
195
	}
821 jpm 196
 
197
	private function ajouterMotCleRacine($id) {
856 aurelien 198
		$requete = 	'SELECT COUNT(*) as nb_mc '.
821 jpm 199
					'FROM cel_mots_cles'.$this->suffix.' '.
856 aurelien 200
					'WHERE ce_utilisateur = '.$this->proteger($id).' ';
201
		$resultat = $this->requeter($requete);
416 aurelien 202
 
856 aurelien 203
		if (is_array($resultat) && count($resultat) > 0) {
204
			$valeurs = $resultat[0]['nb_mc'];
416 aurelien 205
 
821 jpm 206
			switch ($this->suffix) {
207
				case '_obs' :
208
					$nom_racine = 'Projets';
209
					$id_racine = 'racine_obs';
210
					break;
211
				case '_images' :
212
					$nom_racine = 'Mots clés';
213
					$id_racine = 'racine';
214
					break;
215
				default:
216
					$nom_racine = $this->suffix;
217
					$id_racine = $this->suffix;
218
			}
416 aurelien 219
 
856 aurelien 220
			if ($valeurs == 0) {
821 jpm 221
				$requete = 	'INSERT INTO cel_mots_cles'.$this->suffix.' '.
856 aurelien 222
							'VALUES ("'.$nom_racine.'", 1, 2, "'.$id_racine.'", "'.$id_racine.'", '.$this->proteger($id).', "", 0) ';
223
				$this->executer($requete);
821 jpm 224
			}
416 aurelien 225
		}
821 jpm 226
	}
416 aurelien 227
 
821 jpm 228
	/**
229
	 * Désactive l'auto-commit puis débute la transaction
230
	 */
231
	private function commencerTransaction() {
232
		// Désactive l'autocommit le temps de la manipulation de l'arbre
233
		$requete = 'SET AUTOCOMMIT = 0 ';
856 aurelien 234
		$reussite_autocommit = $this->executer($requete);
416 aurelien 235
 
821 jpm 236
		// Débute une nouvelle transaction
237
		$requete = 'BEGIN ';
856 aurelien 238
		$reussite_begin = $this->executer($requete);
416 aurelien 239
	}
240
 
821 jpm 241
	/**
242
	 * Termine la transaction puis réactive l'auto-commit
243
	 */
244
	private function completerTransaction() {
245
		// Complète la transaction
246
		$requete = 'COMMIT ';
856 aurelien 247
		$reussite_commit = $this->executer($requete);
416 aurelien 248
 
821 jpm 249
		// Réactive l'autocommit le temps de la manipulation de l'arbre
250
		$requete = 'SET AUTOCOMMIT = 1 ';
856 aurelien 251
		$reussite_autocommit = $this->executer($requete);
416 aurelien 252
 
821 jpm 253
		echo 'OK';
416 aurelien 254
	}
821 jpm 255
 
256
	/**
257
	 * Annule la transaction et réactive l'auto-commit
258
	 */
259
	private function annulerTransaction() {
260
		// Annule la transaction
261
		$requete = 'ROLLBACK ';
856 aurelien 262
		$reussite_rollback = $this->executer($requete);
416 aurelien 263
 
821 jpm 264
		// Réactive l'autocommit le temps de la manipulation de l'arbre
265
		$requete = 'SET AUTOCOMMIT = 1 ';
856 aurelien 266
		$reussite_autocommit = $this->executer($requete);
416 aurelien 267
 
821 jpm 268
		echo 'ERROR';
269
	}
416 aurelien 270
 
821 jpm 271
	/**
272
	 * Renvoie les bornes d'un noeud de l'arbre des mots clés
273
	 */
274
	private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) {
856 aurelien 275
		$requete = 	'SELECT bd, bg, niveau '.
821 jpm 276
					'FROM cel_mots_cles'.$this->suffix.' '.
856 aurelien 277
					'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '.
278
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
279
		$resultat = $this->requeter($requete);
280
 
281
		if(is_array($resultat) && count($resultat) > 0) {
282
			$valeurs = $resultat[0];
283
		}
284
 
821 jpm 285
		return $valeurs;
286
	}
416 aurelien 287
 
821 jpm 288
	/**
289
	 * Décale les bornes de deux pour insérer un nouvel élément
290
	 */
291
	private function decalerBornesPlusDeux($valeur, $id_utilisateur) {
292
		// Décalage borne droite
293
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 294
					'SET bd = bd + 2 WHERE bd >= '.$this->proteger($valeur).' '.
295
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
296
		$reussi_1 = $this->executer($requete);
821 jpm 297
 
298
		// Décalage borne gauche
299
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 300
					'SET bg = bg + 2 '.
301
					'WHERE bg >=  '.$this->proteger($valeur).' '.
302
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
303
		$reussi_2 = $this->executer($requete);
821 jpm 304
 
305
		return $reussi_1 && $reussi_2;
416 aurelien 306
	}
307
 
821 jpm 308
	/**
309
	 * Décale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre).
310
	 */
311
	private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) {
312
		$decalage = $bd - $bg + 1;
416 aurelien 313
 
821 jpm 314
		// Décalage borne droite
315
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 316
					'SET bd = bd - '.$this->proteger($decalage).' '.
317
					'WHERE bd >=  '.$this->proteger($bg).' '.
318
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
319
		$reussi_1 = $this->executer($requete);
416 aurelien 320
 
821 jpm 321
		// Décalage borne gauche
322
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 323
					'SET bg = bg - '.$this->proteger($decalage).' '.
324
					'WHERE bg >  '.$this->proteger($bg).' '.
325
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
326
		$reussi_2 = $this->executer($requete);
821 jpm 327
 
328
		return $reussi_1 && $reussi_2;
416 aurelien 329
	}
330
 
821 jpm 331
	/**
332
	 * Décale à droite des bornes donées d'un intervalle positif donne (pour l'ajout d'un sous arbre).
333
	 */
334
	private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) {
335
		$decalage = $largeur;
416 aurelien 336
 
821 jpm 337
		// decalage borne droite
338
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 339
					'SET bd = bd + '.$this->proteger($decalage).' '.
340
					'WHERE bd >=  '.$this->proteger($valeur_bornes).' '.
341
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
342
		$reussi_1 = $this->executer($requete);
416 aurelien 343
 
821 jpm 344
		// decalage borne gauche
345
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 346
					'SET bg = bg + '.$this->proteger($decalage).' '.
347
					'WHERE bg >=  '.$this->proteger($valeur_bornes).' '.
348
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
349
		$reussi_2 = $this->executer($requete);
416 aurelien 350
 
821 jpm 351
		return $reussi_1 && $reussi_2;
352
	}
416 aurelien 353
 
821 jpm 354
	/**
355
	 * Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie.
356
	 */
357
	private function exclureIntervalle($bg, $bd, $id_utilisateur) {
358
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 359
					'SET bd = bd - '.$this->proteger($bd).' - 1 , '.
360
					'	bg =  bg -  '.$this->proteger($bd).' - 1 '.
361
					'WHERE bd <=  '.$this->proteger($bd).' '.
362
					'	AND bg >=  '.$this->proteger($bg).' '.
363
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
416 aurelien 364
 
856 aurelien 365
		return $this->executer($requete);
416 aurelien 366
	}
367
 
821 jpm 368
	/**
369
	 * Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place.
370
	 * Décalage borne droite
371
	 */
372
	private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) {
416 aurelien 373
 
821 jpm 374
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 375
					'SET bg =  bg + '.$this->proteger($decalage).' , '.
376
					'	bd = bd + '.$this->proteger($decalage).', '.
377
					'	niveau = niveau + '.$modif_niveau.' '.
378
					' WHERE bg >=  '.$this->proteger($bg).' '.
379
					'	AND bd <=  '.$this->proteger($bd).' '.
380
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
416 aurelien 381
 
856 aurelien 382
		return $this->executer($requete);
821 jpm 383
	}
416 aurelien 384
 
821 jpm 385
	private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) {
386
		$requete = 	'UPDATE cel_mots_cles'.$this->suffix.' '.
856 aurelien 387
					'SET ce_mot_cle_utilisateur_parent = '.$this->proteger($id_pere).' '.
388
					'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '.
389
					'	AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
821 jpm 390
 
856 aurelien 391
		return $this->executer($requete);
821 jpm 392
	}
416 aurelien 393
 }
394
?>