Subversion Repositories eFlore/Applications.cel

Rev

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

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