Subversion Repositories eFlore/Applications.cel

Rev

Rev 2085 | Rev 2111 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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