Subversion Repositories eFlore/Applications.cel

Rev

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

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