Subversion Repositories eFlore/Applications.cel

Rev

Rev 3615 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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