Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2026 Rev 2027
1
<?php
1
<?php
2
/**
2
/**
3
* @package   jrest
3
* @package   jrest
4
* @author    Aurélien Peronnet <aurelien@tela-botania.org>
4
* @author    Aurélien Peronnet <aurelien@tela-botania.org>
5
* @copyright 2010, 2013 Tela-Botanica
5
* @copyright 2010, 2013 Tela-Botanica
6
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
6
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
7
*
7
*
8
* Librairie de liaison d'images et d'observation à des mots clés en utilisant la méthode
8
* Librairie de liaison d'images et d'observation à des mots clés en utilisant la méthode
9
* path enumeration
9
* path enumeration
10
*/
10
*/
11
 
11
 
12
class GestionMotsClesChemin {
12
class GestionMotsClesChemin {
13
	
13
	
14
	private $config;
14
	private $config;
15
	private $mode;
15
	private $mode;
16
	
16
	
17
	private $table_liaison;
17
	private $table_liaison;
18
	private $table_mots_cles;
18
	private $table_mots_cles;
-
 
19
	private $champ_id_element_lie;
19
	
20
	
20
	public function GestionMotsClesChemin($config, $mode = 'obs') {
21
	public function GestionMotsClesChemin($config, $mode = 'obs') {
21
		$this->config = $config;
22
		$this->config = $config;
22
		//TODO: switch suivant mode
23
		//TODO: switch suivant mode
-
 
24
		$this->mode = $mode;
-
 
25
		
-
 
26
		if($mode == 'obs') {
23
		$this->table_liaison = 'cel_obs_tags_path_liaison';
27
			$this->table_liaison = 'cel_obs_tags_path_liaison';
24
		$this->table_mots_cles = 'cel_obs_tags_path';
28
			$this->table_mots_cles = 'cel_obs_tags_path';
-
 
29
			$this->champ_id_element_lie = 'id_obs';
-
 
30
		} else {
-
 
31
			$this->table_liaison = 'cel_images_tags_path_liaison';
-
 
32
			$this->table_mots_cles = 'cel_images_tags_path';
-
 
33
			$this->champ_id_element_lie = 'id_image';
-
 
34
		}
25
	}
35
	}
26
	
36
	
27
	public function viderTables() {
37
	public function viderTables() {
28
		$requete = "TRUNCATE ".$this->table_mots_cles." ";
38
		$requete = "TRUNCATE ".$this->table_mots_cles." ";
29
		$vidage = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
39
		$vidage = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
30
		
40
		
31
		$requete = "TRUNCATE ".$this->table_liaison." ";
41
		$requete = "TRUNCATE ".$this->table_liaison." ";
32
		$vidage = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
42
		$vidage = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
33
		
43
		
34
		return $vidage;
44
		return $vidage;
35
	}
45
	}
36
	
46
	
-
 
47
	public function construireRequeteOr($mots_cles) {
-
 
48
		return $this->construireRequete($mots_cles, 'OR');
-
 
49
	}
-
 
50
	
-
 
51
	public function construireRequeteCheminOr($mots_cles) {
-
 
52
		return $this->construireRequeteChemin($mots_cles, 'OR');
-
 
53
	}
-
 
54
	
-
 
55
	public function construireRequeteAnd($mots_cles) {
-
 
56
		return $this->construireRequete($mots_cles, 'AND');
-
 
57
	}
-
 
58
	
-
 
59
	public function construireRequeteCheminAnd($mots_cles) {
-
 
60
		return $this->construireRequeteChemin($mots_cles, 'AND');
-
 
61
	}
-
 
62
	
-
 
63
	public function construireRequete($mots_cles, $operateur = 'AND') {
-
 
64
		$requete = "SELECT * FROM cel_images_tags_path_liaison ";
-
 
65
		$criteres = array();
-
 
66
		$premier = array_pop($mots_cles);
-
 
67
		$requete .= 'WHERE (tag = '.Cel::db()->proteger($premier).' ';
-
 
68
	
-
 
69
		foreach ($mots_cles as $mot_cle) {
-
 
70
			$requete .= " ".$operateur." id_image IN (SELECT id_image ".
-
 
71
										"FROM cel_images_tags_path_liaison ".
-
 
72
										"WHERE tag = ".Cel::db()->proteger($mot_cle)." ".
-
 
73
										") ";
-
 
74
		}
-
 
75
		$requete .= ")";
-
 
76
		$images = Cel::db()->requeter($requete);
-
 
77
		return $images;
37
	public function convertirNestedSetVersPathEnum() {
78
	}
-
 
79
	
-
 
80
	private function construireRequeteChemin($mots_cles, $operateur = 'AND') {
38
		
81
		$requete = "SELECT * FROM cel_images_tags_path_liaison ";
-
 
82
		$criteres = array();
-
 
83
		$premier = array_pop($mots_cles);
-
 
84
		$requete .= 'WHERE (chemin LIKE '.Cel::db()->proteger('%/'.$premier.'/%').' ';
-
 
85
		
-
 
86
		foreach ($mots_cles as $mot_cle) {
-
 
87
			$requete .= " ".$operateur." id_image IN (SELECT id_image ".
-
 
88
												"FROM cel_images_tags_path_liaison ".
-
 
89
												"WHERE chemin LIKE ".Cel::db()->proteger('%/'.$mot_cle.'/%')." ".
-
 
90
												") ";
-
 
91
		}
-
 
92
		$requete .= ")";
-
 
93
		$images = Cel::db()->requeter($requete);
-
 
94
		return $images;
-
 
95
	}
-
 
96
	
-
 
97
	private function obtenirMotsClesOriginaux($mode) {
-
 
98
		
39
		$time_start = microtime();
99
		if($mode == 'obs') {
-
 
100
			$requete_arbre = "SELECT id_mot_cle_obs as id_mot_cle, ce_mot_cle_obs_parent as parent, id_utilisateur, mot_cle ".
-
 
101
							"FROM cel_mots_cles_obs_srv ORDER BY id_utilisateur, niveau";
-
 
102
		} else {
-
 
103
			$requete_arbre = "SELECT id_mot_cle_image as id_mot_cle, ce_mot_cle_image_parent as parent, id_utilisateur, mot_cle ".
-
 
104
							"FROM cel_mots_cles_images_srv ORDER BY id_utilisateur, niveau";
40
		
105
		}
41
		$requete_arbre = "SELECT * FROM cel_mots_cles_obs_srv ORDER BY id_utilisateur, niveau";
-
 
42
		$mots_cles = Cel::db()->requeter($requete_arbre);
-
 
43
		
-
 
44
		$requete_liaisons = "SELECT comc.id_observation, comc.id_mot_cle_obs, o.ce_utilisateur as id_utilisateur ".
-
 
45
									"FROM cel_obs_mots_cles comc ".
-
 
46
									"INNER JOIN cel_obs o ON o.id_observation = comc.id_observation ";
-
 
47
		
106
			
48
		$liaisons = Cel::db()->requeter($requete_liaisons);
107
		$mots_cles = Cel::db()->requeter($requete_arbre);
49
	
108
		
50
		$mots_cles_hierarchiques = array();
109
		$mots_cles_hierarchiques = array();
51
		$correspondances_id_mots_cles_obs = array();
110
		$correspondances_id_mots_cles_obs = array();
-
 
111
		
-
 
112
		$rien = 0;
52
		
113
		
53
		foreach($mots_cles as &$mot) {
114
		foreach($mots_cles as &$mot) {
-
 
115
		
54
 
116
			if(!empty($mot['mot_cle'])) {
-
 
117
				$chemin = '/';
55
			$chemin = '/';
118
				$cle_parent = $mot['parent'].'-'.$mot['id_utilisateur'];
56
			if(isset($mots_cles_hierarchiques[$mot['ce_mot_cle_obs_parent']])) {
119
				if(isset($mots_cles_hierarchiques[$cle_parent])) {
-
 
120
					$chemin = $mots_cles_hierarchiques[$cle_parent]['chemin'];
-
 
121
				}
-
 
122
				$chemin .= self::simplifier($mot['mot_cle']).'/';
-
 
123
				$chemin = str_replace("//", "/", $chemin);
-
 
124
					
-
 
125
				$cle = $mot['id_mot_cle'].'-'.$mot['id_utilisateur'];
-
 
126
					
-
 
127
				$mots_cles_hierarchiques[$cle] = array(
-
 
128
								'id_utilisateur' => $mot['id_utilisateur'],
-
 
129
								'chemin' => $chemin,
-
 
130
								'tag' => $mot['mot_cle']
57
				$chemin = $mots_cles_hierarchiques[$mot['ce_mot_cle_obs_parent']]['chemin'];
131
				);
58
			}
-
 
59
			$chemin .= self::simplifier($mot['mot_cle']).'/';
-
 
60
			$chemin = str_replace("//", "", $chemin);
-
 
61
			
-
 
62
			$cle = $mot['id_mot_cle_obs'].'-'.$mot['id_utilisateur'];
-
 
63
			
-
 
64
			$mots_cles_hierarchiques[$cle] = array(
-
 
65
					'id_utilisateur' => $mot['id_utilisateur'],
-
 
66
					'chemin' => $chemin,
-
 
67
					'tag' => $mot['mot_cle']
-
 
68
			);
132
			}
69
		}
133
		}
-
 
134
		
-
 
135
		return $mots_cles_hierarchiques;
-
 
136
	}
70
		
137
	
-
 
138
	private function obtenirLiaisonsMotsClesOriginaux($mode) {
-
 
139
		if($mode == 'obs') {				
-
 
140
			$requete_liaisons = "SELECT comc.id_observation as id_element_lie, comc.id_mot_cle_obs as id_mot_cle, id_utilisateur as id_utilisateur ".
-
 
141
														"FROM cel_obs_mots_cles_srv comc ";
-
 
142
														//"INNER JOIN cel_obs o ON o.id_observation = comc.id_observation ";
-
 
143
		} else {		
-
 
144
			$requete_liaisons = "SELECT comc.id_image as id_element_lie, comc.id_mot_cle_image as id_mot_cle, id_utilisateur as id_utilisateur ".
-
 
145
																	"FROM cel_images_mots_cles_srv comc ";
-
 
146
																	//"INNER JOIN cel_images o ON o.id_image = comc.id_image ";
-
 
147
		}
-
 
148
			
-
 
149
		$liaisons = Cel::db()->requeter($requete_liaisons);
-
 
150
		return $liaisons;
-
 
151
	}
-
 
152
	
-
 
153
	public function convertirNestedSetVersPathEnum() {
-
 
154
		
-
 
155
		$mots_cles_hierarchiques = $this->obtenirMotsClesOriginaux($this->mode);
-
 
156
		$liaisons = $this->obtenirLiaisonsMotsClesOriginaux($this->mode);
-
 
157
		
-
 
158
		/*foreach($mots_cles_hierarchiques as $mot) {
-
 
159
			echo $mot['chemin'].'<br />';
-
 
160
		}*/
-
 
161
		//echo '<pre>'.print_r($liaisons,true).'</pre>';
-
 
162
		//exit;
71
		$time_end = microtime();
163
		
72
		$time = $time_end - $time_start;
164
		$time_start = microtime();
73
			
165
					
74
		$mots_cles_slice = array_chunk($mots_cles_hierarchiques, 800, true);
166
		$mots_cles_slice = array_chunk($mots_cles_hierarchiques, 800, true);
75
		foreach($mots_cles_slice as $mots_cles_tranche) {
167
		foreach($mots_cles_slice as $mots_cles_tranche) {
76
			$requete_insertion_mots_cles = "INSERT INTO ".$this->table_mots_cles." (chemin, id_utilisateur, tag) ".
168
			$requete_insertion_mots_cles = "INSERT INTO ".$this->table_mots_cles." (chemin, id_utilisateur, tag) ".
77
			                     			" VALUES ";
169
			                     			" VALUES ";
78
			
170
			
79
			foreach($mots_cles_tranche as $cle => $mot_cle_tranche) {
171
			foreach($mots_cles_tranche as $cle => $mot_cle_tranche) {
80
				$requete_insertion_mots_cles .= "(".
172
				$requete_insertion_mots_cles .= "(".
81
					cel::db()->proteger($mot_cle_tranche['chemin']).", ".
173
					cel::db()->proteger($mot_cle_tranche['chemin']).", ".
82
					cel::db()->proteger($mot_cle_tranche['id_utilisateur']).", ".
174
					cel::db()->proteger($mot_cle_tranche['id_utilisateur']).", ".
83
					cel::db()->proteger($mot_cle_tranche['tag'])." ".	
175
					cel::db()->proteger($mot_cle_tranche['tag'])." ".	
84
				"), ";
176
				"), ";
85
			}
177
			}
86
			
178
			
87
			$requete_insertion_mots_cles = rtrim($requete_insertion_mots_cles, ", ");
179
			$requete_insertion_mots_cles = rtrim($requete_insertion_mots_cles, ", ");
88
			cel::db()->executer($requete_insertion_mots_cles);
180
			cel::db()->executer($requete_insertion_mots_cles);
89
		}
181
		}
-
 
182
		
90
		
183
		$gne = 0;
91
		$liaisons_slice = array_chunk($liaisons, 800, true);
184
		$liaisons_slice = array_chunk($liaisons, 800, true);
92
		foreach($liaisons_slice as &$liaison_tranche) {
185
		foreach($liaisons_slice as &$liaison_tranche) {
93
			$requete_insertion_liaisons = "INSERT INTO ".$this->table_liaison." (id_obs, chemin, id_utilisateur) ".
186
			$requete_insertion_liaisons = "INSERT INTO ".$this->table_liaison." (".$this->champ_id_element_lie.", chemin, tag, id_utilisateur) ".
94
									      " VALUES ";
187
									      " VALUES ";
95
			$lier = false;
188
			$lier = false;
96
			
189
			
97
			foreach($liaison_tranche as &$liaison_obs_mot_cle) {
190
			foreach($liaison_tranche as &$liaison_obs_mot_cle) {
98
				$cle = $liaison_obs_mot_cle['id_mot_cle_obs'].'-'.$liaison_obs_mot_cle['id_utilisateur'];
191
				$cle = $liaison_obs_mot_cle['id_mot_cle'].'-'.$liaison_obs_mot_cle['id_utilisateur'];
99
				if(isset($mots_cles_hierarchiques[$cle])) {
192
				if(isset($mots_cles_hierarchiques[$cle])) {
100
					$requete_insertion_liaisons .= "(".
193
					$requete_insertion_liaisons .= "(".
101
						cel::db()->proteger($liaison_obs_mot_cle['id_observation']).", ".
194
						cel::db()->proteger($liaison_obs_mot_cle['id_element_lie']).", ".
102
						cel::db()->proteger($mots_cles_hierarchiques[$cle]['chemin']).", ".
195
						cel::db()->proteger($mots_cles_hierarchiques[$cle]['chemin']).", ".
-
 
196
						cel::db()->proteger($mots_cles_hierarchiques[$cle]['tag']).", ".
103
						cel::db()->proteger($liaison_obs_mot_cle['id_utilisateur'])." ".
197
						cel::db()->proteger($liaison_obs_mot_cle['id_utilisateur'])." ".
104
					"), ";
198
					"), ";
105
					$lier = true;
199
					$lier = true;
106
				}
200
				}
107
			}
201
			}
108
			
202
			
109
			if($lier) {
203
			if($lier) {
110
				$requete_insertion_liaisons = rtrim($requete_insertion_liaisons, ", ");
204
				$requete_insertion_liaisons = rtrim($requete_insertion_liaisons, ", ");
111
				cel::db()->executer($requete_insertion_liaisons);
205
				cel::db()->executer($requete_insertion_liaisons);
112
			}
206
			}
113
		}
207
		}
-
 
208
		
114
		
209
		$time = microtime() - $time_start;
115
		echo "La génération d'un tableau de ".count($mots_cles_hierarchiques).' éléments a pris '.$time.' secondes';
210
		echo "La génération d'un tableau de ".count($mots_cles_hierarchiques).' éléments et de '.count($liaisons).' liaisons a pris '.$time.' secondes';
116
		exit;
211
		exit;
117
	}
212
	}
118
	
213
	
119
	public function obtenirArbre($id_utilisateur, $chemin = "/") {
214
	public function obtenirArbre($id_utilisateur, $chemin = "/") {
120
 
215
 
121
		$requete = "SELECT * FROM ".$this->table_mots_cles." ".
216
		$requete = "SELECT * FROM ".$this->table_mots_cles." ".
122
		"WHERE id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." AND ".
217
		"WHERE id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." AND ".
123
		"chemin LIKE ".Cel::db()->proteger($chemin."%")." ".
218
		"chemin LIKE ".Cel::db()->proteger($chemin."%")." ".
124
		"ORDER BY chemin";
219
		"ORDER BY chemin";
125
		
220
		
126
		$arbre = Cel::db()->requeter($requete.' -- '.__FILE__.':'.__LINE__);	
221
		$arbre = Cel::db()->requeter($requete.' -- '.__FILE__.':'.__LINE__);	
127
		usort($arbre, array('GestionMotsClesChemin', 'comparerProfNoeuds'));
222
		usort($arbre, array('GestionMotsClesChemin', 'comparerProfNoeuds'));
128
		
223
		
129
		return $arbre;
224
		return $arbre;
130
	}
225
	}
131
	
226
	
132
	public function insererParChemin($mot_cle, $chemin_parent, $id_utilisateur) {
227
	public function insererParChemin($mot_cle, $chemin_parent, $id_utilisateur) {
133
		
228
		
134
		$chemin_mot_cle = self::getCheminHarmonise($chemin_parent, $mot_cle);
229
		$chemin_mot_cle = self::getCheminHarmonise($chemin_parent, $mot_cle);
135
		
230
		
136
		$requete = "INSERT INTO ".$this->table_mots_cles." (chemin, id_utilisateur, tag) ".
231
		$requete = "INSERT INTO ".$this->table_mots_cles." (chemin, id_utilisateur, tag) ".
137
		           "VALUES (".
232
		           "VALUES (".
138
		           		Cel::db()->proteger($chemin_mot_cle).", ".
233
		           		Cel::db()->proteger($chemin_mot_cle).", ".
139
						Cel::db()->proteger($id_utilisateur).", ".
234
						Cel::db()->proteger($id_utilisateur).", ".
140
						Cel::db()->proteger($mot_cle)." ".
235
						Cel::db()->proteger($mot_cle)." ".
141
		           ")";
236
		           ")";
142
		
237
		
143
		$insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
238
		$insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
144
		
239
		
145
		return $insertion;
240
		return $insertion;
146
	}
241
	}
147
	
242
	
148
	public function insererParIdParent($mot_cle, $id_parent, $id_utilisateur) {
243
	public function insererParIdParent($mot_cle, $id_parent, $id_utilisateur) {
149
		
244
		
150
		$mot_cle_simp = self::simplifier($mot_cle);
245
		$mot_cle_simp = self::simplifier($mot_cle);
151
		
246
		
152
		$sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." ".
247
		$sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." ".
153
		                       "WHERE id_tag = ".Cel::db()->proteger($id_parent).")";
248
		                       "WHERE id_tag = ".Cel::db()->proteger($id_parent).")";
154
		
249
		
155
		$requete = "INSERT INTO ".$this->table_mots_cles."(chemin, id_utilisateur, tag) ".
250
		$requete = "INSERT INTO ".$this->table_mots_cles."(chemin, id_utilisateur, tag) ".
156
		           "VALUES (".
251
		           "VALUES (".
157
						"CONCAT(".$sous_requete_chemin.",".Cel::db()->proteger($mot_cle_simp).",'/') ".
252
						"CONCAT(".$sous_requete_chemin.",".Cel::db()->proteger($mot_cle_simp).",'/') ".
158
						Cel::db()->proteger($id_utilisateur).", ".
253
						Cel::db()->proteger($id_utilisateur).", ".
159
						Cel::db()->proteger($tag).", ".
254
						Cel::db()->proteger($tag).", ".
160
		           ")";
255
		           ")";
161
		
256
		
162
		$insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
257
		$insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
163
		
258
		
164
		return $insertion;
259
		return $insertion;
165
	}
260
	}
166
	
261
	
167
	public function lierParId($id_mot_cle, $id_observation, $id_utilisateur) {
262
	public function lierParId($id_mot_cle, $id_observation, $id_utilisateur) {
168
		
263
		
169
		$sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." ".
264
		$sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." ".
170
				   		"WHERE id_tag = ".Cel::db()->proteger($id_mot_cle).") ";
265
				   		"WHERE id_tag = ".Cel::db()->proteger($id_mot_cle).") ";
171
		
266
		
172
		$requete = "INSERT INTO ".$this->table_liaison." (id_obs, chemin, id_utilisateur) ".
267
		$requete = "INSERT INTO ".$this->table_liaison." (".$this->champ_id_element_lie.", chemin, id_utilisateur) ".
173
					"VALUES (".
268
					"VALUES (".
174
				   		Cel::db()->proteger($id_observation).", ".
269
				   		Cel::db()->proteger($id_observation).", ".
175
				   		$sous_requete_chemin.",".
270
				   		$sous_requete_chemin.",".
176
				   		Cel::db()->proteger($id_utilisateur)." ".
271
				   		Cel::db()->proteger($id_utilisateur)." ".
177
				   	") ".
272
				   	") ".
178
					"ON DUPLICATE KEY UPDATE id_obs = id_obs; ";
273
					"ON DUPLICATE KEY UPDATE ".$this->champ_id_element_lie." = ".$this->champ_id_element_lie." ";
179
		
274
		
180
		$liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
275
		$liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
181
		
276
		
182
		return $liaison;
277
		return $liaison;
183
	}
278
	}
184
	
279
	
185
	public function lierParChemin($chemin, $id_observation, $id_utilisateur) {
280
	public function lierParChemin($chemin, $id_observation, $id_utilisateur) {
186
				
281
				
187
		$requete = "INSERT INTO ".$this->table_liaison." (id_obs, chemin, id_utilisateur) ".
282
		$requete = "INSERT INTO ".$this->table_liaison." (id_obs, chemin, id_utilisateur) ".
188
					"VALUES (".
283
					"VALUES (".
189
						Cel::db()->proteger($id_observation).", ".
284
						Cel::db()->proteger($id_observation).", ".
190
						Cel::db()->proteger($sous_requete_chemin).", ".
285
						Cel::db()->proteger($sous_requete_chemin).", ".
191
						Cel::db()->proteger($id_utilisateur)." ".
286
						Cel::db()->proteger($id_utilisateur)." ".
192
				   	") ".
287
				   	") ".
193
					"ON DUPLICATE KEY UPDATE id_obs = id_obs; ";
288
					"ON DUPLICATE KEY UPDATE ".$this->champ_id_element_lie." = ".$this->champ_id_element_lie." ";
194
		
289
		
195
		$liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
290
		$liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
196
		
291
		
197
		return $liaison;
292
		return $liaison;
198
	}
293
	}
199
	
294
	
200
	// Déplacer un mot clé et le renommer est une même opération, dans le cas du renommage,
295
	// Déplacer un mot clé et le renommer est une même opération, dans le cas du renommage,
201
	// seule la fin du chemin change
296
	// seule la fin du chemin change
202
	public function renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur) {
297
	public function renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur) {
203
		
298
		
204
		$ancien_chemin = self::harmoniserChemin($ancien_chemin);
299
		$ancien_chemin = self::harmoniserChemin($ancien_chemin);
205
		$nouveau_chemin = self::harmoniserChemin($nouveau_chemin);
300
		$nouveau_chemin = self::harmoniserChemin($nouveau_chemin);
206
		
301
		
207
		$ancien_chemin_p = Cel::db()->proteger($ancien_chemin);
302
		$ancien_chemin_p = Cel::db()->proteger($ancien_chemin);
208
		$nouveau_chemin_p = Cel::db()->proteger($nouveau_chemin);
303
		$nouveau_chemin_p = Cel::db()->proteger($nouveau_chemin);
209
		
304
		
210
		// TODO : triggers pour les tables liées ?
305
		// TODO : triggers pour les tables liées ?
211
		$requete = "UPDATE ".$this->table_mots_cles." ".
306
		$requete = "UPDATE ".$this->table_mots_cles." ".
212
		       	   "SET chemin = REPLACE(chemin,".$ancien_chemin_p.", ".$nouveau_chemin_p.") ".                              
307
		       	   "SET chemin = REPLACE(chemin,".$ancien_chemin_p.", ".$nouveau_chemin_p.") ".                              
213
				   "WHERE chemin LIKE ".Cel::db()->proteger($ancien_chemin."%")." AND ".
308
				   "WHERE chemin LIKE ".Cel::db()->proteger($ancien_chemin."%")." AND ".
214
		           "id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";   
309
		           "id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";   
215
		echo $requete.'<br />';
310
		echo $requete.'<br />';
216
		$deplacement = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
311
		$deplacement = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
217
		
312
		
218
		return $deplacement;
313
		return $deplacement;
219
	}
314
	}
220
	
315
	
221
	public function supprimerChemin($chemin, $id_utilisateur) {
316
	public function supprimerChemin($chemin, $id_utilisateur) {
222
		// TODO : triggers pour les tables liées ?
317
		// TODO : triggers pour les tables liées ?
223
		$requete = "DELETE FROM ".$this->$table_mots_cles." ".
318
		$requete = "DELETE FROM ".$this->$table_mots_cles." ".
224
                   	"WHERE chemin LIKE ".Cel::db()->proteger($chemin."%")." AND ".
319
                   	"WHERE chemin LIKE ".Cel::db()->proteger($chemin."%")." AND ".
225
                   	"id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";   
320
                   	"id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";   
226
 
321
 
227
		$suppression = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
322
		$suppression = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);
228
		
323
		
229
		return $suppression;
324
		return $suppression;
230
			
325
			
231
	}
326
	}
232
	
327
	
233
	// Fonctions utilitaires	
328
	// Fonctions utilitaires	
234
	static public function comparerProfNoeuds($a, $b) {
329
	static public function comparerProfNoeuds($a, $b) {
235
		
330
		
236
		$nb_slashs_a = substr_count($a['chemin'], '/');
331
		$nb_slashs_a = substr_count($a['chemin'], '/');
237
		$nb_slashs_b = substr_count($a['chemin'], '/');
332
		$nb_slashs_b = substr_count($a['chemin'], '/');
238
		$cmp = 0;
333
		$cmp = 0;
239
		
334
		
240
		if($nb_slashs_a == $nb_slashs_b) {
335
		if($nb_slashs_a == $nb_slashs_b) {
241
			$cmp = strcmp($a['chemin'], $b['chemin']);
336
			$cmp = strcmp($a['chemin'], $b['chemin']);
242
		} else {
337
		} else {
243
			$cmp = ($a['chemin'] > $b['chemin']) ? +1 : -1;
338
			$cmp = ($a['chemin'] > $b['chemin']) ? +1 : -1;
244
		}
339
		}
245
		
340
		
246
		return $cmp;
341
		return $cmp;
247
	}
342
	}
248
	
343
	
249
	/*
344
	/*
250
		CREATE TRIGGER maj_chemin BEFORE UPDATE
345
		CREATE TRIGGER maj_chemin BEFORE UPDATE
251
		ON cel_obs_tag_path FOR EACH ROW 
346
		ON cel_obs_tag_path FOR EACH ROW 
252
		BEGIN
347
		BEGIN
253
			UPDATE cel_obs_tag_path_liaison
348
			UPDATE cel_obs_tag_path_liaison
254
			SET cel_obs_tag_path_liaison.chemin = NEW.CHEMIN
349
			SET cel_obs_tag_path_liaison.chemin = NEW.CHEMIN
255
			WHERE cel_obs_tag_path_liaison.chemin LIKE CONCAT(OLD.chemin,'%')
350
			WHERE cel_obs_tag_path_liaison.chemin LIKE CONCAT(OLD.chemin,'%')
256
			AND cel_obs_tag_path_liaison.id_utilisateur = OLD.id_utilisateur
351
			AND cel_obs_tag_path_liaison.id_utilisateur = OLD.id_utilisateur
257
		END;
352
		END;
258
		
353
		
259
		CREATE TRIGGER suppr_chemin BEFORE UPDATE
354
		CREATE TRIGGER suppr_chemin BEFORE UPDATE
260
		ON cel_obs_tag_path FOR EACH ROW 
355
		ON cel_obs_tag_path FOR EACH ROW 
261
		BEGIN
356
		BEGIN
262
			DELETE FROM cel_obs_tag_path_liaison
357
			DELETE FROM cel_obs_tag_path_liaison
263
			WHERE cel_obs_tag_path_liaison.chemin LIKE CONCAT(OLD.chemin,'%')
358
			WHERE cel_obs_tag_path_liaison.chemin LIKE CONCAT(OLD.chemin,'%')
264
			AND cel_obs_tag_path_liaison.id_utilisateur = OLD.id_utilisateur
359
			AND cel_obs_tag_path_liaison.id_utilisateur = OLD.id_utilisateur
265
		END;
360
		END;
266
		
361
		
267
		CREATE TRIGGER suppr_obs BEFORE DELETE
362
		CREATE TRIGGER suppr_obs BEFORE DELETE
268
		ON cel_obs FOR EACH ROW 
363
		ON cel_obs FOR EACH ROW 
269
		BEGIN
364
		BEGIN
270
			DELETE FROM cel_obs_tag_path_liaison
365
			DELETE FROM cel_obs_tag_path_liaison
271
			WHERE cel_obs_tag_path_liaison.id_obs = OLD.id_observation
366
			WHERE cel_obs_tag_path_liaison.id_obs = OLD.id_observation
272
		END;
367
		END;
273
	*/
368
	*/
274
	
369
	
275
	static public function getCheminHarmonise($chemin_parent, $mot_cle) {
370
	static public function getCheminHarmonise($chemin_parent, $mot_cle) {
276
		return self::harmoniserChemin($chemin_parent.'/'.self::simplifier($mot_cle).'/');
371
		return self::harmoniserChemin($chemin_parent.'/'.self::simplifier($mot_cle).'/');
277
	}
372
	}
278
	
373
	
279
	static public function harmoniserChemin($chemin) {
374
	static public function harmoniserChemin($chemin) {
280
		$chemin = self::startsWith($chemin,'/') ? $chemin : '/'.$chemin;
375
		$chemin = self::startsWith($chemin,'/') ? $chemin : '/'.$chemin;
281
		$chemin = self::endsWith($chemin,'/') ? $chemin : $chemin.'/';
376
		$chemin = self::endsWith($chemin,'/') ? $chemin : $chemin.'/';
282
		return str_replace('//', '/', $chemin);
377
		return str_replace('//', '/', $chemin);
283
	}
378
	}
284
	
379
	
285
	// fonction de slugification du mot clé
380
	// fonction de slugification du mot clé
286
	// http://stackoverflow.com/questions/2955251/php-function-to-make-slug-url-string
381
	// http://stackoverflow.com/questions/2955251/php-function-to-make-slug-url-string
287
	static public function simplifier($text)
382
	static public function simplifier($text)
288
	{
383
	{
289
		return trim(str_replace(array('\\','/'), '', $text));
384
		return trim(str_replace(array('\\','/'), '', $text));
290
		// replace non letter or digits by -
385
		// replace non letter or digits by -
291
		$text = preg_replace('~[^\\pL\d]+~u', '-', $text);
386
		$text = preg_replace('~[^\\pL\d]+~u', '-', $text);
292
	
387
	
293
		// trim
388
		// trim
294
		$text = trim($text, '-');
389
		$text = trim($text, '-');
295
	
390
	
296
		// transliterate
391
		// transliterate
297
		$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
392
		$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
298
	
393
	
299
		// lowercase
394
		// lowercase
300
		$text = strtolower($text);
395
		$text = strtolower($text);
301
	
396
	
302
		// remove unwanted characters
397
		// remove unwanted characters
303
		$text = preg_replace('~[^-\w]+~', '', $text);
398
		$text = preg_replace('~[^-\w]+~', '', $text);
304
	
399
	
305
		if (empty($text))
400
		if (empty($text))
306
		{
401
		{
307
			return 'n-a';
402
			return 'n-a';
308
		}
403
		}
309
	
404
	
310
		return $text;
405
		return $text;
311
	}
406
	}
312
	
407
	
313
	static public function startsWith($haystack, $needle) {
408
	static public function startsWith($haystack, $needle) {
314
		return $needle === "" || strpos($haystack, $needle) === 0;
409
		return $needle === "" || strpos($haystack, $needle) === 0;
315
	}
410
	}
316
	
411
	
317
	static public function endsWith($haystack, $needle) {
412
	static public function endsWith($haystack, $needle) {
318
		return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
413
		return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
319
	}
414
	}
320
}
415
}
321
 
416
 
322
?>
417
?>