Subversion Repositories eFlore/Applications.cel

Rev

Rev 2459 | Rev 2486 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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