Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
2025 aurelien 1
<?php
2462 jpm 2
// declare(encoding='UTF-8');
2025 aurelien 3
/**
2462 jpm 4
 * Classe de liaison d'images et d'observation à des mots clés en utilisant la méthode path enumeration.
5
 *
6
 * @internal   Mininum PHP version : 5.2
7
 * @category   CEL
8
 * @package    Services
9
 * @subpackage Bibliothèques
10
 * @version    0.1
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 */
2025 aurelien 18
class GestionMotsClesChemin {
2101 jpm 19
 
2025 aurelien 20
	private $config;
21
	private $mode;
2101 jpm 22
 
2025 aurelien 23
	private $table_liaison;
24
	private $table_mots_cles;
3504 delphine 25
	private $id_mot_cle;
26
	private $id_element_lie;
2101 jpm 27
 
2032 aurelien 28
	//TODO: trigger pour les tables liaisons
2101 jpm 29
 
3473 killian 30
	public function __construct($config, $mode = 'obs') {
2025 aurelien 31
		$this->config = $config;
32
		//TODO: switch suivant mode
2027 aurelien 33
		$this->mode = $mode;
2101 jpm 34
 
3504 delphine 35
		list($this->table_liaison, $this->table_mots_cles, $this->id_mot_cle, $this->id_element_lie) = self::getTablesMotsClesEtLiaisons($mode);
2059 aurelien 36
	}
2101 jpm 37
 
38
 
39
 
3504 delphine 40
	public function obtenirIdsMotsClesParIdParent($user_id, $id_mot_cle) {
2101 jpm 41
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
3504 delphine 42
		$idUtilisateurP = Cel::db()->proteger($user_id);
2042 aurelien 43
 
3504 delphine 44
		$sousRequete = "SELECT path FROM {$this->table_mots_cles} WHERE $this->id_mot_cle = $idMotCleP ";
45
		$requete = "SELECT {$this->id_mot_cle} ".
2101 jpm 46
			"FROM {$this->table_mots_cles} ".
3504 delphine 47
			"WHERE path LIKE CONCAT(($sousRequete), '%') ".
48
			"AND user_id = $idUtilisateurP ".
2101 jpm 49
			' -- '.__FILE__.':'.__LINE__;
2462 jpm 50
		return Cel::db()->requeter($requete);
2042 aurelien 51
	}
2101 jpm 52
 
2241 mathias 53
	/**
54
	 * Retourne la liste des mots clés pour l'élément lié fourni. Ne tient pas compte de l'utilisateur
55
	 * car seul le propriétaire d'un élément lié peut y lier des mots clés
56
	 */
57
	public function obtenirIdsMotsClesParIdElementLie($id_element_lie) {
58
		$idElementLieP = Cel::db()->proteger($id_element_lie);
59
 
3504 delphine 60
		$requete = "SELECT {$this->id_mot_cle} FROM {$this->table_liaison} ".
61
			"WHERE {$this->id_element_lie} = $idElementLieP ".
2241 mathias 62
			' -- '.__FILE__.':'.__LINE__;
2462 jpm 63
		return Cel::db()->requeter($requete);
2241 mathias 64
	}
65
 
3504 delphine 66
	public function insererParCheminSiInexistant($mot_cle, $chemin_parent, $user_id) {
2199 mathias 67
		$mot_cle = self::simplifier($mot_cle);
2101 jpm 68
		$cheminMotCle = self::getCheminHarmonise($chemin_parent, $mot_cle);
69
		$cheminMotCleP = Cel::db()->proteger($cheminMotCle);
3504 delphine 70
		$idUtilisateurP = Cel::db()->proteger($user_id);
2056 aurelien 71
 
3504 delphine 72
		$requete = "SELECT {$this->id_mot_cle} ".
2101 jpm 73
			"FROM {$this->table_mots_cles} ".
3504 delphine 74
			"WHERE path = $cheminMotCleP ".
75
			"AND user_id = $idUtilisateurP ".
2101 jpm 76
			' -- '.__FILE__.':'.__LINE__;
2143 jpm 77
		$infosMotCle = Cel::db()->requeter($requete);
2101 jpm 78
 
79
		if (!empty($infosMotCle)) {
80
			$idMotCle = $infosMotCle[0]['id_mot_cle'];
2056 aurelien 81
		} else {
3504 delphine 82
			$idMotCle = $this->insererParChemin($mot_cle, $chemin_parent, $user_id);
2056 aurelien 83
		}
2101 jpm 84
		return $idMotCle;
2056 aurelien 85
	}
2101 jpm 86
 
3504 delphine 87
	public function insererParChemin($mot_cle, $chemin_parent, $user_id) {
2199 mathias 88
		$mot_cle = self::simplifier($mot_cle);
2101 jpm 89
		$cheminMotCle = self::getCheminHarmonise($chemin_parent, $mot_cle);
90
		$cheminMotCleP = Cel::db()->proteger($cheminMotCle);
3504 delphine 91
		$idUtilisateurP = Cel::db()->proteger($user_id);
2101 jpm 92
		$motCleP = Cel::db()->proteger($mot_cle);
93
 
94
		$requete = "INSERT INTO {$this->table_mots_cles} ".
3504 delphine 95
			'(path, user_id, name) '.
2101 jpm 96
			"VALUES ($cheminMotCleP, $idUtilisateurP, $motCleP ) ".
97
			' -- '.__FILE__.':'.__LINE__;
2462 jpm 98
		$insertion = Cel::db()->executer($requete);
2101 jpm 99
 
2042 aurelien 100
		$resultat = false;
2101 jpm 101
		if ($insertion !== false) {
2042 aurelien 102
			$resultat = Cel::db()->obtenirDernierId();
103
		}
104
		return $resultat;
2025 aurelien 105
	}
2101 jpm 106
 
3504 delphine 107
	public function insererParIdParent($mot_cle, $id_parent, $user_id) {
2101 jpm 108
		$motCleSimple = self::simplifier($mot_cle);
2196 mathias 109
		$motCleSimpleP = Cel::db()->proteger(strtolower(self::supprimerAccents($mot_cle)));
2101 jpm 110
		$idParentP = Cel::db()->proteger($id_parent);
111
		$racineP = Cel::db()->proteger('/');
3504 delphine 112
		$idUtilisateurP = Cel::db()->proteger($user_id);
2101 jpm 113
		$motCleP = Cel::db()->proteger($mot_cle);
114
 
115
		$sousRequete = $racineP;
116
		if ($id_parent != '') {
3504 delphine 117
			$sousRequete = '(SELECT path '.
2101 jpm 118
				"FROM {$this->table_mots_cles} AS ctp ".
3504 delphine 119
				"WHERE ctp.id = $idParentP) ";
2042 aurelien 120
		}
2045 aurelien 121
 
3504 delphine 122
		$requete = "INSERT INTO {$this->table_mots_cles} (path, user_id, name) ".
2101 jpm 123
			"VALUES (CONCAT($sousRequete, $motCleSimpleP, '/'), $idUtilisateurP, $motCleP ) ".
124
			' -- '.__FILE__.':'.__LINE__;
2462 jpm 125
		$insertion = Cel::db()->executer($requete);
2101 jpm 126
 
127
		if ($insertion !== false) {
2042 aurelien 128
			$resultat = Cel::db()->obtenirDernierId();
129
		}
130
		return $resultat;
2025 aurelien 131
	}
2101 jpm 132
 
2143 jpm 133
 
2241 mathias 134
	public function lierParTableaux($ids_mots_cles, $ids_elements_lies) {
2101 jpm 135
		$combinaisons = array();
136
		foreach ($ids_mots_cles as $id_mot_cle) {
137
			$idMotCleP = Cel::db()->proteger($id_mot_cle);
138
			foreach ($ids_elements_lies as $id_element_lie) {
139
				$idElementLieP = Cel::db()->proteger($id_element_lie);
140
				$combinaisons[] = "($idElementLieP, $idMotCleP)";
2042 aurelien 141
			}
2101 jpm 142
		}
143
 
144
		$valeursGroupees = implode(', ', $combinaisons);
3504 delphine 145
		$requete = "INSERT INTO {$this->table_liaison} ({$this->id_element_lie}, {$this->id_mot_cle}) ".
2101 jpm 146
			"VALUES $valeursGroupees ".
147
			' -- '.__FILE__.':'.__LINE__;
2462 jpm 148
		return Cel::db()->executer($requete);
2042 aurelien 149
	}
2101 jpm 150
 
2241 mathias 151
 
152
 
3504 delphine 153
	public function supprimerLiaisonsMotsCles($ids_mots_cles, $ids_elements_lies, $user_id) {
2042 aurelien 154
		$combinaisons = array();
2101 jpm 155
		foreach ($ids_mots_cles as $id_mot_cle) {
156
			$idMotCleP = Cel::db()->proteger($id_mot_cle);
157
			foreach ($ids_elements_lies as $id_element_lie) {
158
				$idElementLieP = Cel::db()->proteger($id_element_lie);
3504 delphine 159
				$combinaisons[] = "({$this->id_element_lie} = $idElementLieP AND {$this->id_mot_cle} = $idMotCleP)";
2042 aurelien 160
			}
2101 jpm 161
		}
162
		$clauseWhere = implode(' OR ', $combinaisons);
2143 jpm 163
 
2101 jpm 164
		$requete = "DELETE FROM {$this->table_liaison} ".
165
			"WHERE $clauseWhere ".
166
			' -- '.__FILE__.':'.__LINE__;
2462 jpm 167
		return Cel::db()->executer($requete);
2042 aurelien 168
	}
2101 jpm 169
 
2058 aurelien 170
	public function supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lies) {
2143 jpm 171
		$idsElementsLiesP = Cel::db()->proteger($ids_elements_lies);
2101 jpm 172
		$listeIds = implode(',', $idsElementsLiesP);
2143 jpm 173
 
2101 jpm 174
		$requete = "DELETE FROM {$this->table_liaison} ".
3504 delphine 175
			"WHERE {$this->id_element_lie} IN ($listeIds) ".
2101 jpm 176
			' -- '.__FILE__.':'.__LINE__;
177
 
178
		$suppression = Cel::db()->executer($requete);
179
		$suppression = ($suppression !== false) ? true : false;
2042 aurelien 180
		return $suppression;
181
	}
2101 jpm 182
 
3504 delphine 183
	public function supprimerToutesLiaisonsIdsMotsCles($ids_mots_cles, $user_id) {
2101 jpm 184
		$suppression = true;
185
		if (!empty($ids_mots_cles)) {
2143 jpm 186
			$idsMotsClesP = Cel::db()->proteger($ids_mots_cles);
2101 jpm 187
			$listeIds = implode(',', $idsMotsClesP);
2143 jpm 188
 
2101 jpm 189
			$requete = "DELETE FROM {$this->table_liaison} ".
3504 delphine 190
				"WHERE {$this->id_mot_cle} IN ($listeIds) ".
2101 jpm 191
				' -- '.__FILE__.':'.__LINE__;
192
 
2143 jpm 193
			$suppression = Cel::db()->executer($requete);
2101 jpm 194
			$suppression = ($suppression !== false) ? true : false;
2042 aurelien 195
		}
196
		return $suppression;
197
	}
2101 jpm 198
 
199
	/**
200
	 * Supprime toutes les laisons pour un utilisateur et un mot clé (au sens textuel) donnés.
2143 jpm 201
	 *
2101 jpm 202
	 */
3504 delphine 203
	public function supprimerLiaisonPourMotCleEtIdElementLie($mot_cle, $id_element_lie, $user_id) {
2199 mathias 204
		$mot_cle = self::simplifier($mot_cle);
2101 jpm 205
		$idElementLieP = Cel::db()->proteger($id_element_lie);
206
		$motCleP = Cel::db()->proteger($mot_cle);
3504 delphine 207
		$idUtilisateurP = Cel::db()->proteger($user_id);
2143 jpm 208
 
3504 delphine 209
		$sousRequete = "SELECT id FROM {$this->table_mots_cles} ".
210
			"WHERE name = $motCleP ".
3506 delphine 211
			"AND user_id = $idUtilisateurP ";
2101 jpm 212
		$requete = "DELETE FROM {$this->table_liaison} ".
3504 delphine 213
			"WHERE {$this->id_element_lie} = $idElementLieP ".
214
			"AND {$this->id_mot_cle} IN ($sousRequete) ".
2101 jpm 215
			' -- '.__FILE__.':'.__LINE__;
2046 aurelien 216
 
2143 jpm 217
		$suppression_liaison = Cel::db()->executer($requete);
2046 aurelien 218
		$suppression_liaison = ($suppression_liaison !== false);
219
 
220
		return $suppression_liaison;
221
	}
2101 jpm 222
 
223
 
3504 delphine 224
	public function supprimerChemin($chemin, $user_id) {
225
		$idUtilisateurP = Cel::db()->proteger($user_id);
2101 jpm 226
		$cheminP = Cel::db()->proteger($chemin.'%');
2025 aurelien 227
		// TODO : triggers pour les tables liées ?
2101 jpm 228
		$requete = "DELETE FROM {$this->$table_mots_cles} ".
3504 delphine 229
			"WHERE path LIKE $cheminP ".
230
			"AND user_id = $idUtilisateurP ".
2101 jpm 231
			' -- '.__FILE__.':'.__LINE__;
2025 aurelien 232
 
2101 jpm 233
		return Cel::db()->executer($requete);
2042 aurelien 234
	}
2101 jpm 235
 
236
	/**
237
	 * suppression des associations du mots clé aux images ou obs, mais aussi des associations de ses enfants
238
	 * (car ceux-ci seront supprimés aussi dans le processus)
239
	 * même s'il n'a pas d'enfants, le tableau contient au moins l'id du mot clé lui même
240
	 */
3504 delphine 241
	public function supprimerMotCleParId($id_mot_cle, $user_id) {
2043 aurelien 242
		//TODO: simplifier cette fonction
3504 delphine 243
		$ids_mot_cle_et_enfants = $this->obtenirIdsMotsClesParIdParent($user_id, $id_mot_cle);
2101 jpm 244
 
2043 aurelien 245
		// obtention des ids des éléments liés au mot clé ainsi qu'à ces enfants (afin de pouvoir
2060 aurelien 246
		// régénérer les index texte de mots clés sur les éléments liés)
2043 aurelien 247
		$ids_a_delier = array();
2101 jpm 248
		foreach ($ids_mot_cle_et_enfants as $id) {
2043 aurelien 249
			$ids_a_delier[] = $id['id_mot_cle'];
250
		}
2101 jpm 251
 
2043 aurelien 252
		$ids_elements_lies = $this->obtenirIdElementsLiesPourIds($ids_a_delier);
3504 delphine 253
		$suppression_liaison = $this->supprimerToutesLiaisonsIdsMotsCles($ids_a_delier, $user_id);
2043 aurelien 254
 
2101 jpm 255
		foreach ($ids_elements_lies as $id_element_lie) {
2043 aurelien 256
			self::regenererIndexTexteMotCle($id_element_lie['id_element_lie'], $this->mode);
257
		}
2101 jpm 258
 
2043 aurelien 259
		// suppression du mot clé proprement dit ainsi que de ses enfants
3504 delphine 260
		$suppression = $this->supprimerMotCleEtEnfantsParId($id_mot_cle, $user_id);
2101 jpm 261
 
2043 aurelien 262
		return $suppression && $suppression_liaison;
263
	}
2101 jpm 264
 
3504 delphine 265
	public function supprimerMotCleEtEnfantsParId($id_mot_cle, $user_id) {
2101 jpm 266
		$idMotCleP = Cel::db()->proteger($id_mot_cle);
3504 delphine 267
		$requete = 'SELECT path '.
2101 jpm 268
			"FROM {$this->table_mots_cles} ".
3504 delphine 269
			"WHERE id = $idMotCleP ".
2101 jpm 270
			' -- '.__FILE__.':'.__LINE__;
2116 jpm 271
		$chemin = Cel::db()->requeter($requete);
2101 jpm 272
 
2043 aurelien 273
		$suppression = true;
2101 jpm 274
		// vérification pour empecher la suppression accidentelle de tout l'arbre,
2060 aurelien 275
		// cas qui ne devrait jamais arriver normalement
2101 jpm 276
		if (!empty($chemin) && $chemin != '/') {
277
			$chemin = $chemin[0]['chemin'];
278
			$cheminP = Cel::db()->proteger($chemin.'%');
3504 delphine 279
			$idUtilisateurP = Cel::db()->proteger($user_id);
2143 jpm 280
 
2101 jpm 281
			$requete = "DELETE FROM {$this->table_mots_cles} ".
3504 delphine 282
				"WHERE path LIKE $cheminP ".
283
				"AND user_id = $idUtilisateurP ".
2101 jpm 284
				' -- '.__FILE__.':'.__LINE__;;
285
 
286
			$suppression = Cel::db()->executer($requete);
2043 aurelien 287
		}
2042 aurelien 288
 
2043 aurelien 289
		return ($suppression !== false);
2101 jpm 290
 
2025 aurelien 291
	}
2101 jpm 292
 
3504 delphine 293
	public function obtenirIdsMotClesPourMotsCles($mots_cles, $user_id) {
2199 mathias 294
		$motsClesP = array();
295
		foreach ($mots_cles as $mot_cle) {
296
			$motsClesP[] = Cel::db()->proteger(self::simplifier($mot_cle));
297
		}
2101 jpm 298
		$listeMotsClesP = implode(',', $motsClesP);
3504 delphine 299
		$idUtilisateurP = Cel::db()->proteger($user_id);
2056 aurelien 300
 
3504 delphine 301
		$requete = 'SELECT id as id_mot_cle, name as mot_cle '.
2101 jpm 302
			"FROM {$this->table_mots_cles} ".
303
			"WHERE mot_cle IN ($listeMotsClesP) ".
3504 delphine 304
			"AND user_id = $idUtilisateurP ".
2101 jpm 305
			' -- '.__FILE__.':'.__LINE__;
2143 jpm 306
 
3078 mathias 307
		$resultat = Cel::db()->executerRequete($requete);
2101 jpm 308
		return $resultat;
2056 aurelien 309
	}
2101 jpm 310
 
2143 jpm 311
 
2101 jpm 312
 
2042 aurelien 313
	public function obtenirIdElementsLiesPourIds($ids_mots_cles) {
2101 jpm 314
		$idsElementsLies = array();
315
		if (!empty($ids_mots_cles)) {
2143 jpm 316
			$idsMotsClesP = Cel::db()->proteger($ids_mots_cles);
2101 jpm 317
			$listeIdsMotsCles = implode(',', $idsMotsClesP);
2143 jpm 318
 
3504 delphine 319
			$requete = "SELECT {$this->id_element_lie} as id_element_lie ".
2101 jpm 320
				"FROM {$this->table_liaison} ".
3504 delphine 321
				"WHERE {$this->id_mot_cle} IN ($listeIdsMotsCles) ".
2101 jpm 322
				' -- '.__FILE__.':'.__LINE__;
323
 
2143 jpm 324
 
325
			$idsElementsLies = Cel::db()->requeter($requete);
2042 aurelien 326
		}
2101 jpm 327
		return $idsElementsLies;
328
	}
2042 aurelien 329
 
2101 jpm 330
	/**
331
	 *
2060 aurelien 332
	 * Fonctions statiques utilitaires
2101 jpm 333
	 * (Dans l'idéal toute la classe pourrait être statique car elle n'a
2060 aurelien 334
	 * pas d'état (mais il faudrait passer $mode à toutes les fonctions)
2101 jpm 335
	 *
2060 aurelien 336
	 */
337
	public static function getTablesMotsClesEtLiaisons($mode) {
2101 jpm 338
		if ($mode == 'obs') {
3504 delphine 339
			$table_liaison = 'occurrence_user_occurrence_tag';
340
			$table_mots_cles = 'user_occurrence_tag';
341
			$id_mot_cle = "user_occurrence_tag_id";
342
			$id_element_lie = "occurrence_id";
2060 aurelien 343
		} else {
3504 delphine 344
			$table_liaison = 'photo_tag_photo';
345
			$table_mots_cles = 'photo_tag';
346
			$id_mot_cle = "photo_tag_id";
347
			$id_element_lie = "photo_id";
2060 aurelien 348
		}
3504 delphine 349
		return array($table_liaison, $table_mots_cles, $id_mot_cle, $id_element_lie);
2060 aurelien 350
	}
2486 jpm 351
	/**
3504 delphine 352
	 * Renvoie un template de recherche sur les ids de mots clés utilisables avec sprintf.
353
	 */
354
	public static function obtenirTemplateRequeteMotsClesIds($mode) {
355
	    list($table_liaison, $table_mots_cles, $id_mot_cle, $id_element_lie) = self::getTablesMotsClesEtLiaisons($mode);
356
	    $requeteTpl = "SELECT $id_element_lie FROM $table_liaison WHERE $id_mot_cle IN (%s) ";
357
	    return $requeteTpl;
358
	}
359
	/**
2486 jpm 360
	 * Régénère le champ "mots_cles_texte" l'entité liée (image ou obs)
361
	 * et met à jour sa date de modification
362
	 */
2043 aurelien 363
	public static function regenererIndexTexteMotCle($id_element_lie, $mode) {
2101 jpm 364
		$idElementLieP = Cel::db()->proteger($id_element_lie);
365
		$sqlTpl = self::obtenirTemplateRequeteMotsClesTexte($mode);
366
		$sousRequete = sprintf($sqlTpl, $idElementLieP);
2060 aurelien 367
 
2101 jpm 368
		list($table, $champId) = self::getNomTablesEtChampsElementsLies($mode);
369
		$requete = "UPDATE $table ".
370
			"SET mots_cles_texte = ($sousRequete) ".
2486 jpm 371
			", date_modification = NOW() ".
2101 jpm 372
			"WHERE $champId = $idElementLieP ".
373
			' -- '.__FILE__.':'.__LINE__;
374
 
375
		return Cel::db()->executer($requete);
2043 aurelien 376
	}
2101 jpm 377
 
2043 aurelien 378
	private static function getNomTablesEtChampsElementsLies($mode) {
379
		$tables = array();
2101 jpm 380
		if ($mode == 'obs') {
3504 delphine 381
			$tables = array('occurrence', 'id');
2043 aurelien 382
		} else {
3504 delphine 383
			$tables = array('photo', 'id');
2043 aurelien 384
		}
385
		return $tables;
386
	}
2101 jpm 387
 
388
	/**
2143 jpm 389
	 * Renvoie un template de requete pour selectionner la concatenation de mots clé
2101 jpm 390
	 * pour un element donné (utilisable avec sprintf)
391
	 */
2060 aurelien 392
	public static function obtenirTemplateRequeteMotsClesTexte($mode) {
3504 delphine 393
	    list($table_liaison, $table_mots_cles, $id_mot_cle, $id_element_lie) = self::getTablesMotsClesEtLiaisons($mode);
2143 jpm 394
 
3504 delphine 395
		$requeteTpl = 'SELECT GROUP_CONCAT(name) '.
2101 jpm 396
			"FROM $table_mots_cles AS cm ".
3504 delphine 397
			"INNER JOIN $table_liaison AS cml ON cml.$id_mot_cle = cm.$id_mot_cle ".
398
			"AND cml.$id_element_lie = %s ";
2143 jpm 399
 
2101 jpm 400
		return $requeteTpl;
2042 aurelien 401
	}
2101 jpm 402
 
3504 delphine 403
 
2462 jpm 404
	// Méthodes utilitaires
2143 jpm 405
 
2101 jpm 406
	/**
407
	 * La profondeur d'un noeud est déterminée par le nombre de slashs
408
	 * qu'il contient (étant donné que ceux ci sont interdits dans le texte du mot clé.
409
	 */
2025 aurelien 410
	static public function comparerProfNoeuds($a, $b) {
3504 delphine 411
		$nb_slashs_a = substr_count($a['path'], '/');
412
		$nb_slashs_b = substr_count($a['path'], '/');
2025 aurelien 413
		$cmp = 0;
2101 jpm 414
 
415
		if ($nb_slashs_a == $nb_slashs_b) {
3504 delphine 416
			$cmp = strcasecmp($a['path'], $b['path']);
2025 aurelien 417
		} else {
3504 delphine 418
			$cmp = ($a['path'] > $b['path']) ? +1 : -1;
2025 aurelien 419
		}
420
		return $cmp;
421
	}
2101 jpm 422
 
2026 aurelien 423
	static public function getCheminHarmonise($chemin_parent, $mot_cle) {
424
		return self::harmoniserChemin($chemin_parent.'/'.self::simplifier($mot_cle).'/');
425
	}
2101 jpm 426
 
2026 aurelien 427
	static public function harmoniserChemin($chemin) {
428
		$chemin = self::startsWith($chemin,'/') ? $chemin : '/'.$chemin;
429
		$chemin = self::endsWith($chemin,'/') ? $chemin : $chemin.'/';
2101 jpm 430
		$chemin = str_replace('//', '/', $chemin);
2462 jpm 431
		// mise en minuscule du chemin afin d'éviter des cas où l'on aurait
2149 aurelien 432
		// des même mots clés avec minuscule et majuscule
433
		$chemin = strtolower($chemin);
2189 mathias 434
		$chemin = self::supprimerAccents($chemin);
2101 jpm 435
		return $chemin;
2026 aurelien 436
	}
2462 jpm 437
 
438
	static function supprimerAccents($str, $charset='utf-8') {
2189 mathias 439
		$str = htmlentities($str, ENT_NOQUOTES, $charset);
440
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
441
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
442
		$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
443
		return $str;
444
	}
2101 jpm 445
 
2143 jpm 446
	/**
2101 jpm 447
	 * Fonction de slugification du mot clé
2143 jpm 448
	 *
2101 jpm 449
	 * Ni slashes ou antislashes ou virgules (ce qui fausserait l'arbre ou bien les mots
450
	 * clés texte dans les tables obs ou image)
451
	 */
452
	static public function simplifier($text) {
453
		$caracteresASupprimer = array('\\','/', ',');
454
		$text = str_replace($caracteresASupprimer, '', $text);
2167 aurelien 455
		$text = trim($text);
2101 jpm 456
		return $text;
2025 aurelien 457
	}
2101 jpm 458
 
2143 jpm 459
	/**
2101 jpm 460
	 * Gardée pour compatibilité ancienne version (mais devrait être supprimée
461
	 * dans le futur
462
	 */
2060 aurelien 463
	static function nettoyerMotsClesAvantSuppression($chaine) {
464
		$valeur = str_replace('null', '', $chaine);
465
		$valeur = trim($valeur, ';;');
466
		return $valeur;
467
	}
2101 jpm 468
 
2462 jpm 469
	public static function startsWith($haystack, $needle) {
2101 jpm 470
		return $needle === '' || strpos($haystack, $needle) === 0;
2026 aurelien 471
	}
2101 jpm 472
 
2462 jpm 473
	public  static function endsWith($haystack, $needle) {
2101 jpm 474
		return $needle === '' || substr($haystack, -strlen($needle)) === $needle;
2026 aurelien 475
	}
2101 jpm 476
 
2060 aurelien 477
	/**
478
	* Fonction utilisée pour importer les anciens mots clés saisis dans les widget dans un compte identifié
3504 delphine 479
	* Dans ce cas là, le widget remplit la case user_id par le mail indiqué lors de la saisie
2060 aurelien 480
	* @param string $mail_utilisateur
3504 delphine 481
	* @param string $user_id
2060 aurelien 482
	*/
483
	public static function migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur) {
484
		return self::migrerLiaisonEtMotsCles($mail_utilisateur, $infos_utilisateur, 'obs') &&
485
				self::migrerLiaisonEtMotsCles($mail_utilisateur, $infos_utilisateur, 'images');
486
	}
2101 jpm 487
 
488
	/**
489
	 * ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
3504 delphine 490
	 * avec l'identifiant $user_id ce qui est normalement le cas
2101 jpm 491
	 * ça devrait normalement marcher correctement même s'il en a déjà mais ça n'a pas été testé
492
	 */
493
	private static function migrerLiaisonEtMotsCles($email_utilisateur, $infos_utilisateur, $mode) {
3504 delphine 494
	    list($table_liaisons, $table_mots_cles, $id_mot_cle, $id_element_lie) = self::getTablesMotsClesEtLiaisons($mode);
495
		$idUtilisateurP = Cel::db()->proteger($infos_utilisateur['user_id']);
2101 jpm 496
		$emailUtilisateurP = Cel::db()->proteger($email_utilisateur);
2143 jpm 497
 
2101 jpm 498
		$requete_migration_mc = "UPDATE {$table_mots_cles} ".
3504 delphine 499
			"SET user_id = $idUtilisateurP ".
500
			"WHERE user_id = $emailUtilisateurP ";
2101 jpm 501
 
2143 jpm 502
		$migration = Cel::db()->executer($requete_migration_mc);
2101 jpm 503
		$migration = ($migration !== false) ? true : false;
504
		return $migration;
2060 aurelien 505
	}
3078 mathias 506
}