Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1842 Rev 1914
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]);
47
		
-
 
48
		$requete = 	'SELECT mot_cle, id_mot_cle'.$this->suffixe_champ.', ce_mot_cle'.$this->suffixe_champ.'_parent '.
46
		
49
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
47
		$this->envoyerJson(self::getMotsClefs($uid[1], $uid[0]));
50
					'WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' '.
48
		return TRUE; // compat: pourquoi renvoyer true si vide ?
51
					'ORDER BY niveau ';
49
	}
52
		
-
 
53
		$resultats_mots_cles = Cel::db()->requeter($requete);
50
 
54
		
51
 
55
		if (is_array($resultats_mots_cles)) {
52
	static function getMotsClefs($uid, $type) {
-
 
53
		if($type == 'obs') {
56
			$mots_cles = array();
54
			return Cel::db()->requeter(sprintf(
57
			foreach($resultats_mots_cles as $mot_cle) {
55
				'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
58
				$mots_cles[] = $mot_cle;
-
 
59
			}
-
 
60
						
56
				' FROM cel_mots_cles_obs'.
61
			$this->envoyerJson($mots_cles);
57
				' WHERE id_utilisateur = %s'.
-
 
58
				' ORDER BY niveau',
62
			return true;
59
				Cel::db()->proteger($uid)));
-
 
60
		}
-
 
61
 
-
 
62
		if($type == 'images') {
-
 
63
			return Cel::db()->requeter(sprintf(
-
 
64
				'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
-
 
65
				' FROM cel_mots_cles_images'.
-
 
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();
-
 
80
	}
-
 
81
 
-
 
82
 
-
 
83
	static function getMotsClefId($uid, $type, $keyword) {
-
 
84
		if($type == 'obs') {
-
 
85
			$ret = Cel::db()->requeter(sprintf(
-
 
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'.
-
 
90
				' ORDER BY niveau',
-
 
91
				Cel::db()->proteger($uid),
-
 
92
				Cel::db()->proteger($keyword) ));
-
 
93
		}
-
 
94
 
-
 
95
		if($type == 'images') {
-
 
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'.
-
 
100
				' AND mot_cle = %s'.
-
 
101
				' ORDER BY niveau',
-
 
102
				Cel::db()->proteger($uid),
-
 
103
				Cel::db()->proteger($keyword) ));
-
 
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
			self::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
				self::completerTransaction();
133
				return true;
175
				return true;
134
			} else {
176
			} else {
135
				$this->annulerTransaction();
177
				self::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
 
-
 
157
		$this->commencerTransaction();
-
 
158
 
198
 
159
		$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
199
		$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
160
		$borne_pere = $bornes['bd'];
200
		$borne_pere = $bornes['bd'];
161
		$niveau = $bornes['niveau'] + 1;
201
		$niveau = $bornes['niveau'] + 1;
162
		$bg = $bornes['bd'];
202
		$bg = $bornes['bd'];
163
		$bd = $bg + 1;
203
		$bd = $bg + 1;
-
 
204
 
-
 
205
        if(!$borne_pere) return false;
-
 
206
 
164
 
207
		self::commencerTransaction();
165
		$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
208
		$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
166
		
209
		
167
		$requete = 	'INSERT INTO  cel_mots_cles'.$this->suffixe_table.' '.
210
		$requete = 	'INSERT INTO  cel_mots_cles'.$this->suffixe_table.' '.
168
					'VALUES ( '.
211
					'VALUES ( '.
169
					Cel::db()->proteger($id_mot_cle).', '.
212
					Cel::db()->proteger($id_mot_cle).', '.
170
					Cel::db()->proteger($id_utilisateur).', '.
213
					Cel::db()->proteger($id_utilisateur).', '.
171
					Cel::db()->proteger($mot_cle).', '.
214
					Cel::db()->proteger($mot_cle).', '.
172
					Cel::db()->proteger($id_mot_cle_general).', '.
215
					Cel::db()->proteger($id_mot_cle_general).', '.
173
					Cel::db()->proteger($bg).', '.
216
					Cel::db()->proteger($bg).', '.
174
					Cel::db()->proteger($bd).', '.
217
					Cel::db()->proteger($bd).', '.
175
					Cel::db()->proteger($niveau).', '.
218
					Cel::db()->proteger($niveau).', '.
176
					Cel::db()->proteger($id_parent).') ' ;
219
					Cel::db()->proteger($id_parent).') ' ;
177
							
220
							
178
		$transaction_reussie_2 = Cel::db()->executer($requete);
221
		$transaction_reussie_2 = Cel::db()->executer($requete);
179
 
222
 
180
		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');
181
			$this->completerTransaction();
229
			self::completerTransaction();
182
			return true;
230
            exit;
183
		} else {
231
		} else {
-
 
232
            // cf ci-dessus: JRest::badRequest
-
 
233
            header('HTTP/1.0 400 Bad Request');
184
			$this->annulerTransaction();
234
			self::annulerTransaction();
185
			return false;
235
            exit;
186
		}
236
		}
187
		return true;
237
		return true;
188
	}
238
	}
189
 
239
 
190
	public function deleteElement($uid) {
240
	public function deleteElement($uid) {
191
		
241
		
192
		$this->setChampsEtTablePourSuffixe($uid[0]);
242
		$this->setChampsEtTablePourSuffixe($uid[0]);
193
		$id_utilisateur = $uid[1];
243
		$id_utilisateur = $uid[1];
194
		$id_mot_cle = $uid[2];
244
		$id_mot_cle = $uid[2];
195
		
245
		
196
		$tableau_ids_mots_cles = array();
246
		$tableau_ids_mots_cles = array();
197
		$tableau_ids_mots_cles[] = $id_mot_cle;
247
		$tableau_ids_mots_cles[] = $id_mot_cle;
198
 
248
 
199
		$this->controleUtilisateur($id_utilisateur);		
249
		$this->controleUtilisateur($id_utilisateur);		
200
		$this->commencerTransaction();
250
		self::commencerTransaction();
201
 
251
 
202
		$bornes  = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
252
		$bornes  = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
203
		if($bornes) {
253
		if($bornes) {
204
			$bg = $bornes['bg'];
254
			$bg = $bornes['bg'];
205
			$bd = $bornes['bd'];
255
			$bd = $bornes['bd'];
206
			
256
			
207
			$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.' '.
208
						'WHERE bg >= '.Cel::db()->proteger($bg).' '.
258
						'WHERE bg >= '.Cel::db()->proteger($bg).' '.
209
						'	AND bd <= '.Cel::db()->proteger($bd).' '.
259
						'	AND bd <= '.Cel::db()->proteger($bd).' '.
210
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
260
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
211
 
261
 
212
			$mots_cles_fils = Cel::db()->requeter($requete_mots_cles_fils);
262
			$mots_cles_fils = Cel::db()->requeter($requete_mots_cles_fils);
213
			foreach ($mots_cles_fils as $fils) {
263
			foreach ($mots_cles_fils as $fils) {
214
				$tableau_ids_mots_cles[] = $fils['id'];
264
				$tableau_ids_mots_cles[] = $fils['id'];
215
			}
265
			}
216
	
266
	
217
			$requete = 	'DELETE FROM cel_mots_cles'.$this->suffixe_table.' '.
267
			$requete = 	'DELETE FROM cel_mots_cles'.$this->suffixe_table.' '.
218
						'WHERE bg >= '.Cel::db()->proteger($bg).' '.
268
						'WHERE bg >= '.Cel::db()->proteger($bg).' '.
219
						'	AND bd <= '.Cel::db()->proteger($bd).' '.
269
						'	AND bd <= '.Cel::db()->proteger($bd).' '.
220
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
270
						'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
221
						
271
						
222
			$transaction_reussie_1 = Cel::db()->executer($requete);
272
			$transaction_reussie_1 = Cel::db()->executer($requete);
223
			$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
273
			$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
224
	
274
	
225
			if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false) {
275
			if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false) {
226
				$this->completerTransaction();
276
				self::completerTransaction();
227
			} else {
277
			} else {
228
				$this->annulerTransaction();
278
				self::annulerTransaction();
229
			}
279
			}
230
		}
280
		}
231
		// Suppression des liaisons associées à ce mot clé
281
		// Suppression des liaisons associées à ce mot clé
232
		$gestion_liaisons = new LiaisonMotsCles($this->config, $this->suffixe);
282
		$gestion_liaisons = new LiaisonMotsCles($this->config, $this->suffixe);
233
		$gestion_liaisons->supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles);
283
		$gestion_liaisons->supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles);
234
		
284
		
235
		return true;
285
		return true;
236
	}
286
	}
237
	
287
	
238
	private function ajouterMotCleRacine($id) {
288
	private function ajouterMotCleRacine($id) {
239
		$requete = 	'SELECT COUNT(*) as nb_mc '.
289
		$requete = 	'SELECT COUNT(*) as nb_mc '.
240
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
290
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
241
					'WHERE id_utilisateur = '.Cel::db()->proteger($id).' ';
291
					'WHERE id_utilisateur = '.Cel::db()->proteger($id).' ';
242
		$resultat = Cel::db()->requeter($requete);
292
		$resultat = Cel::db()->requeter($requete);
243
 
293
 
244
		if (is_array($resultat) && count($resultat) > 0) {
294
		if (is_array($resultat) && count($resultat) > 0) {
245
			$valeurs = $resultat[0]['nb_mc'];
295
			$valeurs = $resultat[0]['nb_mc'];
246
 
296
 
247
			switch ($this->suffixe) {
297
			switch ($this->suffixe) {
248
				case 'obs' :
298
				case 'obs' :
249
					$nom_racine = 'Projets';
299
					$nom_racine = 'Projets';
250
					$id_racine = 'racine_obs';
300
					$id_racine = 'racine_obs';
251
					break;
301
					break;
252
				case 'images' :
302
				case 'images' :
253
					$nom_racine = 'Mots clés';
303
					$nom_racine = 'Mots clés';
254
					$id_racine = 'racine';
304
					$id_racine = 'racine';
255
					break;
305
					break;
256
				default:
306
				default:
257
					$nom_racine = $this->suffixe;
307
					$nom_racine = $this->suffixe;
258
					$id_racine = $this->suffixe;
308
					$id_racine = $this->suffixe;
259
			}
309
			}
260
			
310
			
261
			$md5_racine = Cel::db()->proteger(md5($nom_racine));
311
			$md5_racine = Cel::db()->proteger(md5($nom_racine));
262
			$id_racine = Cel::db()->proteger($id_racine);
312
			$id_racine = Cel::db()->proteger($id_racine);
263
			$nom_racine = Cel::db()->proteger($nom_racine);
313
			$nom_racine = Cel::db()->proteger($nom_racine);
264
			$id_utilisateur = Cel::db()->proteger($id);
314
			$id_utilisateur = Cel::db()->proteger($id);
265
 
315
 
266
			if ($valeurs == 0) {				
316
			if ($valeurs == 0) {				
267
				$requete = "INSERT INTO cel_mots_cles{$this->suffixe_table} ".
317
				$requete = "INSERT INTO cel_mots_cles{$this->suffixe_table} ".
268
						   "VALUES ($id_racine, $id_utilisateur, $nom_racine, $md5_racine, ".
318
						   "VALUES ($id_racine, $id_utilisateur, $nom_racine, $md5_racine, ".
269
						   "1, 2, 0, '') ";
319
						   "1, 2, 0, '') ";
270
				
320
				
271
				Cel::db()->executer($requete);
321
				Cel::db()->executer($requete);
272
			}
322
			}
273
		}
323
		}
274
	}
324
	}
275
 
325
 
276
	/**
326
	/**
277
	 * Désactive l'auto-commit puis débute la transaction
327
	 * Désactive l'auto-commit puis débute la transaction
278
	 */
328
	 */
279
	private function commencerTransaction() {
329
	static function commencerTransaction() {
280
		// 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
281
		$requete = 'SET AUTOCOMMIT = 0 ';
-
 
282
		$reussite_autocommit = Cel::db()->executer($requete);
331
		$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 0");
283
 
-
 
284
		// Débute une nouvelle transaction
332
		// Débute une nouvelle transaction
285
		$requete = 'BEGIN ';
-
 
286
		$reussite_begin = Cel::db()->executer($requete);
333
		$reussite_begin = Cel::db()->executer("BEGIN");
287
	}
334
	}
288
 
335
 
289
	/**
336
	/**
290
	 * Termine la transaction puis réactive l'auto-commit
337
	 * Termine la transaction puis réactive l'auto-commit
291
	 */
338
	 */
292
	private function completerTransaction() {
339
	static function completerTransaction() {
293
		// Complète la transaction
340
		// Complète la transaction
294
		$requete = 'COMMIT ';
-
 
295
		$reussite_commit = Cel::db()->executer($requete);
341
		$reussite_commit = Cel::db()->executer("COMMIT");
296
 
-
 
297
		// 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
298
		$requete = 'SET AUTOCOMMIT = 1 ';
-
 
299
		$reussite_autocommit = Cel::db()->executer($requete);
343
		$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 1");
300
 
344
 
301
		echo 'OK';
345
		echo 'OK';
302
	}
346
	}
303
	
347
	
304
	/**
348
	/**
305
	 * Annule la transaction et réactive l'auto-commit
349
	 * Annule la transaction et réactive l'auto-commit
306
	 */
350
	 */
307
	private function annulerTransaction() {
351
	static function annulerTransaction() {
308
		// Annule la transaction
352
		// Annule la transaction
309
		$requete = 'ROLLBACK ';
-
 
310
		$reussite_rollback = Cel::db()->executer($requete);
353
		$reussite_rollback = Cel::db()->executer("ROLLBACK");
311
 
-
 
312
		// 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
313
		$requete = 'SET AUTOCOMMIT = 1 ';
-
 
314
		$reussite_autocommit = Cel::db()->executer($requete);
355
		$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 1");
315
 
356
 
316
		echo 'ERROR';
357
		echo 'ERROR';
317
	}
358
	}
318
 
359
 
319
	/** 
360
	/** 
320
	 * 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
321
	 */
362
	 */
322
	private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) {
363
	private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) {
323
		$requete = 	'SELECT bd, bg, niveau '.
364
		$requete = 	'SELECT bd, bg, niveau '.
324
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
365
					'FROM cel_mots_cles'.$this->suffixe_table.' '.
325
					'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).' '.
326
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
367
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
327
		
368
		
328
		$resultat = Cel::db()->requeter($requete);
369
		$resultat = Cel::db()->requeter($requete);
329
		
370
		
330
		$valeurs = null;
371
		$valeurs = null;
331
		if(is_array($resultat) && count($resultat) > 0) {
372
		if(is_array($resultat) && count($resultat) > 0) {
332
			$valeurs = $resultat[0];
373
			$valeurs = $resultat[0];
333
		}
374
		}
334
		
375
		
335
		return $valeurs;
376
		return $valeurs;
336
	}
377
	}
337
 
378
 
338
	/**
379
	/**
339
	 * 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
340
	 */ 
381
	 */ 
341
	private function decalerBornesPlusDeux($valeur, $id_utilisateur) {
382
	private function decalerBornesPlusDeux($valeur, $id_utilisateur) {
342
		// Décalage borne droite
383
		// Décalage borne droite
343
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
384
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
344
					'SET bd = bd + 2 WHERE bd >= '.$valeur.' '.
385
					'SET bd = bd + 2 WHERE bd >= '.$valeur.' '.
345
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
386
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
346
		$reussi_1 = Cel::db()->executer($requete);
387
		$reussi_1 = Cel::db()->executer($requete);
347
		
388
		
348
		// Décalage borne gauche
389
		// Décalage borne gauche
349
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
390
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
350
					'SET bg = bg + 2 '.
391
					'SET bg = bg + 2 '.
351
					'WHERE bg >= '.$valeur.' '.
392
					'WHERE bg >= '.$valeur.' '.
352
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
393
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
353
		$reussi_2 = Cel::db()->executer($requete);
394
		$reussi_2 = Cel::db()->executer($requete);
354
		
395
		
355
		return $reussi_1 !== false && $reussi_2 !== false;
396
		return $reussi_1 !== false && $reussi_2 !== false;
356
	}
397
	}
357
 
398
 
358
	/**
399
	/**
359
	 * 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).
360
	 */
401
	 */
361
	private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) {
402
	private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) {
362
		$decalage = $bd - $bg + 1;
403
		$decalage = $bd - $bg + 1;
363
 
404
 
364
		// Décalage borne droite
405
		// Décalage borne droite
365
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
406
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
366
					'SET bd = bd - '.$decalage.' '.
407
					'SET bd = bd - '.$decalage.' '.
367
					'WHERE bd >=  '.$bg.' '.
408
					'WHERE bd >=  '.$bg.' '.
368
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
409
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
369
		$reussi_1 = Cel::db()->executer($requete);
410
		$reussi_1 = Cel::db()->executer($requete);
370
 
411
 
371
		// Décalage borne gauche
412
		// Décalage borne gauche
372
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
413
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
373
					'SET bg = bg - '.$decalage.' '.
414
					'SET bg = bg - '.$decalage.' '.
374
					'WHERE bg >  '.$bg.' '.
415
					'WHERE bg >  '.$bg.' '.
375
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
416
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
376
		$reussi_2 = Cel::db()->executer($requete);
417
		$reussi_2 = Cel::db()->executer($requete);
377
		
418
		
378
		return $reussi_1 !== false && $reussi_2 !== false;
419
		return $reussi_1 !== false && $reussi_2 !== false;
379
	}
420
	}
380
 
421
 
381
	/**
422
	/**
382
	 * 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).
383
	 */ 
424
	 */ 
384
	private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) {
425
	private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) {
385
		$decalage = $largeur;
426
		$decalage = $largeur;
386
 
427
 
387
		// decalage borne droite
428
		// decalage borne droite
388
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
429
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
389
					'SET bd = bd + '.$decalage.' '.
430
					'SET bd = bd + '.$decalage.' '.
390
					'WHERE bd >=  '.$valeur_bornes.' '.
431
					'WHERE bd >=  '.$valeur_bornes.' '.
391
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
432
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
392
		$reussi_1 = Cel::db()->executer($requete);
433
		$reussi_1 = Cel::db()->executer($requete);
393
 
434
 
394
		// decalage borne gauche
435
		// decalage borne gauche
395
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
436
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
396
					'SET bg = bg + '.$decalage.' '.
437
					'SET bg = bg + '.$decalage.' '.
397
					'WHERE bg >=  '.$valeur_bornes.' '.
438
					'WHERE bg >=  '.$valeur_bornes.' '.
398
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
439
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
399
		$reussi_2 = Cel::db()->executer($requete);
440
		$reussi_2 = Cel::db()->executer($requete);
400
 
441
 
401
		return $reussi_1 !== false && $reussi_2 !== false;
442
		return $reussi_1 !== false && $reussi_2 !== false;
402
	}
443
	}
403
 
444
 
404
	/**
445
	/**
405
	 * 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.
406
	 */
447
	 */
407
	private function exclureIntervalle($bg, $bd, $id_utilisateur) {
448
	private function exclureIntervalle($bg, $bd, $id_utilisateur) {
408
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
449
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
409
					'SET bd = bd - '.$bd.' - 1 , '.
450
					'SET bd = bd - '.$bd.' - 1 , '.
410
					'	bg =  bg -  '.$bd.' - 1 '.
451
					'	bg =  bg -  '.$bd.' - 1 '.
411
					'WHERE bd <=  '.$bd.' '.
452
					'WHERE bd <=  '.$bd.' '.
412
					'	AND bg >=  '.$bg.' '.
453
					'	AND bg >=  '.$bg.' '.
413
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
454
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
414
 
455
 
415
		return Cel::db()->executer($requete);
456
		return Cel::db()->executer($requete);
416
	}
457
	}
417
 
458
 
418
	/** 
459
	/** 
419
	 * 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.
420
	 * Décalage borne droite
461
	 * Décalage borne droite
421
	 */
462
	 */
422
	private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) {
463
	private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) {
423
 
464
 
424
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
465
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
425
					'SET bg =  bg + '.$decalage.' , '.
466
					'SET bg =  bg + '.$decalage.' , '.
426
					'	bd = bd + '.$decalage.', '.
467
					'	bd = bd + '.$decalage.', '.
427
					'	niveau = niveau + '.$modif_niveau.' '.
468
					'	niveau = niveau + '.$modif_niveau.' '.
428
					' WHERE bg >=  '.$bg.' '.
469
					' WHERE bg >=  '.$bg.' '.
429
					'	AND bd <=  '.$bd.' '.
470
					'	AND bd <=  '.$bd.' '.
430
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
471
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
431
 
472
 
432
		return Cel::db()->executer($requete);
473
		return Cel::db()->executer($requete);
433
	}
474
	}
434
 
475
 
435
	private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) {
476
	private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) {
436
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
477
		$requete = 	'UPDATE cel_mots_cles'.$this->suffixe_table.' '.
437
					'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).' '.
438
					'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).' '.
439
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
480
					'	AND id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' ';
440
 
481
 
441
		return Cel::db()->executer($requete);
482
		return Cel::db()->executer($requete);
442
	}
483
	}
443
 }
484
 }
444
?>
485
?>