Subversion Repositories eFlore/Applications.cel

Rev

Rev 1869 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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