Subversion Repositories eFlore/Applications.cel

Rev

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

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