Subversion Repositories eFlore/Applications.cel

Rev

Rev 3473 | Rev 3506 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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