Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2149 Rev 2167
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
 
19
 
20
	//TODO: trigger pour les tables liaisons
20
	//TODO: trigger pour les tables liaisons
21
 
21
 
22
	public function GestionMotsClesChemin($config, $mode = 'obs') {
22
	public function GestionMotsClesChemin($config, $mode = 'obs') {
23
		$this->config = $config;
23
		$this->config = $config;
24
		//TODO: switch suivant mode
24
		//TODO: switch suivant mode
25
		$this->mode = $mode;
25
		$this->mode = $mode;
26
 
26
 
27
		list($this->table_liaison, $this->table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
27
		list($this->table_liaison, $this->table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
28
	}
28
	}
29
 
29
 
30
	public function obtenirArbre($id_utilisateur, $chemin = '/') {
30
	public function obtenirArbre($id_utilisateur, $chemin = '/') {
31
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
31
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
32
		$cheminP = Cel::db()->proteger($chemin.'%');
32
		$cheminP = Cel::db()->proteger($chemin.'%');
33
 
33
 
34
		$requete = 'SELECT * '.
34
		$requete = 'SELECT * '.
35
			"FROM {$this->table_mots_cles} ".
35
			"FROM {$this->table_mots_cles} ".
36
			"WHERE id_utilisateur = $idUtilisateurP ".
36
			"WHERE id_utilisateur = $idUtilisateurP ".
37
			"AND chemin LIKE $cheminP ".
37
			"AND chemin LIKE $cheminP ".
38
			'ORDER BY chemin '.
38
			'ORDER BY chemin '.
39
			' -- '.__FILE__.':'.__LINE__;
39
			' -- '.__FILE__.':'.__LINE__;
40
 
40
 
41
		$arbre = Cel::db()->requeter($requete);
41
		$arbre = Cel::db()->requeter($requete);
42
		usort($arbre, array('GestionMotsClesChemin', 'comparerProfNoeuds'));
42
		usort($arbre, array('GestionMotsClesChemin', 'comparerProfNoeuds'));
43
		return $arbre;
43
		return $arbre;
44
	}
44
	}
45
 
45
 
46
	public function obtenirIdsMotsClesParIdParent($id_utilisateur, $id_mot_cle) {
46
	public function obtenirIdsMotsClesParIdParent($id_utilisateur, $id_mot_cle) {
47
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
47
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
48
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
48
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
49
 
49
 
50
		$sousRequete = "SELECT chemin FROM {$this->table_mots_cles} WHERE id_mot_cle = $idMotCleP ";
50
		$sousRequete = "SELECT chemin FROM {$this->table_mots_cles} WHERE id_mot_cle = $idMotCleP ";
51
		$requete = 'SELECT id_mot_cle '.
51
		$requete = 'SELECT id_mot_cle '.
52
			"FROM {$this->table_mots_cles} ".
52
			"FROM {$this->table_mots_cles} ".
53
			"WHERE chemin LIKE CONCAT(($sousRequete), '%') ".
53
			"WHERE chemin LIKE CONCAT(($sousRequete), '%') ".
54
			"AND id_utilisateur = ".$idUtilisateurP." ".
54
			"AND id_utilisateur = ".$idUtilisateurP." ".
55
			' -- '.__FILE__.':'.__LINE__;
55
			' -- '.__FILE__.':'.__LINE__;
56
 
56
 
57
		$ids_enfants = Cel::db()->requeter($requete);
57
		$ids_enfants = Cel::db()->requeter($requete);
58
 
58
 
59
		return $ids_enfants;
59
		return $ids_enfants;
60
	}
60
	}
61
 
61
 
62
	public function insererParCheminSiInexistant($mot_cle, $chemin_parent, $id_utilisateur) {
62
	public function insererParCheminSiInexistant($mot_cle, $chemin_parent, $id_utilisateur) {
63
		$cheminMotCle = self::getCheminHarmonise($chemin_parent, $mot_cle);
63
		$cheminMotCle = self::getCheminHarmonise($chemin_parent, $mot_cle);
64
		$cheminMotCleP = Cel::db()->proteger($cheminMotCle);
64
		$cheminMotCleP = Cel::db()->proteger($cheminMotCle);
65
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
65
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
66
 
66
 
67
		$requete = 'SELECT id_mot_cle '.
67
		$requete = 'SELECT id_mot_cle '.
68
			"FROM {$this->table_mots_cles} ".
68
			"FROM {$this->table_mots_cles} ".
69
			"WHERE chemin = $cheminMotCleP ".
69
			"WHERE chemin = $cheminMotCleP ".
70
			"AND id_utilisateur = $idUtilisateurP ".
70
			"AND id_utilisateur = $idUtilisateurP ".
71
			' -- '.__FILE__.':'.__LINE__;
71
			' -- '.__FILE__.':'.__LINE__;
72
 
72
 
73
		$infosMotCle = Cel::db()->requeter($requete);
73
		$infosMotCle = Cel::db()->requeter($requete);
74
 
74
 
75
		if (!empty($infosMotCle)) {
75
		if (!empty($infosMotCle)) {
76
			$idMotCle = $infosMotCle[0]['id_mot_cle'];
76
			$idMotCle = $infosMotCle[0]['id_mot_cle'];
77
		} else {
77
		} else {
78
			$idMotCle = $this->insererParChemin($mot_cle, $chemin_parent, $id_utilisateur);
78
			$idMotCle = $this->insererParChemin($mot_cle, $chemin_parent, $id_utilisateur);
79
		}
79
		}
80
		return $idMotCle;
80
		return $idMotCle;
81
	}
81
	}
82
 
82
 
83
	public function insererParChemin($mot_cle, $chemin_parent, $id_utilisateur) {
83
	public function insererParChemin($mot_cle, $chemin_parent, $id_utilisateur) {
84
		$cheminMotCle = self::getCheminHarmonise($chemin_parent, $mot_cle);
84
		$cheminMotCle = self::getCheminHarmonise($chemin_parent, $mot_cle);
85
		$cheminMotCleP = Cel::db()->proteger($cheminMotCle);
85
		$cheminMotCleP = Cel::db()->proteger($cheminMotCle);
86
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
86
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
87
		$motCleP = Cel::db()->proteger($mot_cle);
87
		$motCleP = Cel::db()->proteger($mot_cle);
88
 
88
 
89
		$requete = "INSERT INTO {$this->table_mots_cles} ".
89
		$requete = "INSERT INTO {$this->table_mots_cles} ".
90
			'(chemin, id_utilisateur, mot_cle) '.
90
			'(chemin, id_utilisateur, mot_cle) '.
91
			"VALUES ($cheminMotCleP, $idUtilisateurP, $motCleP ) ".
91
			"VALUES ($cheminMotCleP, $idUtilisateurP, $motCleP ) ".
92
			' -- '.__FILE__.':'.__LINE__;
92
			' -- '.__FILE__.':'.__LINE__;
93
 
93
 
94
		$insertion = Cel::db()->executer($requete);
94
		$insertion = Cel::db()->executer($requete);
95
		$resultat = false;
95
		$resultat = false;
96
		if ($insertion !== false) {
96
		if ($insertion !== false) {
97
			$resultat = Cel::db()->obtenirDernierId();
97
			$resultat = Cel::db()->obtenirDernierId();
98
		}
98
		}
99
		return $resultat;
99
		return $resultat;
100
	}
100
	}
101
 
101
 
102
	public function insererParIdParent($mot_cle, $id_parent, $id_utilisateur) {
102
	public function insererParIdParent($mot_cle, $id_parent, $id_utilisateur) {
103
		$motCleSimple = self::simplifier($mot_cle);
103
		$motCleSimple = self::simplifier($mot_cle);
104
		$motCleSimpleP = Cel::db()->proteger($motCleSimple);
104
		$motCleSimpleP = Cel::db()->proteger($motCleSimple);
105
		$idParentP = Cel::db()->proteger($id_parent);
105
		$idParentP = Cel::db()->proteger($id_parent);
106
		$racineP = Cel::db()->proteger('/');
106
		$racineP = Cel::db()->proteger('/');
107
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
107
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
108
		$motCleP = Cel::db()->proteger($mot_cle);
108
		$motCleP = Cel::db()->proteger($mot_cle);
109
 
109
 
110
		$sousRequete = $racineP;
110
		$sousRequete = $racineP;
111
		if ($id_parent != '') {
111
		if ($id_parent != '') {
112
			$sousRequete = '(SELECT chemin '.
112
			$sousRequete = '(SELECT chemin '.
113
				"FROM {$this->table_mots_cles} AS ctp ".
113
				"FROM {$this->table_mots_cles} AS ctp ".
114
				"WHERE ctp.id_mot_cle = $idParentP) ";
114
				"WHERE ctp.id_mot_cle = $idParentP) ";
115
		}
115
		}
116
 
116
 
117
		$requete = "INSERT INTO {$this->table_mots_cles} (chemin, id_utilisateur, mot_cle) ".
117
		$requete = "INSERT INTO {$this->table_mots_cles} (chemin, id_utilisateur, mot_cle) ".
118
			"VALUES (CONCAT($sousRequete, $motCleSimpleP, '/'), $idUtilisateurP, $motCleP ) ".
118
			"VALUES (CONCAT($sousRequete, $motCleSimpleP, '/'), $idUtilisateurP, $motCleP ) ".
119
			' -- '.__FILE__.':'.__LINE__;
119
			' -- '.__FILE__.':'.__LINE__;
120
 
120
 
121
		$insertion = Cel::db()->executer($requete);
121
		$insertion = Cel::db()->executer($requete);
122
		if ($insertion !== false) {
122
		if ($insertion !== false) {
123
			$resultat = Cel::db()->obtenirDernierId();
123
			$resultat = Cel::db()->obtenirDernierId();
124
		}
124
		}
125
		return $resultat;
125
		return $resultat;
126
	}
126
	}
127
 
127
 
128
	public function lierParId($id_mot_cle, $id_element_lie) {
128
	public function lierParId($id_mot_cle, $id_element_lie) {
129
		$idElementLieP = Cel::db()->proteger($id_element_lie);
129
		$idElementLieP = Cel::db()->proteger($id_element_lie);
130
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
130
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
131
 
131
 
132
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
132
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
133
			"VALUES ($idElementLieP, $idMotCleP) ".
133
			"VALUES ($idElementLieP, $idMotCleP) ".
134
			'ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie '.
134
			'ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie '.
135
			' -- '.__FILE__.':'.__LINE__;
135
			' -- '.__FILE__.':'.__LINE__;
136
 
136
 
137
		$liaison = Cel::db()->executer($requete);
137
		$liaison = Cel::db()->executer($requete);
138
		return $liaison;
138
		return $liaison;
139
	}
139
	}
140
 
140
 
141
	public function lierParChemin($chemin, $id_element_lie, $id_utilisateur) {
141
	public function lierParChemin($chemin, $id_element_lie, $id_utilisateur) {
142
		$cheminP = Cel::db()->proteger(self::harmoniserChemin($chemin));
142
		$cheminP = Cel::db()->proteger(self::harmoniserChemin($chemin));
143
		$idElementLieP = Cel::db()->proteger($id_element_lie);
143
		$idElementLieP = Cel::db()->proteger($id_element_lie);
144
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
144
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
145
 
145
 
146
		$sousRequete = '(SELECT id_mot_cle '.
146
		$sousRequete = '(SELECT id_mot_cle '.
147
			"FROM {$this->table_mots_cles} ".
147
			"FROM {$this->table_mots_cles} ".
148
			"WHERE chemin = $cheminP ".
148
			"WHERE chemin = $cheminP ".
149
			"AND id_utilisateur = $idUtilisateurP ".
149
			"AND id_utilisateur = $idUtilisateurP ".
150
			')';
150
			')';
151
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
151
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
152
			"VALUES ($idElementLieP, $sousRequete) ".
152
			"VALUES ($idElementLieP, $sousRequete) ".
153
			'ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie '.
153
			'ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie '.
154
			' -- '.__FILE__.':'.__LINE__;
154
			' -- '.__FILE__.':'.__LINE__;
155
 
155
 
156
		$liaison = Cel::db()->executer($requete);
156
		$liaison = Cel::db()->executer($requete);
157
		return $liaison;
157
		return $liaison;
158
	}
158
	}
159
 
159
 
160
	public function lierParTableaux($ids_mots_cles, $ids_elements_lies, $id_utilisateur) {
160
	public function lierParTableaux($ids_mots_cles, $ids_elements_lies, $id_utilisateur) {
161
		$combinaisons = array();
161
		$combinaisons = array();
162
		foreach ($ids_mots_cles as $id_mot_cle) {
162
		foreach ($ids_mots_cles as $id_mot_cle) {
163
			$idMotCleP = Cel::db()->proteger($id_mot_cle);
163
			$idMotCleP = Cel::db()->proteger($id_mot_cle);
164
			foreach ($ids_elements_lies as $id_element_lie) {
164
			foreach ($ids_elements_lies as $id_element_lie) {
165
				$idElementLieP = Cel::db()->proteger($id_element_lie);
165
				$idElementLieP = Cel::db()->proteger($id_element_lie);
166
				$combinaisons[] = "($idElementLieP, $idMotCleP)";
166
				$combinaisons[] = "($idElementLieP, $idMotCleP)";
167
			}
167
			}
168
		}
168
		}
169
 
169
 
170
		$valeursGroupees = implode(', ', $combinaisons);
170
		$valeursGroupees = implode(', ', $combinaisons);
171
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
171
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
172
			"VALUES $valeursGroupees ".
172
			"VALUES $valeursGroupees ".
173
			"ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie ".
173
			"ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie ".
174
			' -- '.__FILE__.':'.__LINE__;
174
			' -- '.__FILE__.':'.__LINE__;
175
		$liaison = Cel::db()->executer($requete);
175
		$liaison = Cel::db()->executer($requete);
176
 
176
 
177
		return $liaison;
177
		return $liaison;
178
	}
178
	}
179
 
179
 
180
	public function supprimerLiaisonsMotsCles($ids_mots_cles, $ids_elements_lies, $id_utilisateur) {
180
	public function supprimerLiaisonsMotsCles($ids_mots_cles, $ids_elements_lies, $id_utilisateur) {
181
		$combinaisons = array();
181
		$combinaisons = array();
182
		foreach ($ids_mots_cles as $id_mot_cle) {
182
		foreach ($ids_mots_cles as $id_mot_cle) {
183
			$idMotCleP = Cel::db()->proteger($id_mot_cle);
183
			$idMotCleP = Cel::db()->proteger($id_mot_cle);
184
			foreach ($ids_elements_lies as $id_element_lie) {
184
			foreach ($ids_elements_lies as $id_element_lie) {
185
				$idElementLieP = Cel::db()->proteger($id_element_lie);
185
				$idElementLieP = Cel::db()->proteger($id_element_lie);
186
				$combinaisons[] = "(id_element_lie = $idElementLieP AND id_mot_cle = $idMotCleP)";
186
				$combinaisons[] = "(id_element_lie = $idElementLieP AND id_mot_cle = $idMotCleP)";
187
			}
187
			}
188
		}
188
		}
189
		$clauseWhere = implode(' OR ', $combinaisons);
189
		$clauseWhere = implode(' OR ', $combinaisons);
190
 
190
 
191
		$requete = "DELETE FROM {$this->table_liaison} ".
191
		$requete = "DELETE FROM {$this->table_liaison} ".
192
			"WHERE $clauseWhere ".
192
			"WHERE $clauseWhere ".
193
			' -- '.__FILE__.':'.__LINE__;
193
			' -- '.__FILE__.':'.__LINE__;
194
 
194
 
195
		$suppression = Cel::db()->executer($requete);
195
		$suppression = Cel::db()->executer($requete);
196
		return $suppression;
196
		return $suppression;
197
	}
197
	}
198
 
198
 
199
	public function supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lies) {
199
	public function supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lies) {
200
		$idsElementsLiesP = Cel::db()->proteger($ids_elements_lies);
200
		$idsElementsLiesP = Cel::db()->proteger($ids_elements_lies);
201
		$listeIds = implode(',', $idsElementsLiesP);
201
		$listeIds = implode(',', $idsElementsLiesP);
202
 
202
 
203
		$requete = "DELETE FROM {$this->table_liaison} ".
203
		$requete = "DELETE FROM {$this->table_liaison} ".
204
			"WHERE id_element_lie IN ($listeIds) ".
204
			"WHERE id_element_lie IN ($listeIds) ".
205
			' -- '.__FILE__.':'.__LINE__;
205
			' -- '.__FILE__.':'.__LINE__;
206
 
206
 
207
		$suppression = Cel::db()->executer($requete);
207
		$suppression = Cel::db()->executer($requete);
208
		$suppression = ($suppression !== false) ? true : false;
208
		$suppression = ($suppression !== false) ? true : false;
209
		return $suppression;
209
		return $suppression;
210
	}
210
	}
211
 
211
 
212
	public function supprimerToutesLiaisonsIdsMotsCles($ids_mots_cles, $id_utilisateur) {
212
	public function supprimerToutesLiaisonsIdsMotsCles($ids_mots_cles, $id_utilisateur) {
213
		$suppression = true;
213
		$suppression = true;
214
		if (!empty($ids_mots_cles)) {
214
		if (!empty($ids_mots_cles)) {
215
			$idsMotsClesP = Cel::db()->proteger($ids_mots_cles);
215
			$idsMotsClesP = Cel::db()->proteger($ids_mots_cles);
216
			$listeIds = implode(',', $idsMotsClesP);
216
			$listeIds = implode(',', $idsMotsClesP);
217
 
217
 
218
			$requete = "DELETE FROM {$this->table_liaison} ".
218
			$requete = "DELETE FROM {$this->table_liaison} ".
219
				"WHERE id_mot_cle IN ($listeIds) ".
219
				"WHERE id_mot_cle IN ($listeIds) ".
220
				' -- '.__FILE__.':'.__LINE__;
220
				' -- '.__FILE__.':'.__LINE__;
221
 
221
 
222
			$suppression = Cel::db()->executer($requete);
222
			$suppression = Cel::db()->executer($requete);
223
			$suppression = ($suppression !== false) ? true : false;
223
			$suppression = ($suppression !== false) ? true : false;
224
		}
224
		}
225
		return $suppression;
225
		return $suppression;
226
	}
226
	}
227
 
227
 
228
	/**
228
	/**
229
	 * Supprime toutes les laisons pour un utilisateur et un mot clé (au sens textuel) donnés.
229
	 * Supprime toutes les laisons pour un utilisateur et un mot clé (au sens textuel) donnés.
230
	 *
230
	 *
231
	 */
231
	 */
232
	public function supprimerLiaisonPourMotCleEtIdElementLie($mot_cle, $id_element_lie, $id_utilisateur) {
232
	public function supprimerLiaisonPourMotCleEtIdElementLie($mot_cle, $id_element_lie, $id_utilisateur) {
233
		$idElementLieP = Cel::db()->proteger($id_element_lie);
233
		$idElementLieP = Cel::db()->proteger($id_element_lie);
234
		$motCleP = Cel::db()->proteger($mot_cle);
234
		$motCleP = Cel::db()->proteger($mot_cle);
235
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
235
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
236
 
236
 
237
		$sousRequete = "SELECT id_mot_cle FROM {$this->table_mots_cles} ".
237
		$sousRequete = "SELECT id_mot_cle FROM {$this->table_mots_cles} ".
238
			"WHERE mot_cle = $motCleP ".
238
			"WHERE mot_cle = $motCleP ".
239
			"AND id_utilisateur = $idUtilisateurP ";
239
			"AND id_utilisateur = $idUtilisateurP ";
240
		$requete = "DELETE FROM {$this->table_liaison} ".
240
		$requete = "DELETE FROM {$this->table_liaison} ".
241
			"WHERE id_element_lie = $idElementLieP ".
241
			"WHERE id_element_lie = $idElementLieP ".
242
			"AND id_mot_cle IN ($sousRequete) ".
242
			"AND id_mot_cle IN ($sousRequete) ".
243
			' -- '.__FILE__.':'.__LINE__;
243
			' -- '.__FILE__.':'.__LINE__;
244
 
244
 
245
		$suppression_liaison = Cel::db()->executer($requete);
245
		$suppression_liaison = Cel::db()->executer($requete);
246
		$suppression_liaison = ($suppression_liaison !== false);
246
		$suppression_liaison = ($suppression_liaison !== false);
247
 
247
 
248
		return $suppression_liaison;
248
		return $suppression_liaison;
249
	}
249
	}
250
 
250
 
251
	public function renommerMotCle($id_mot_cle, $nouveau_nom) {
251
	public function renommerMotCle($id_mot_cle, $nouveau_nom) {
252
		$nouveauNomSimple = self::simplifier($nouveau_nom);
252
		$nouveauNomSimple = self::simplifier($nouveau_nom);
253
		$nouveauNomSimpleP = Cel::db()->proteger($nouveauNomSimple);
253
		$nouveauNomSimpleP = Cel::db()->proteger($nouveauNomSimple);
254
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
254
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
255
 
255
 
256
		$requete = 'SELECT chemin, id_utilisateur '.
256
		$requete = 'SELECT chemin, id_utilisateur '.
257
			"FROM {$this->table_mots_cles} ".
257
			"FROM {$this->table_mots_cles} ".
258
			"WHERE id_mot_cle = $idMotCleP ".
258
			"WHERE id_mot_cle = $idMotCleP ".
259
			' -- '.__FILE__.':'.__LINE__;
259
			' -- '.__FILE__.':'.__LINE__;
260
		$ancienCheminInfos = Cel::db()->requeter($requete);
260
		$ancienCheminInfos = Cel::db()->requeter($requete);
261
 
261
 
262
		$ancienChemin = $ancienCheminInfos[0]['chemin'];
262
		$ancienChemin = $ancienCheminInfos[0]['chemin'];
263
		$id_utilisateur = $ancienCheminInfos[0]['id_utilisateur'];
263
		$id_utilisateur = $ancienCheminInfos[0]['id_utilisateur'];
264
 
264
 
265
		$cheminDecompo = explode('/', $ancienChemin);
265
		$cheminDecompo = explode('/', $ancienChemin);
266
		// le dernier élément du tableau est vide (à cause du / terminal)
266
		// le dernier élément du tableau est vide (à cause du / terminal)
267
		// c'est également le cas pour le premier (à cause du / qui commence le chemin)
267
		// c'est également le cas pour le premier (à cause du / qui commence le chemin)
268
		$cheminDecompo[count($cheminDecompo) - 2] = $nouveauNomSimple;
268
		$cheminDecompo[count($cheminDecompo) - 2] = $nouveauNomSimple;
269
		$nouveauChemin = implode('/', $cheminDecompo);
269
		$nouveauChemin = implode('/', $cheminDecompo);
270
 
270
 
271
		$requete = "UPDATE {$this->table_mots_cles} ".
271
		$requete = "UPDATE {$this->table_mots_cles} ".
272
			"SET mot_cle = $nouveauNomSimpleP ".
272
			"SET mot_cle = $nouveauNomSimpleP ".
273
			"WHERE id_mot_cle = $idMotCleP ".
273
			"WHERE id_mot_cle = $idMotCleP ".
274
			' -- '.__FILE__.':'.__LINE__;
274
			' -- '.__FILE__.':'.__LINE__;
275
 
275
 
276
		$renommage = Cel::db()->executer($requete);
276
		$renommage = Cel::db()->executer($requete);
277
		$this->renommerChemin($ancienChemin, $nouveauChemin, $id_utilisateur);
277
		$this->renommerChemin($ancienChemin, $nouveauChemin, $id_utilisateur);
278
 
278
 
279
		$idsElementsLies = $this->obtenirIdElementsLiesPourIds(array($id_mot_cle));
279
		$idsElementsLies = $this->obtenirIdElementsLiesPourIds(array($id_mot_cle));
280
		foreach ($idsElementsLies as $idElementLie) {
280
		foreach ($idsElementsLies as $idElementLie) {
281
			self::regenererIndexTexteMotCle($idElementLie['id_element_lie'], $this->mode);
281
			self::regenererIndexTexteMotCle($idElementLie['id_element_lie'], $this->mode);
282
		}
282
		}
283
 
283
 
284
		return $renommage;
284
		return $renommage;
285
	}
285
	}
286
 
286
 
287
	/**
287
	/**
288
	 * Si aucun id_père n'est mentionné, c'est un déplacement vers la racine de l'arbre (qui n'existe pas).
288
	 * Si aucun id_père n'est mentionné, c'est un déplacement vers la racine de l'arbre (qui n'existe pas).
289
	 */
289
	 */
290
	public function deplacerMotCle($id_mot_cle, $id_pere, $id_utilisateur) {
290
	public function deplacerMotCle($id_mot_cle, $id_pere, $id_utilisateur) {
291
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
291
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
292
		$idPereP = Cel::db()->proteger($id_pere);
292
		$idPereP = Cel::db()->proteger($id_pere);
293
		$cheminPere = '';
293
		$cheminPere = '';
294
 
294
 
295
		if ($id_pere != '') {
295
		if ($id_pere != '') {
296
			$requete = 'SELECT chemin '.
296
			$requete = 'SELECT chemin '.
297
				"FROM {$this->table_mots_cles} ".
297
				"FROM {$this->table_mots_cles} ".
298
				"WHERE id_mot_cle = $idPereP ".
298
				"WHERE id_mot_cle = $idPereP ".
299
				' -- '.__FILE__.':'.__LINE__;
299
				' -- '.__FILE__.':'.__LINE__;
300
 
300
 
301
			$cheminPereInfos = Cel::db()->requeter($requete);
301
			$cheminPereInfos = Cel::db()->requeter($requete);
302
			if (!empty($cheminPereInfos)) {
302
			if (!empty($cheminPereInfos)) {
303
				$cheminPere = $cheminPereInfos[0]['chemin'];
303
				$cheminPere = $cheminPereInfos[0]['chemin'];
304
			}
304
			}
305
		}
305
		}
306
 
306
 
307
		$requete = 'SELECT chemin, mot_cle '.
307
		$requete = 'SELECT chemin, mot_cle '.
308
			"FROM {$this->table_mots_cles} ".
308
			"FROM {$this->table_mots_cles} ".
309
			"WHERE id_mot_cle = $idMotCleP ".
309
			"WHERE id_mot_cle = $idMotCleP ".
310
			' -- '.__FILE__.':'.__LINE__;
310
			' -- '.__FILE__.':'.__LINE__;
311
		$infosMotCle = Cel::db()->requeter($requete);
311
		$infosMotCle = Cel::db()->requeter($requete);
312
		$ancienChemin = $infosMotCle[0]['chemin'];
312
		$ancienChemin = $infosMotCle[0]['chemin'];
313
		$ancienMotCle = $infosMotCle[0]['mot_cle'];
313
		$ancienMotCle = $infosMotCle[0]['mot_cle'];
314
 
314
 
315
		$nouveauChemin = $cheminPere.'/'.$ancienMotCle;
315
		$nouveauChemin = $cheminPere.'/'.$ancienMotCle;
316
 
316
 
317
		return $this->renommerChemin($ancienChemin, $nouveauChemin, $id_utilisateur);
317
		return $this->renommerChemin($ancienChemin, $nouveauChemin, $id_utilisateur);
318
	}
318
	}
319
 
319
 
320
	public function renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur) {
320
	public function renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur) {
321
		$ancienCheminHarmonise = self::harmoniserChemin($ancien_chemin);
321
		$ancienCheminHarmonise = self::harmoniserChemin($ancien_chemin);
322
		$nouveauCheminHarmonise = self::harmoniserChemin($nouveau_chemin);
322
		$nouveauCheminHarmonise = self::harmoniserChemin($nouveau_chemin);
323
 
323
 
324
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
324
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
325
		$ancienCheminP = Cel::db()->proteger($ancienCheminHarmonise);
325
		$ancienCheminP = Cel::db()->proteger($ancienCheminHarmonise);
326
		$nouveauCheminP = Cel::db()->proteger($nouveauCheminHarmonise);
326
		$nouveauCheminP = Cel::db()->proteger($nouveauCheminHarmonise);
327
		$conditionCheminP = Cel::db()->proteger($ancienCheminHarmonise.'%');
327
		$conditionCheminP = Cel::db()->proteger($ancienCheminHarmonise.'%');
328
 
328
 
329
		$requete = "UPDATE {$this->table_mots_cles} ".
329
		$requete = "UPDATE {$this->table_mots_cles} ".
330
			"SET chemin = REPLACE(chemin, $ancienCheminP, $nouveauCheminP) ".
330
			"SET chemin = REPLACE(chemin, $ancienCheminP, $nouveauCheminP) ".
331
			"WHERE chemin LIKE $conditionCheminP ".
331
			"WHERE chemin LIKE $conditionCheminP ".
332
			"AND id_utilisateur = $idUtilisateurP ".
332
			"AND id_utilisateur = $idUtilisateurP ".
333
			' -- '.__FILE__.':'.__LINE__;
333
			' -- '.__FILE__.':'.__LINE__;
334
 
334
 
335
		return Cel::db()->executer($requete);
335
		return Cel::db()->executer($requete);
336
	}
336
	}
337
 
337
 
338
	public function supprimerChemin($chemin, $id_utilisateur) {
338
	public function supprimerChemin($chemin, $id_utilisateur) {
339
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
339
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
340
		$cheminP = Cel::db()->proteger($chemin.'%');
340
		$cheminP = Cel::db()->proteger($chemin.'%');
341
		// TODO : triggers pour les tables liées ?
341
		// TODO : triggers pour les tables liées ?
342
		$requete = "DELETE FROM {$this->$table_mots_cles} ".
342
		$requete = "DELETE FROM {$this->$table_mots_cles} ".
343
			"WHERE chemin LIKE $cheminP ".
343
			"WHERE chemin LIKE $cheminP ".
344
			"AND id_utilisateur = $idUtilisateurP ".
344
			"AND id_utilisateur = $idUtilisateurP ".
345
			' -- '.__FILE__.':'.__LINE__;
345
			' -- '.__FILE__.':'.__LINE__;
346
 
346
 
347
		return Cel::db()->executer($requete);
347
		return Cel::db()->executer($requete);
348
	}
348
	}
349
 
349
 
350
	/**
350
	/**
351
	 * suppression des associations du mots clé aux images ou obs, mais aussi des associations de ses enfants
351
	 * suppression des associations du mots clé aux images ou obs, mais aussi des associations de ses enfants
352
	 * (car ceux-ci seront supprimés aussi dans le processus)
352
	 * (car ceux-ci seront supprimés aussi dans le processus)
353
	 * même s'il n'a pas d'enfants, le tableau contient au moins l'id du mot clé lui même
353
	 * même s'il n'a pas d'enfants, le tableau contient au moins l'id du mot clé lui même
354
	 */
354
	 */
355
	public function supprimerMotCleParId($id_mot_cle, $id_utilisateur) {
355
	public function supprimerMotCleParId($id_mot_cle, $id_utilisateur) {
356
		//TODO: simplifier cette fonction
356
		//TODO: simplifier cette fonction
357
		$ids_mot_cle_et_enfants = $this->obtenirIdsMotsClesParIdParent($id_utilisateur, $id_mot_cle);
357
		$ids_mot_cle_et_enfants = $this->obtenirIdsMotsClesParIdParent($id_utilisateur, $id_mot_cle);
358
 
358
 
359
		// obtention des ids des éléments liés au mot clé ainsi qu'à ces enfants (afin de pouvoir
359
		// obtention des ids des éléments liés au mot clé ainsi qu'à ces enfants (afin de pouvoir
360
		// régénérer les index texte de mots clés sur les éléments liés)
360
		// régénérer les index texte de mots clés sur les éléments liés)
361
		$ids_a_delier = array();
361
		$ids_a_delier = array();
362
		foreach ($ids_mot_cle_et_enfants as $id) {
362
		foreach ($ids_mot_cle_et_enfants as $id) {
363
			$ids_a_delier[] = $id['id_mot_cle'];
363
			$ids_a_delier[] = $id['id_mot_cle'];
364
		}
364
		}
365
 
365
 
366
		$ids_elements_lies = $this->obtenirIdElementsLiesPourIds($ids_a_delier);
366
		$ids_elements_lies = $this->obtenirIdElementsLiesPourIds($ids_a_delier);
367
		$suppression_liaison = $this->supprimerToutesLiaisonsIdsMotsCles($ids_a_delier, $id_utilisateur);
367
		$suppression_liaison = $this->supprimerToutesLiaisonsIdsMotsCles($ids_a_delier, $id_utilisateur);
368
 
368
 
369
		foreach ($ids_elements_lies as $id_element_lie) {
369
		foreach ($ids_elements_lies as $id_element_lie) {
370
			self::regenererIndexTexteMotCle($id_element_lie['id_element_lie'], $this->mode);
370
			self::regenererIndexTexteMotCle($id_element_lie['id_element_lie'], $this->mode);
371
		}
371
		}
372
 
372
 
373
		// suppression du mot clé proprement dit ainsi que de ses enfants
373
		// suppression du mot clé proprement dit ainsi que de ses enfants
374
		$suppression = $this->supprimerMotCleEtEnfantsParId($id_mot_cle, $id_utilisateur);
374
		$suppression = $this->supprimerMotCleEtEnfantsParId($id_mot_cle, $id_utilisateur);
375
 
375
 
376
		return $suppression && $suppression_liaison;
376
		return $suppression && $suppression_liaison;
377
	}
377
	}
378
 
378
 
379
	public function supprimerMotCleEtEnfantsParId($id_mot_cle, $id_utilisateur) {
379
	public function supprimerMotCleEtEnfantsParId($id_mot_cle, $id_utilisateur) {
380
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
380
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
381
		$requete = 'SELECT chemin '.
381
		$requete = 'SELECT chemin '.
382
			"FROM {$this->table_mots_cles} ".
382
			"FROM {$this->table_mots_cles} ".
383
			"WHERE id_mot_cle = $idMotCleP ".
383
			"WHERE id_mot_cle = $idMotCleP ".
384
			' -- '.__FILE__.':'.__LINE__;
384
			' -- '.__FILE__.':'.__LINE__;
385
		$chemin = Cel::db()->requeter($requete);
385
		$chemin = Cel::db()->requeter($requete);
386
 
386
 
387
		$suppression = true;
387
		$suppression = true;
388
		// vérification pour empecher la suppression accidentelle de tout l'arbre,
388
		// vérification pour empecher la suppression accidentelle de tout l'arbre,
389
		// cas qui ne devrait jamais arriver normalement
389
		// cas qui ne devrait jamais arriver normalement
390
		if (!empty($chemin) && $chemin != '/') {
390
		if (!empty($chemin) && $chemin != '/') {
391
			$chemin = $chemin[0]['chemin'];
391
			$chemin = $chemin[0]['chemin'];
392
			$cheminP = Cel::db()->proteger($chemin.'%');
392
			$cheminP = Cel::db()->proteger($chemin.'%');
393
			$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
393
			$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
394
 
394
 
395
			$requete = "DELETE FROM {$this->table_mots_cles} ".
395
			$requete = "DELETE FROM {$this->table_mots_cles} ".
396
				"WHERE chemin LIKE $cheminP ".
396
				"WHERE chemin LIKE $cheminP ".
397
				"AND id_utilisateur = $idUtilisateurP ".
397
				"AND id_utilisateur = $idUtilisateurP ".
398
				' -- '.__FILE__.':'.__LINE__;;
398
				' -- '.__FILE__.':'.__LINE__;;
399
 
399
 
400
			$suppression = Cel::db()->executer($requete);
400
			$suppression = Cel::db()->executer($requete);
401
		}
401
		}
402
 
402
 
403
		return ($suppression !== false);
403
		return ($suppression !== false);
404
 
404
 
405
	}
405
	}
406
 
406
 
407
	public function obtenirIdsMotClesPourMotsCles($mots_cles, $id_utilisateur) {
407
	public function obtenirIdsMotClesPourMotsCles($mots_cles, $id_utilisateur) {
408
		$motsClesP = Cel::db()->proteger($mots_cles);
408
		$motsClesP = Cel::db()->proteger($mots_cles);
409
		$listeMotsClesP = implode(',', $motsClesP);
409
		$listeMotsClesP = implode(',', $motsClesP);
410
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
410
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
411
 
411
 
412
		$requete = 'SELECT id_mot_cle, mot_cle '.
412
		$requete = 'SELECT id_mot_cle, mot_cle '.
413
			"FROM {$this->table_mots_cles} ".
413
			"FROM {$this->table_mots_cles} ".
414
			"WHERE mot_cle IN ($listeMotsClesP) ".
414
			"WHERE mot_cle IN ($listeMotsClesP) ".
415
			"AND id_utilisateur = $idUtilisateurP ".
415
			"AND id_utilisateur = $idUtilisateurP ".
416
			' -- '.__FILE__.':'.__LINE__;
416
			' -- '.__FILE__.':'.__LINE__;
417
 
417
 
418
		$resultat = Cel::db()->executer($requete);
418
		$resultat = Cel::db()->executer($requete);
419
		return $resultat;
419
		return $resultat;
420
	}
420
	}
421
 
421
 
422
	public function obtenirIdElementsLiesPourChemins($chemins, $id_utilisateur) {
422
	public function obtenirIdElementsLiesPourChemins($chemins, $id_utilisateur) {
423
		foreach ($chemins as &$chemin) {
423
		foreach ($chemins as &$chemin) {
424
			$chemin = Cel::db()->proteger(self::harmoniserChemin($chemin));
424
			$chemin = Cel::db()->proteger(self::harmoniserChemin($chemin));
425
		}
425
		}
426
		$listeChemins = implode(',', $chemin);
426
		$listeChemins = implode(',', $chemin);
427
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
427
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
428
 
428
 
429
		$requete = 'SELECT id_element_lie '.
429
		$requete = 'SELECT id_element_lie '.
430
			"FROM {$this->table_liaison} AS cl INNER JOIN {$this->table_mots_cles} AS cm ".
430
			"FROM {$this->table_liaison} AS cl INNER JOIN {$this->table_mots_cles} AS cm ".
431
			"ON (".
431
			"ON (".
432
				"cm.id_mot_cle = cl.id_mot_cle ".
432
				"cm.id_mot_cle = cl.id_mot_cle ".
433
				"AND chemin IN ($listeChemins) ".
433
				"AND chemin IN ($listeChemins) ".
434
				"AND cm.id_utilisateur = $idUtilisateurP ".
434
				"AND cm.id_utilisateur = $idUtilisateurP ".
435
			") ".
435
			") ".
436
			' -- '.__FILE__.':'.__LINE__;
436
			' -- '.__FILE__.':'.__LINE__;
437
 
437
 
438
		$idsPourChemin = Cel::db()->executer($requete);
438
		$idsPourChemin = Cel::db()->executer($requete);
439
 
439
 
440
		return $idsPourChemin;
440
		return $idsPourChemin;
441
	}
441
	}
442
 
442
 
443
	public function obtenirIdElementsLiesPourIds($ids_mots_cles) {
443
	public function obtenirIdElementsLiesPourIds($ids_mots_cles) {
444
		$idsElementsLies = array();
444
		$idsElementsLies = array();
445
		if (!empty($ids_mots_cles)) {
445
		if (!empty($ids_mots_cles)) {
446
			$idsMotsClesP = Cel::db()->proteger($ids_mots_cles);
446
			$idsMotsClesP = Cel::db()->proteger($ids_mots_cles);
447
			$listeIdsMotsCles = implode(',', $idsMotsClesP);
447
			$listeIdsMotsCles = implode(',', $idsMotsClesP);
448
 
448
 
449
			$requete = 'SELECT id_element_lie '.
449
			$requete = 'SELECT id_element_lie '.
450
				"FROM {$this->table_liaison} ".
450
				"FROM {$this->table_liaison} ".
451
				"WHERE id_mot_cle IN ($listeIdsMotsCles) ".
451
				"WHERE id_mot_cle IN ($listeIdsMotsCles) ".
452
				' -- '.__FILE__.':'.__LINE__;
452
				' -- '.__FILE__.':'.__LINE__;
453
 
453
 
454
 
454
 
455
			$idsElementsLies = Cel::db()->requeter($requete);
455
			$idsElementsLies = Cel::db()->requeter($requete);
456
		}
456
		}
457
		return $idsElementsLies;
457
		return $idsElementsLies;
458
	}
458
	}
459
 
459
 
460
	/**
460
	/**
461
	 *
461
	 *
462
	 * Fonctions statiques utilitaires
462
	 * Fonctions statiques utilitaires
463
	 * (Dans l'idéal toute la classe pourrait être statique car elle n'a
463
	 * (Dans l'idéal toute la classe pourrait être statique car elle n'a
464
	 * pas d'état (mais il faudrait passer $mode à toutes les fonctions)
464
	 * pas d'état (mais il faudrait passer $mode à toutes les fonctions)
465
	 *
465
	 *
466
	 */
466
	 */
467
	public static function getTablesMotsClesEtLiaisons($mode) {
467
	public static function getTablesMotsClesEtLiaisons($mode) {
468
		if ($mode == 'obs') {
468
		if ($mode == 'obs') {
469
			$table_liaison = 'cel_mots_cles_obs_liaison';
469
			$table_liaison = 'cel_mots_cles_obs_liaison';
470
			$table_mots_cles = 'cel_arbre_mots_cles_obs';
470
			$table_mots_cles = 'cel_arbre_mots_cles_obs';
471
		} else {
471
		} else {
472
			$table_liaison = 'cel_mots_cles_images_liaison';
472
			$table_liaison = 'cel_mots_cles_images_liaison';
473
			$table_mots_cles = 'cel_arbre_mots_cles_images';
473
			$table_mots_cles = 'cel_arbre_mots_cles_images';
474
		}
474
		}
475
		return array($table_liaison, $table_mots_cles);
475
		return array($table_liaison, $table_mots_cles);
476
	}
476
	}
477
 
477
 
478
	public static function regenererIndexTexteMotCle($id_element_lie, $mode) {
478
	public static function regenererIndexTexteMotCle($id_element_lie, $mode) {
479
		$idElementLieP = Cel::db()->proteger($id_element_lie);
479
		$idElementLieP = Cel::db()->proteger($id_element_lie);
480
		$sqlTpl = self::obtenirTemplateRequeteMotsClesTexte($mode);
480
		$sqlTpl = self::obtenirTemplateRequeteMotsClesTexte($mode);
481
		$sousRequete = sprintf($sqlTpl, $idElementLieP);
481
		$sousRequete = sprintf($sqlTpl, $idElementLieP);
482
 
482
 
483
		list($table, $champId) = self::getNomTablesEtChampsElementsLies($mode);
483
		list($table, $champId) = self::getNomTablesEtChampsElementsLies($mode);
484
		$requete = "UPDATE $table ".
484
		$requete = "UPDATE $table ".
485
			"SET mots_cles_texte = ($sousRequete) ".
485
			"SET mots_cles_texte = ($sousRequete) ".
486
			"WHERE $champId = $idElementLieP ".
486
			"WHERE $champId = $idElementLieP ".
487
			' -- '.__FILE__.':'.__LINE__;
487
			' -- '.__FILE__.':'.__LINE__;
488
 
488
 
489
		return Cel::db()->executer($requete);
489
		return Cel::db()->executer($requete);
490
	}
490
	}
491
 
491
 
492
	private static function getNomTablesEtChampsElementsLies($mode) {
492
	private static function getNomTablesEtChampsElementsLies($mode) {
493
		$tables = array();
493
		$tables = array();
494
		if ($mode == 'obs') {
494
		if ($mode == 'obs') {
495
			$tables = array('cel_obs', 'id_observation');
495
			$tables = array('cel_obs', 'id_observation');
496
		} else {
496
		} else {
497
			$tables = array('cel_images', 'id_image');
497
			$tables = array('cel_images', 'id_image');
498
		}
498
		}
499
		return $tables;
499
		return $tables;
500
	}
500
	}
501
 
501
 
502
	/**
502
	/**
503
	 * Renvoie un template de requete pour selectionner la concatenation de mots clé
503
	 * Renvoie un template de requete pour selectionner la concatenation de mots clé
504
	 * pour un element donné (utilisable avec sprintf)
504
	 * pour un element donné (utilisable avec sprintf)
505
	 */
505
	 */
506
	public static function obtenirTemplateRequeteMotsClesTexte($mode) {
506
	public static function obtenirTemplateRequeteMotsClesTexte($mode) {
507
		list($table_liaison, $table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
507
		list($table_liaison, $table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
508
 
508
 
509
		$requeteTpl = 'SELECT GROUP_CONCAT(mot_cle) '.
509
		$requeteTpl = 'SELECT GROUP_CONCAT(mot_cle) '.
510
			"FROM $table_mots_cles AS cm ".
510
			"FROM $table_mots_cles AS cm ".
511
			"INNER JOIN $table_liaison AS cml ON cml.id_mot_cle = cm.id_mot_cle ".
511
			"INNER JOIN $table_liaison AS cml ON cml.id_mot_cle = cm.id_mot_cle ".
512
			'AND cml.id_element_lie = %s ';
512
			'AND cml.id_element_lie = %s ';
513
 
513
 
514
		return $requeteTpl;
514
		return $requeteTpl;
515
	}
515
	}
516
	/**
516
	/**
517
	* Renvoie un template de recherche sur les ids de mots clés utilisables avec sprintf.
517
	* Renvoie un template de recherche sur les ids de mots clés utilisables avec sprintf.
518
	*/
518
	*/
519
	public static function obtenirTemplateRequeteMotsClesIds($mode) {
519
	public static function obtenirTemplateRequeteMotsClesIds($mode) {
520
		list($table_liaison, $table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
520
		list($table_liaison, $table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
521
		$requeteTpl = "SELECT id_element_lie FROM $table_liaison WHERE id_mot_cle IN (%s) ";
521
		$requeteTpl = "SELECT id_element_lie FROM $table_liaison WHERE id_mot_cle IN (%s) ";
522
		return $requeteTpl;
522
		return $requeteTpl;
523
	}
523
	}
524
 
524
 
525
	// Fonctions utilitaires
525
	// Fonctions utilitaires
526
 
526
 
527
	/**
527
	/**
528
	 * La profondeur d'un noeud est déterminée par le nombre de slashs
528
	 * La profondeur d'un noeud est déterminée par le nombre de slashs
529
	 * qu'il contient (étant donné que ceux ci sont interdits dans le texte du mot clé.
529
	 * qu'il contient (étant donné que ceux ci sont interdits dans le texte du mot clé.
530
	 */
530
	 */
531
	static public function comparerProfNoeuds($a, $b) {
531
	static public function comparerProfNoeuds($a, $b) {
532
		$nb_slashs_a = substr_count($a['chemin'], '/');
532
		$nb_slashs_a = substr_count($a['chemin'], '/');
533
		$nb_slashs_b = substr_count($a['chemin'], '/');
533
		$nb_slashs_b = substr_count($a['chemin'], '/');
534
		$cmp = 0;
534
		$cmp = 0;
535
 
535
 
536
		if ($nb_slashs_a == $nb_slashs_b) {
536
		if ($nb_slashs_a == $nb_slashs_b) {
537
			$cmp = strcmp($a['chemin'], $b['chemin']);
537
			$cmp = strcmp($a['chemin'], $b['chemin']);
538
		} else {
538
		} else {
539
			$cmp = ($a['chemin'] > $b['chemin']) ? +1 : -1;
539
			$cmp = ($a['chemin'] > $b['chemin']) ? +1 : -1;
540
		}
540
		}
541
		return $cmp;
541
		return $cmp;
542
	}
542
	}
543
 
543
 
544
	static public function getCheminHarmonise($chemin_parent, $mot_cle) {
544
	static public function getCheminHarmonise($chemin_parent, $mot_cle) {
545
		return self::harmoniserChemin($chemin_parent.'/'.self::simplifier($mot_cle).'/');
545
		return self::harmoniserChemin($chemin_parent.'/'.self::simplifier($mot_cle).'/');
546
	}
546
	}
547
 
547
 
548
	static public function harmoniserChemin($chemin) {
548
	static public function harmoniserChemin($chemin) {
549
		$chemin = self::startsWith($chemin,'/') ? $chemin : '/'.$chemin;
549
		$chemin = self::startsWith($chemin,'/') ? $chemin : '/'.$chemin;
550
		$chemin = self::endsWith($chemin,'/') ? $chemin : $chemin.'/';
550
		$chemin = self::endsWith($chemin,'/') ? $chemin : $chemin.'/';
551
		$chemin = str_replace('//', '/', $chemin);
551
		$chemin = str_replace('//', '/', $chemin);
552
		// mise en minuscule du chemin afin d'éviter des cas où l'on aurait 
552
		// mise en minuscule du chemin afin d'éviter des cas où l'on aurait 
553
		// des même mots clés avec minuscule et majuscule
553
		// des même mots clés avec minuscule et majuscule
554
		$chemin = strtolower($chemin);
554
		$chemin = strtolower($chemin);
555
		return $chemin;
555
		return $chemin;
556
	}
556
	}
557
 
557
 
558
	/**
558
	/**
559
	 * Fonction de slugification du mot clé
559
	 * Fonction de slugification du mot clé
560
	 *
560
	 *
561
	 * Ni slashes ou antislashes ou virgules (ce qui fausserait l'arbre ou bien les mots
561
	 * Ni slashes ou antislashes ou virgules (ce qui fausserait l'arbre ou bien les mots
562
	 * clés texte dans les tables obs ou image)
562
	 * clés texte dans les tables obs ou image)
563
	 */
563
	 */
564
	static public function simplifier($text) {
564
	static public function simplifier($text) {
565
		$caracteresASupprimer = array('\\','/', ',');
565
		$caracteresASupprimer = array('\\','/', ',');
566
		$text = str_replace($caracteresASupprimer, '', $text);
566
		$text = str_replace($caracteresASupprimer, '', $text);
567
		$text = strtolower(trim($text));
567
		$text = trim($text);
568
		return $text;
568
		return $text;
569
	}
569
	}
570
 
570
 
571
	/**
571
	/**
572
	 * Gardée pour compatibilité ancienne version (mais devrait être supprimée
572
	 * Gardée pour compatibilité ancienne version (mais devrait être supprimée
573
	 * dans le futur
573
	 * dans le futur
574
	 */
574
	 */
575
	static function nettoyerMotsClesAvantSuppression($chaine) {
575
	static function nettoyerMotsClesAvantSuppression($chaine) {
576
		$valeur = str_replace('null', '', $chaine);
576
		$valeur = str_replace('null', '', $chaine);
577
		$valeur = trim($valeur, ';;');
577
		$valeur = trim($valeur, ';;');
578
		return $valeur;
578
		return $valeur;
579
	}
579
	}
580
 
580
 
581
	static public function startsWith($haystack, $needle) {
581
	static public function startsWith($haystack, $needle) {
582
		return $needle === '' || strpos($haystack, $needle) === 0;
582
		return $needle === '' || strpos($haystack, $needle) === 0;
583
	}
583
	}
584
 
584
 
585
	static public function endsWith($haystack, $needle) {
585
	static public function endsWith($haystack, $needle) {
586
		return $needle === '' || substr($haystack, -strlen($needle)) === $needle;
586
		return $needle === '' || substr($haystack, -strlen($needle)) === $needle;
587
	}
587
	}
588
 
588
 
589
	/**
589
	/**
590
	* Fonction utilisée pour importer les anciens mots clés saisis dans les widget dans un compte identifié
590
	* Fonction utilisée pour importer les anciens mots clés saisis dans les widget dans un compte identifié
591
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
591
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
592
	* @param string $mail_utilisateur
592
	* @param string $mail_utilisateur
593
	* @param string $id_utilisateur
593
	* @param string $id_utilisateur
594
	*/
594
	*/
595
	public static function migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur) {
595
	public static function migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur) {
596
		return self::migrerLiaisonEtMotsCles($mail_utilisateur, $infos_utilisateur, 'obs') &&
596
		return self::migrerLiaisonEtMotsCles($mail_utilisateur, $infos_utilisateur, 'obs') &&
597
				self::migrerLiaisonEtMotsCles($mail_utilisateur, $infos_utilisateur, 'images');
597
				self::migrerLiaisonEtMotsCles($mail_utilisateur, $infos_utilisateur, 'images');
598
	}
598
	}
599
 
599
 
600
	/**
600
	/**
601
	 * ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
601
	 * ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
602
	 * avec l'identifiant $id_utilisateur ce qui est normalement le cas
602
	 * avec l'identifiant $id_utilisateur ce qui est normalement le cas
603
	 * ça devrait normalement marcher correctement même s'il en a déjà mais ça n'a pas été testé
603
	 * ça devrait normalement marcher correctement même s'il en a déjà mais ça n'a pas été testé
604
	 */
604
	 */
605
	private static function migrerLiaisonEtMotsCles($email_utilisateur, $infos_utilisateur, $mode) {
605
	private static function migrerLiaisonEtMotsCles($email_utilisateur, $infos_utilisateur, $mode) {
606
		list($table_liaisons, $table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
606
		list($table_liaisons, $table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
607
		$idUtilisateurP = Cel::db()->proteger($infos_utilisateur['id_utilisateur']);
607
		$idUtilisateurP = Cel::db()->proteger($infos_utilisateur['id_utilisateur']);
608
		$emailUtilisateurP = Cel::db()->proteger($email_utilisateur);
608
		$emailUtilisateurP = Cel::db()->proteger($email_utilisateur);
609
 
609
 
610
		$requete_migration_mc = "UPDATE {$table_mots_cles} ".
610
		$requete_migration_mc = "UPDATE {$table_mots_cles} ".
611
			"SET id_utilisateur = $idUtilisateurP ".
611
			"SET id_utilisateur = $idUtilisateurP ".
612
			"WHERE id_utilisateur = $emailUtilisateurP ";
612
			"WHERE id_utilisateur = $emailUtilisateurP ";
613
 
613
 
614
		$migration = Cel::db()->executer($requete_migration_mc);
614
		$migration = Cel::db()->executer($requete_migration_mc);
615
		$migration = ($migration !== false) ? true : false;
615
		$migration = ($migration !== false) ? true : false;
616
		return $migration;
616
		return $migration;
617
	}
617
	}
618
}
618
}
619
?>
619
?>