Subversion Repositories eFlore/Applications.cel

Rev

Rev 1872 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1872 Rev 1878
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
3
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
4
/**
4
/**
5
 * Service de recherche et modification de l'arbre des mots clés associés à un id.
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
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é
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
8
 * 3: Le service renvoie l'arbre au format json
9
 * 
9
 * 
10
 * Encodage en entrée : utf8
10
 * Encodage en entrée : utf8
11
 * Encodage en sortie : utf8
11
 * Encodage en sortie : utf8
12
 *
12
 *
13
 * Cas d'utilisation :
13
 * Cas d'utilisation :
14
 *
14
 *
15
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
15
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
16
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
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>
17
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
18
 * @version $Id$
18
 * @version $Id$
19
 * @copyright © 2011, Tela-Botanica
19
 * @copyright © 2011, Tela-Botanica
20
 */
20
 */
21
class InventoryKeyWordList extends Cel {
21
class InventoryKeyWordList extends Cel {
22
 
22
 
23
	protected $suffixe = '';
23
	protected $suffixe = '';
24
	protected $suffixe_table = null;
24
	protected $suffixe_table = null;
25
	protected $suffixe_champ = null;
25
	protected $suffixe_champ = null;
26
	
26
	
27
	private function setChampsEtTablePourSuffixe($suffixe) {
27
	private function setChampsEtTablePourSuffixe($suffixe) {
28
		$this->suffixe = $suffixe;
28
		$this->suffixe = $suffixe;
29
		switch($suffixe) {
29
		switch($suffixe) {
30
			case 'obs':
30
			case 'obs':
31
				$this->suffixe_table = '_obs';
31
				$this->suffixe_table = '_obs';
32
				$this->suffixe_champ = '_obs';
32
				$this->suffixe_champ = '_obs';
33
			break;
33
			break;
34
			case 'images':
34
			case 'images':
35
				$this->suffixe_table = '_images';
35
				$this->suffixe_table = '_images';
36
				$this->suffixe_champ = '_image';
36
				$this->suffixe_champ = '_image';
37
			break;
37
			break;
38
		}
38
		}
39
	}
39
	}
40
 
40
 
41
	public function getElement($uid) {
41
	public function getElement($uid) {
42
		// Controle detournement utilisateur
42
		// Controle detournement utilisateur
43
		$id_utilisateur = $uid[1] ;
43
		$id_utilisateur = $uid[1] ;
44
		$this->controleUtilisateur($uid[1]);
44
		$this->controleUtilisateur($uid[1]);
45
		$this->setChampsEtTablePourSuffixe($uid[0]);
45
		$this->setChampsEtTablePourSuffixe($uid[0]);
46
		
46
		
47
		$this->envoyerJson(self::getMotsClefs($uid[1], $uid[0]));
47
		$this->envoyerJson(self::getMotsClefs($uid[1], $uid[0]));
48
		return TRUE; // compat: pourquoi renvoyer true si vide ?
48
		return TRUE; // compat: pourquoi renvoyer true si vide ?
49
	}
49
	}
50
 
50
 
51
 
51
 
52
	static function getMotsClefs($uid, $type) {
52
	static function getMotsClefs($uid, $type) {
53
		if($type == 'obs') {
53
		if($type == 'obs') {
54
			return Cel::db()->requeter(sprintf(
54
			return Cel::db()->requeter(sprintf(
55
				'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
55
				'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
56
				' FROM cel_mots_cles_obs'.
56
				' FROM cel_mots_cles_obs'.
57
				' WHERE id_utilisateur = %s'.
57
				' WHERE id_utilisateur = %s'.
58
				' ORDER BY niveau',
58
				' ORDER BY niveau',
59
				Cel::db()->proteger($uid)));
59
				Cel::db()->proteger($uid)));
60
		}
60
		}
61
 
61
 
62
		if($type == 'images') {
62
		if($type == 'images') {
63
			return Cel::db()->requeter(sprintf(
63
			return Cel::db()->requeter(sprintf(
64
				'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
64
				'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
65
				' FROM cel_mots_cles_images'.
65
				' FROM cel_mots_cles_images'.
66
				' WHERE id_utilisateur = %s'.
66
				' WHERE id_utilisateur = %s'.
67
				' ORDER BY niveau',
67
				' ORDER BY niveau',
68
				Cel::db()->proteger($uid)));
68
				Cel::db()->proteger($uid)));
69
		}
69
		}
70
		/* pour extraire un mot-clef en particulier (bien que getMotsClefId() soit plus adapté:
70
		/* pour extraire un mot-clef en particulier (bien que getMotsClefId() soit plus adapté:
71
		array_walk($ret,
71
		array_walk($ret,
72
				   create_function('&$val, $k, $keyword',
72
				   create_function('&$val, $k, $keyword',
73
								   'if($val["mot_cle"] != $keyword) $val = NULL;' .
73
								   'if($val["mot_cle"] != $keyword) $val = NULL;' .
74
								   'else $val = $val["id_mot_cle_obs"];'),
74
								   'else $val = $val["id_mot_cle_obs"];'),
75
				   'XXX');
75
				   'XXX');
76
		$obsKeywordIdToDetach = array_filter($ret);
76
		$obsKeywordIdToDetach = array_filter($ret);
77
		$obsKeywordIdToDetach = array_pop($obsKeywordIdToDetach); */
77
		$obsKeywordIdToDetach = array_pop($obsKeywordIdToDetach); */
78
 
78
 
79
		return array();
79
		return array();
80
	}
80
	}
81
 
81
 
82
 
82
 
83
	static function getMotsClefId($uid, $type, $keyword) {
83
	static function getMotsClefId($uid, $type, $keyword) {
84
		if($type == 'obs') {
84
		if($type == 'obs') {
85
			$ret = Cel::db()->requeter(sprintf(
85
			$ret = Cel::db()->requeter(sprintf(
86
				'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
86
				'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
87
				' FROM cel_mots_cles_obs'.
87
				' FROM cel_mots_cles_obs'.
88
				' WHERE id_utilisateur = %s'.
88
				' WHERE id_utilisateur = %s'.
89
				' AND mot_cle = %s'.
89
				' AND mot_cle = %s'.
90
				' ORDER BY niveau',
90
				' ORDER BY niveau',
91
				Cel::db()->proteger($uid),
91
				Cel::db()->proteger($uid),
92
				Cel::db()->proteger($keyword) ));
92
				Cel::db()->proteger($keyword) ));
93
		}
93
		}
94
 
94
 
95
		if($type == 'images') {
95
		if($type == 'images') {
96
			$ret = Cel::db()->requeter(sprintf(
96
			$ret = Cel::db()->requeter(sprintf(
97
				'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
97
				'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
98
				' FROM cel_mots_cles_images'.
98
				' FROM cel_mots_cles_images'.
99
				' WHERE id_utilisateur = %s'.
99
				' WHERE id_utilisateur = %s'.
100
				' AND mot_cle = %s'.
100
				' AND mot_cle = %s'.
101
				' ORDER BY niveau',
101
				' ORDER BY niveau',
102
				Cel::db()->proteger($uid),
102
				Cel::db()->proteger($uid),
103
				Cel::db()->proteger($keyword) ));
103
				Cel::db()->proteger($keyword) ));
104
		}
104
		}
105
		return @$ret[0]['id_mot_cle_obs'];
105
		return @$ret[0]['id_mot_cle_obs'];
106
	}
106
	}
107
 
107
 
108
	public function updateElement($uid, $pairs) {
108
	public function updateElement($uid, $pairs) {
109
		$id_utilisateur = $uid[1];
109
		$id_utilisateur = $uid[1];
110
		$this->controleUtilisateur($uid[1]);
110
		$this->controleUtilisateur($uid[1]);
111
		
111
		
112
		$this->setChampsEtTablePourSuffixe($uid[0]);
112
		$this->setChampsEtTablePourSuffixe($uid[0]);
113
 
113
 
114
		$id_mot_cle = $pairs['id'];
114
		$id_mot_cle = $pairs['id'];
115
		$action = $pairs['action'];
115
		$action = $pairs['action'];
116
 
116
 
117
		if ($action == 'modification') {
117
		if ($action == 'modification') {
118
			$nouveau_nom = $pairs['motcle'];
118
			$nouveau_nom = $pairs['motcle'];
119
			$nouvel_id_general = md5(mb_strtolower($nouveau_nom));
119
			$nouvel_id_general = md5(mb_strtolower($nouveau_nom));
120
 
120
 
121
			$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
121
			$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
122
						'SET mot_cle = '.Cel::db()->proteger($nouveau_nom).' , '.
122
						'SET mot_cle = '.Cel::db()->proteger($nouveau_nom).' , '.
123
						'	md5 = '.Cel::db()->proteger($nouvel_id_general).' '.
123
						'	md5 = '.Cel::db()->proteger($nouvel_id_general).' '.
124
						'WHERE id_mot_cle'.$this->suffixe_champ.' = '.Cel::db()->proteger($id_mot_cle).' '.
124
						'WHERE id_mot_cle'.$this->suffixe_champ.' = '.Cel::db()->proteger($id_mot_cle).' '.
125
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur) ;
125
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur) ;
126
			$reussite = Cel::db()->executer($requete);
126
			$reussite = Cel::db()->executer($requete);
127
			if ($reussite !== false) {
127
			if ($reussite !== false) {
128
				echo 'OK';
128
				echo 'OK';
129
				return true;
129
				return true;
130
			} else {
130
			} else {
131
				return false;
131
				return false;
132
			}
132
			}
133
		} else if ($action == 'deplacement') {
133
		} else if ($action == 'deplacement') {
134
			
134
			
135
			$this->commencerTransaction();
135
			self::commencerTransaction();
136
			
136
			
137
			$transaction_reussie_1 = true;
137
			$transaction_reussie_1 = true;
138
			$id_pere = $pairs['parent'];
138
			$id_pere = $pairs['parent'];
139
			$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
139
			$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
140
			$bg = $bornes['bg'];
140
			$bg = $bornes['bg'];
141
			$bd = $bornes['bd'];
141
			$bd = $bornes['bd'];
142
			$niveau = $bornes['niveau'];
142
			$niveau = $bornes['niveau'];
143
 
143
 
144
			// on inverse l'intervalle de l'élément déplacé et du sous arbre
144
			// on inverse l'intervalle de l'élément déplacé et du sous arbre
145
			$transaction_reussie_2 = $this->exclureIntervalle($bg, $bd, $id_utilisateur);
145
			$transaction_reussie_2 = $this->exclureIntervalle($bg, $bd, $id_utilisateur);
146
 
146
 
147
			$bg_negative = $bg - $bd - 1;
147
			$bg_negative = $bg - $bd - 1;
148
			$bd_negative = $bd - $bd - 1;
148
			$bd_negative = $bd - $bd - 1;
149
 
149
 
150
			// on recalcule les intervalles de l'arbre privé de ce sous arbre
150
			// on recalcule les intervalles de l'arbre privé de ce sous arbre
151
			$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur);
151
			$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur);
152
 
152
 
153
			$bornes_pere = $this->calculerBornesEtNiveau($id_pere, $id_utilisateur);
153
			$bornes_pere = $this->calculerBornesEtNiveau($id_pere, $id_utilisateur);
154
			$bg_pere = $bornes_pere['bg'];
154
			$bg_pere = $bornes_pere['bg'];
155
			$bd_pere = $bornes_pere['bd'];
155
			$bd_pere = $bornes_pere['bd'];
156
 
156
 
157
			$niveau_pere = $bornes_pere['niveau'];
157
			$niveau_pere = $bornes_pere['niveau'];
158
 
158
 
159
			$decalage = $bd - $bg + 1;
159
			$decalage = $bd - $bg + 1;
160
 
160
 
161
			// on decale les bornes droite du pere pour préparer l'insertion
161
			// on decale les bornes droite du pere pour préparer l'insertion
162
			$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur);
162
			$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur);
163
			
163
			
164
			$nouvelle_bd = $bd_pere + $decalage;
164
			$nouvelle_bd = $bd_pere + $decalage;
165
			$modif_niveau = $niveau_pere - $niveau + 1;
165
			$modif_niveau = $niveau_pere - $niveau + 1;
166
 
166
 
167
			$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur);
167
			$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur);
168
						
168
						
169
			$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur);
169
			$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur);
170
 
170
 
171
			if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false && 
171
			if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false && 
172
				$transaction_reussie_3 !== false && $transaction_reussie_4 !== false && 
172
				$transaction_reussie_3 !== false && $transaction_reussie_4 !== false && 
173
				$transaction_reussie_5 !== false && $transaction_reussie_6 !== false) {
173
				$transaction_reussie_5 !== false && $transaction_reussie_6 !== false) {
174
				$this->completerTransaction();
174
				self::completerTransaction();
175
				return true;
175
				return true;
176
			} else {
176
			} else {
177
				$this->annulerTransaction();
177
				self::annulerTransaction();
178
				return false;
178
				return false;
179
			}
179
			}
180
		}
180
		}
181
		return true;
181
		return true;
182
	}
182
	}
183
 
183
 
184
	public function createElement($pairs) {
184
	public function createElement($pairs) {
185
		// Controle detournement utilisateur
185
		// Controle detournement utilisateur
186
		$this->controleUtilisateur($pairs['identifiant']);
186
		$this->controleUtilisateur($pairs['identifiant']);
187
 
187
 
188
		$this->setChampsEtTablePourSuffixe($pairs['mode']);
188
		$this->setChampsEtTablePourSuffixe($pairs['mode']);
189
		$id_utilisateur = $pairs['identifiant'];
189
		$id_utilisateur = $pairs['identifiant'];
190
		$mot_cle = $pairs['motcle'];
190
		$mot_cle = $pairs['motcle'];
191
 
191
 
192
		// TODO supprimer accents
192
		// TODO supprimer accents
193
		$id_mot_cle_general = md5(mb_strtolower($mot_cle));
193
		$id_mot_cle_general = md5(mb_strtolower($mot_cle));
194
		$id_mot_cle = $pairs['id'];
194
		$id_mot_cle = $pairs['id'];
195
		$id_parent = $pairs['parent'];
195
		$id_parent = $pairs['parent'];
196
 
196
 
197
		$this->ajouterMotCleRacine($id_utilisateur);
197
		$this->ajouterMotCleRacine($id_utilisateur);
198
 
-
 
199
		$this->commencerTransaction();
-
 
200
 
198
 
201
		$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
199
		$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
202
		$borne_pere = $bornes['bd'];
200
		$borne_pere = $bornes['bd'];
203
		$niveau = $bornes['niveau'] + 1;
201
		$niveau = $bornes['niveau'] + 1;
204
		$bg = $bornes['bd'];
202
		$bg = $bornes['bd'];
205
		$bd = $bg + 1;
203
		$bd = $bg + 1;
-
 
204
 
-
 
205
        if(!$borne_pere) return false;
-
 
206
 
206
 
207
		self::commencerTransaction();
207
		$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
208
		$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
208
		
209
		
209
		$requete = 	'INSERT INTO  cel_mots_cles'.$this->suffixe_table.' '.
210
		$requete = 	'INSERT INTO  cel_mots_cles'.$this->suffixe_table.' '.
210
					'VALUES ( '.
211
					'VALUES ( '.
211
					Cel::db()->proteger($id_mot_cle).', '.
212
					Cel::db()->proteger($id_mot_cle).', '.
212
					Cel::db()->proteger($id_utilisateur).', '.
213
					Cel::db()->proteger($id_utilisateur).', '.
213
					Cel::db()->proteger($mot_cle).', '.
214
					Cel::db()->proteger($mot_cle).', '.
214
					Cel::db()->proteger($id_mot_cle_general).', '.
215
					Cel::db()->proteger($id_mot_cle_general).', '.
215
					Cel::db()->proteger($bg).', '.
216
					Cel::db()->proteger($bg).', '.
216
					Cel::db()->proteger($bd).', '.
217
					Cel::db()->proteger($bd).', '.
217
					Cel::db()->proteger($niveau).', '.
218
					Cel::db()->proteger($niveau).', '.
218
					Cel::db()->proteger($id_parent).') ' ;
219
					Cel::db()->proteger($id_parent).') ' ;
219
							
220
							
220
		$transaction_reussie_2 = Cel::db()->executer($requete);
221
		$transaction_reussie_2 = Cel::db()->executer($requete);
221
 
222
 
222
		if ($transaction_reussie_1 && $transaction_reussie_2) {
223
		if ($transaction_reussie_1 && $transaction_reussie_2) {
-
 
224
            // on sort de self::createElement ==> JRest::(get|post) ==> JRest->created() qui fait header().
-
 
225
            // or si nous dépassons ini_get(output_buffering) nous ne pouvons plus réécrire le code de retour
-
 
226
            // HTTP, de plus, si ini_get(output_buffering) == off, nous enverrions un warning.
-
 
227
            // d'où ce clone de JRest::created();
-
 
228
            header('HTTP/1.0 201 Created');
223
			$this->completerTransaction();
229
			self::completerTransaction();
224
			return true;
230
            exit;
225
		} else {
231
		} else {
-
 
232
            // cf ci-dessus: JRest::badRequest
-
 
233
            header('HTTP/1.0 400 Bad Request');
226
			$this->annulerTransaction();
234
			self::annulerTransaction();
227
			return false;
235
            exit;
228
		}
236
		}
229
		return true;
237
		return true;
230
	}
238
	}
231
 
239
 
232
	public function deleteElement($uid) {
240
	public function deleteElement($uid) {
233
		
241
		
234
		$this->setChampsEtTablePourSuffixe($uid[0]);
242
		$this->setChampsEtTablePourSuffixe($uid[0]);
235
		$id_utilisateur = $uid[1];
243
		$id_utilisateur = $uid[1];
236
		$id_mot_cle = $uid[2];
244
		$id_mot_cle = $uid[2];
237
		
245
		
238
		$tableau_ids_mots_cles = array();
246
		$tableau_ids_mots_cles = array();
239
		$tableau_ids_mots_cles[] = $id_mot_cle;
247
		$tableau_ids_mots_cles[] = $id_mot_cle;
240
 
248
 
241
		$this->controleUtilisateur($id_utilisateur);		
249
		$this->controleUtilisateur($id_utilisateur);		
242
		$this->commencerTransaction();
250
		self::commencerTransaction();
243
 
251
 
244
		$bornes  = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
252
		$bornes  = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
245
		if($bornes) {
253
		if($bornes) {
246
			$bg = $bornes['bg'];
254
			$bg = $bornes['bg'];
247
			$bd = $bornes['bd'];
255
			$bd = $bornes['bd'];
248
			
256
			
249
			$requete_mots_cles_fils = 'SELECT id_mot_cle'.$this->suffixe_champ.' as id FROM cel_mots_cles'.$this->suffixe_table.' '.
257
			$requete_mots_cles_fils = 'SELECT id_mot_cle'.$this->suffixe_champ.' as id FROM cel_mots_cles'.$this->suffixe_table.' '.
250
						'WHERE bg >= '.Cel::db()->proteger($bg).' '.
258
						'WHERE bg >= '.Cel::db()->proteger($bg).' '.
251
						'	AND bd <= '.Cel::db()->proteger($bd).' '.
259
						'	AND bd <= '.Cel::db()->proteger($bd).' '.
252
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
260
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
253
 
261
 
254
			$mots_cles_fils = Cel::db()->requeter($requete_mots_cles_fils);
262
			$mots_cles_fils = Cel::db()->requeter($requete_mots_cles_fils);
255
			foreach ($mots_cles_fils as $fils) {
263
			foreach ($mots_cles_fils as $fils) {
256
				$tableau_ids_mots_cles[] = $fils['id'];
264
				$tableau_ids_mots_cles[] = $fils['id'];
257
			}
265
			}
258
	
266
	
259
			$requete = 	'DELETE FROM cel_mots_cles'.$this->suffixe_table.' '.
267
			$requete = 	'DELETE FROM cel_mots_cles'.$this->suffixe_table.' '.
260
						'WHERE bg >= '.Cel::db()->proteger($bg).' '.
268
						'WHERE bg >= '.Cel::db()->proteger($bg).' '.
261
						'	AND bd <= '.Cel::db()->proteger($bd).' '.
269
						'	AND bd <= '.Cel::db()->proteger($bd).' '.
262
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
270
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
263
						
271
						
264
			$transaction_reussie_1 = Cel::db()->executer($requete);
272
			$transaction_reussie_1 = Cel::db()->executer($requete);
265
			$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
273
			$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
266
	
274
	
267
			if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false) {
275
			if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false) {
268
				$this->completerTransaction();
276
				self::completerTransaction();
269
			} else {
277
			} else {
270
				$this->annulerTransaction();
278
				self::annulerTransaction();
271
			}
279
			}
272
		}
280
		}
273
		// Suppression des liaisons associées à ce mot clé
281
		// Suppression des liaisons associées à ce mot clé
274
		$gestion_liaisons = new LiaisonMotsCles($this->config, $this->suffixe);
282
		$gestion_liaisons = new LiaisonMotsCles($this->config, $this->suffixe);
275
		$gestion_liaisons->supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles);
283
		$gestion_liaisons->supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles);
276
		
284
		
277
		return true;
285
		return true;
278
	}
286
	}
279
	
287
	
280
	private function ajouterMotCleRacine($id) {
288
	private function ajouterMotCleRacine($id) {
281
		$requete = 	'SELECT COUNT(*) as nb_mc '.
289
		$requete = 	'SELECT COUNT(*) as nb_mc '.
282
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
290
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
283
					'WHERE id_utilisateur = '.Cel::db()->proteger($id).' ';
291
					'WHERE id_utilisateur = '.Cel::db()->proteger($id).' ';
284
		$resultat = Cel::db()->requeter($requete);
292
		$resultat = Cel::db()->requeter($requete);
285
 
293
 
286
		if (is_array($resultat) && count($resultat) > 0) {
294
		if (is_array($resultat) && count($resultat) > 0) {
287
			$valeurs = $resultat[0]['nb_mc'];
295
			$valeurs = $resultat[0]['nb_mc'];
288
 
296
 
289
			switch ($this->suffixe) {
297
			switch ($this->suffixe) {
290
				case 'obs' :
298
				case 'obs' :
291
					$nom_racine = 'Projets';
299
					$nom_racine = 'Projets';
292
					$id_racine = 'racine_obs';
300
					$id_racine = 'racine_obs';
293
					break;
301
					break;
294
				case 'images' :
302
				case 'images' :
295
					$nom_racine = 'Mots clés';
303
					$nom_racine = 'Mots clés';
296
					$id_racine = 'racine';
304
					$id_racine = 'racine';
297
					break;
305
					break;
298
				default:
306
				default:
299
					$nom_racine = $this->suffixe;
307
					$nom_racine = $this->suffixe;
300
					$id_racine = $this->suffixe;
308
					$id_racine = $this->suffixe;
301
			}
309
			}
302
			
310
			
303
			$md5_racine = Cel::db()->proteger(md5($nom_racine));
311
			$md5_racine = Cel::db()->proteger(md5($nom_racine));
304
			$id_racine = Cel::db()->proteger($id_racine);
312
			$id_racine = Cel::db()->proteger($id_racine);
305
			$nom_racine = Cel::db()->proteger($nom_racine);
313
			$nom_racine = Cel::db()->proteger($nom_racine);
306
			$id_utilisateur = Cel::db()->proteger($id);
314
			$id_utilisateur = Cel::db()->proteger($id);
307
 
315
 
308
			if ($valeurs == 0) {				
316
			if ($valeurs == 0) {				
309
				$requete = "INSERT INTO cel_mots_cles{$this->suffixe_table} ".
317
				$requete = "INSERT INTO cel_mots_cles{$this->suffixe_table} ".
310
						   "VALUES ($id_racine, $id_utilisateur, $nom_racine, $md5_racine, ".
318
						   "VALUES ($id_racine, $id_utilisateur, $nom_racine, $md5_racine, ".
311
						   "1, 2, 0, '') ";
319
						   "1, 2, 0, '') ";
312
				
320
				
313
				Cel::db()->executer($requete);
321
				Cel::db()->executer($requete);
314
			}
322
			}
315
		}
323
		}
316
	}
324
	}
317
 
325
 
318
	/**
326
	/**
319
	 * Désactive l'auto-commit puis débute la transaction
327
	 * Désactive l'auto-commit puis débute la transaction
320
	 */
328
	 */
321
	private function commencerTransaction() {
329
	static function commencerTransaction() {
322
		// Désactive l'autocommit le temps de la manipulation de l'arbre
330
		// Désactive l'autocommit le temps de la manipulation de l'arbre
323
		$requete = 'SET AUTOCOMMIT = 0 ';
-
 
324
		$reussite_autocommit = Cel::db()->executer($requete);
331
		$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 0");
325
 
-
 
326
		// Débute une nouvelle transaction
332
		// Débute une nouvelle transaction
327
		$requete = 'BEGIN ';
-
 
328
		$reussite_begin = Cel::db()->executer($requete);
333
		$reussite_begin = Cel::db()->executer("BEGIN");
329
	}
334
	}
330
 
335
 
331
	/**
336
	/**
332
	 * Termine la transaction puis réactive l'auto-commit
337
	 * Termine la transaction puis réactive l'auto-commit
333
	 */
338
	 */
334
	private function completerTransaction() {
339
	static function completerTransaction() {
335
		// Complète la transaction
340
		// Complète la transaction
336
		$requete = 'COMMIT ';
-
 
337
		$reussite_commit = Cel::db()->executer($requete);
341
		$reussite_commit = Cel::db()->executer("COMMIT");
338
 
-
 
339
		// Réactive l'autocommit le temps de la manipulation de l'arbre
342
		// Réactive l'autocommit le temps de la manipulation de l'arbre
340
		$requete = 'SET AUTOCOMMIT = 1 ';
-
 
341
		$reussite_autocommit = Cel::db()->executer($requete);
343
		$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 1");
342
 
344
 
343
		echo 'OK';
-
 
344
		// on sort de self::(create|update)Element ==> JRest::(get|post) ==> JRest->created() qui fait header().
-
 
345
		// TODO: si updateElement(): die();
345
		echo 'OK';
346
	}
346
	}
347
	
347
	
348
	/**
348
	/**
349
	 * Annule la transaction et réactive l'auto-commit
349
	 * Annule la transaction et réactive l'auto-commit
350
	 */
350
	 */
351
	private function annulerTransaction() {
351
	static function annulerTransaction() {
352
		// Annule la transaction
352
		// Annule la transaction
353
		$requete = 'ROLLBACK ';
-
 
354
		$reussite_rollback = Cel::db()->executer($requete);
353
		$reussite_rollback = Cel::db()->executer("ROLLBACK");
355
 
-
 
356
		// Réactive l'autocommit le temps de la manipulation de l'arbre
354
		// Réactive l'autocommit le temps de la manipulation de l'arbre
357
		$requete = 'SET AUTOCOMMIT = 1 ';
-
 
358
		$reussite_autocommit = Cel::db()->executer($requete);
355
		$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 1");
359
 
356
 
360
		echo 'ERROR';
357
		echo 'ERROR';
361
	}
358
	}
362
 
359
 
363
	/** 
360
	/** 
364
	 * Renvoie les bornes d'un noeud de l'arbre des mots clés
361
	 * Renvoie les bornes d'un noeud de l'arbre des mots clés
365
	 */
362
	 */
366
	private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) {
363
	private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) {
367
		$requete = 	'SELECT bd, bg, niveau '.
364
		$requete = 	'SELECT bd, bg, niveau '.
368
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
365
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
369
					'WHERE id_mot_cle'.$this->suffixe_champ.' = '.Cel::db()->proteger($id_mot_cle).' '.
366
					'WHERE id_mot_cle'.$this->suffixe_champ.' = '.Cel::db()->proteger($id_mot_cle).' '.
370
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
367
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
371
		
368
		
372
		$resultat = Cel::db()->requeter($requete);
369
		$resultat = Cel::db()->requeter($requete);
373
		
370
		
374
		$valeurs = null;
371
		$valeurs = null;
375
		if(is_array($resultat) && count($resultat) > 0) {
372
		if(is_array($resultat) && count($resultat) > 0) {
376
			$valeurs = $resultat[0];
373
			$valeurs = $resultat[0];
377
		}
374
		}
378
		
375
		
379
		return $valeurs;
376
		return $valeurs;
380
	}
377
	}
381
 
378
 
382
	/**
379
	/**
383
	 * Décale les bornes de deux pour insérer un nouvel élément
380
	 * Décale les bornes de deux pour insérer un nouvel élément
384
	 */ 
381
	 */ 
385
	private function decalerBornesPlusDeux($valeur, $id_utilisateur) {
382
	private function decalerBornesPlusDeux($valeur, $id_utilisateur) {
386
		// Décalage borne droite
383
		// Décalage borne droite
387
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
384
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
388
					'SET bd = bd + 2 WHERE bd >= '.$valeur.' '.
385
					'SET bd = bd + 2 WHERE bd >= '.$valeur.' '.
389
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
386
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
390
		$reussi_1 = Cel::db()->executer($requete);
387
		$reussi_1 = Cel::db()->executer($requete);
391
		
388
		
392
		// Décalage borne gauche
389
		// Décalage borne gauche
393
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
390
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
394
					'SET bg = bg + 2 '.
391
					'SET bg = bg + 2 '.
395
					'WHERE bg >= '.$valeur.' '.
392
					'WHERE bg >= '.$valeur.' '.
396
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
393
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
397
		$reussi_2 = Cel::db()->executer($requete);
394
		$reussi_2 = Cel::db()->executer($requete);
398
		
395
		
399
		return $reussi_1 !== false && $reussi_2 !== false;
396
		return $reussi_1 !== false && $reussi_2 !== false;
400
	}
397
	}
401
 
398
 
402
	/**
399
	/**
403
	 * Décale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre).
400
	 * Décale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre).
404
	 */
401
	 */
405
	private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) {
402
	private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) {
406
		$decalage = $bd - $bg + 1;
403
		$decalage = $bd - $bg + 1;
407
 
404
 
408
		// Décalage borne droite
405
		// Décalage borne droite
409
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
406
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
410
					'SET bd = bd - '.$decalage.' '.
407
					'SET bd = bd - '.$decalage.' '.
411
					'WHERE bd >=  '.$bg.' '.
408
					'WHERE bd >=  '.$bg.' '.
412
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
409
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
413
		$reussi_1 = Cel::db()->executer($requete);
410
		$reussi_1 = Cel::db()->executer($requete);
414
 
411
 
415
		// Décalage borne gauche
412
		// Décalage borne gauche
416
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
413
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
417
					'SET bg = bg - '.$decalage.' '.
414
					'SET bg = bg - '.$decalage.' '.
418
					'WHERE bg >  '.$bg.' '.
415
					'WHERE bg >  '.$bg.' '.
419
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
416
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
420
		$reussi_2 = Cel::db()->executer($requete);
417
		$reussi_2 = Cel::db()->executer($requete);
421
		
418
		
422
		return $reussi_1 !== false && $reussi_2 !== false;
419
		return $reussi_1 !== false && $reussi_2 !== false;
423
	}
420
	}
424
 
421
 
425
	/**
422
	/**
426
	 * Décale à droite des bornes donées d'un intervalle positif donne (pour l'ajout d'un sous arbre).
423
	 * Décale à droite des bornes donées d'un intervalle positif donne (pour l'ajout d'un sous arbre).
427
	 */ 
424
	 */ 
428
	private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) {
425
	private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) {
429
		$decalage = $largeur;
426
		$decalage = $largeur;
430
 
427
 
431
		// decalage borne droite
428
		// decalage borne droite
432
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
429
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
433
					'SET bd = bd + '.$decalage.' '.
430
					'SET bd = bd + '.$decalage.' '.
434
					'WHERE bd >=  '.$valeur_bornes.' '.
431
					'WHERE bd >=  '.$valeur_bornes.' '.
435
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
432
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
436
		$reussi_1 = Cel::db()->executer($requete);
433
		$reussi_1 = Cel::db()->executer($requete);
437
 
434
 
438
		// decalage borne gauche
435
		// decalage borne gauche
439
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
436
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
440
					'SET bg = bg + '.$decalage.' '.
437
					'SET bg = bg + '.$decalage.' '.
441
					'WHERE bg >=  '.$valeur_bornes.' '.
438
					'WHERE bg >=  '.$valeur_bornes.' '.
442
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
439
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
443
		$reussi_2 = Cel::db()->executer($requete);
440
		$reussi_2 = Cel::db()->executer($requete);
444
 
441
 
445
		return $reussi_1 !== false && $reussi_2 !== false;
442
		return $reussi_1 !== false && $reussi_2 !== false;
446
	}
443
	}
447
 
444
 
448
	/**
445
	/**
449
	 * Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie.
446
	 * Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie.
450
	 */
447
	 */
451
	private function exclureIntervalle($bg, $bd, $id_utilisateur) {
448
	private function exclureIntervalle($bg, $bd, $id_utilisateur) {
452
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
449
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
453
					'SET bd = bd - '.$bd.' - 1 , '.
450
					'SET bd = bd - '.$bd.' - 1 , '.
454
					'	bg =  bg -  '.$bd.' - 1 '.
451
					'	bg =  bg -  '.$bd.' - 1 '.
455
					'WHERE bd <=  '.$bd.' '.
452
					'WHERE bd <=  '.$bd.' '.
456
					'	AND bg >=  '.$bg.' '.
453
					'	AND bg >=  '.$bg.' '.
457
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
454
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
458
 
455
 
459
		return Cel::db()->executer($requete);
456
		return Cel::db()->executer($requete);
460
	}
457
	}
461
 
458
 
462
	/** 
459
	/** 
463
	 * Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place.
460
	 * Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place.
464
	 * Décalage borne droite
461
	 * Décalage borne droite
465
	 */
462
	 */
466
	private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) {
463
	private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) {
467
 
464
 
468
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
465
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
469
					'SET bg =  bg + '.$decalage.' , '.
466
					'SET bg =  bg + '.$decalage.' , '.
470
					'	bd = bd + '.$decalage.', '.
467
					'	bd = bd + '.$decalage.', '.
471
					'	niveau = niveau + '.$modif_niveau.' '.
468
					'	niveau = niveau + '.$modif_niveau.' '.
472
					' WHERE bg >=  '.$bg.' '.
469
					' WHERE bg >=  '.$bg.' '.
473
					'	AND bd <=  '.$bd.' '.
470
					'	AND bd <=  '.$bd.' '.
474
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
471
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
475
 
472
 
476
		return Cel::db()->executer($requete);
473
		return Cel::db()->executer($requete);
477
	}
474
	}
478
 
475
 
479
	private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) {
476
	private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) {
480
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
477
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
481
					'SET ce_mot_cle'.$this->suffixe_champ.'_parent = '.Cel::db()->proteger($id_pere).' '.
478
					'SET ce_mot_cle'.$this->suffixe_champ.'_parent = '.Cel::db()->proteger($id_pere).' '.
482
					'WHERE id_mot_cle'.$this->suffixe_champ.' = '.Cel::db()->proteger($id_mot_cle).' '.
479
					'WHERE id_mot_cle'.$this->suffixe_champ.' = '.Cel::db()->proteger($id_mot_cle).' '.
483
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
480
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
484
 
481
 
485
		return Cel::db()->executer($requete);
482
		return Cel::db()->executer($requete);
486
	}
483
	}
487
 }
484
 }
488
?>
485
?>