Subversion Repositories eFlore/Applications.cel

Rev

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