Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
934 aurelien 1
<?php
2
/**
1872 raphael 3
 * @package   jrest
4
 * @author    Aurélien Peronnet <aurelien@tela-botania.org>
5
 * @author    Raphaël Droz <raphael@tela-botania.org>
6
 * @copyright 2010, 2013 Tela-Botanica
7
 * @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
8
 *
9
 * Librairie de liaison d'images et d'observation à des mots clés
10
 */
11
 
2042 aurelien 12
//TODO : cette classe devrait disparaitre pour être intégrée dans la classe
13
// gestionMotsClesChemin, si possible, mais elle existe pour garder une certaine
14
// indépendance entre le mecanisme des mots clés texte dans les tables obs et images
15
// et les tables de mots clés (elle sera supprimée lorsque le champ mots_cles_texte le sera aussi)
934 aurelien 16
class LiaisonMotsCles extends Cel {
17
 
1164 aurelien 18
	const SEPARATEUR_MOT_CLE_TEXTE = ',';
934 aurelien 19
	private $mode = 'obs';
2042 aurelien 20
	private $table_elements_lies;
21
	private $champ_id_element_lie;
934 aurelien 22
 
23
	public function LiaisonMotsCles($config, $mode) {
958 aurelien 24
		parent::__construct($config);
934 aurelien 25
		$this->mode = $mode;
2042 aurelien 26
		list($this->table_elements_lies, $this->champ_id_element_lie) = self::getNomTables($mode);
934 aurelien 27
	}
28
 
2042 aurelien 29
	private static function getNomTables($mode) {
30
		$tables = array();
31
		if($mode == 'obs') {
32
			$tables = array('cel_obs','id_observation');
33
		} else {
34
			$tables = array('cel_images','id_image');
35
		}
36
		return $tables;
37
	}
38
 
39
	public function ajouterLiaisonMotsCles($id_utilisateur, $ids_elements_lies, $ids_mots_cles) {
1872 raphael 40
		$mode = $this->mode;
934 aurelien 41
 
2042 aurelien 42
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $mode);
43
		$insertion = $gestion_mots_cles->lierParTableaux($ids_mots_cles, $ids_elements_lies, $id_utilisateur);
1872 raphael 44
 
2042 aurelien 45
		if(!$insertion) {
1872 raphael 46
			// peut arriver, par exemple lorsqu'on décoche tous les mots-clef associés à une image
2042 aurelien 47
			$this->logger('CEL_bugs', 'Pas de mot-clef à ajouter à des '.$mode.' : '. implode(',', $ids_elements_lies));
1300 aurelien 48
		}
49
 
1872 raphael 50
		// ... donc dans tous les cas nous devons conserver une cohérence entre les deux modes de stockage des mots-clefs
51
		$ret = TRUE;
2042 aurelien 52
 
53
		foreach($ids_elements_lies as $id_element_lie) {
54
			$bool = self::regenererIndexTexteMotCle($id_element_lie, $mode);
1872 raphael 55
			$ret = $ret & ($bool !== FALSE); // peut légitimement retourner 0
934 aurelien 56
		}
1872 raphael 57
		return $ret;
934 aurelien 58
	}
59
 
2042 aurelien 60
	public function supprimerLiaisonsMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_elements_lies, $chemins) {
970 aurelien 61
 
2042 aurelien 62
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
63
		$retour = $gestion_mots_cles->supprimerLiaisonsMotsCles($chemins, $ids_elements_lies, $id_utilisateur);
970 aurelien 64
 
2042 aurelien 65
		foreach($ids_elements_lies as $id_element_lie) {
66
			self::regenererIndexTexteMotCle($id_element_lie, $this->mode);
970 aurelien 67
		}
68
 
69
		return $retour;
70
	}
71
 
2042 aurelien 72
	public function supprimerToutesLiaisonsPourIdsElementsLies($id_utilisateur, $ids_elements_lie) {
934 aurelien 73
 
2042 aurelien 74
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
75
		$suppression_mot_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lie, $id_utilisateur);
76
		if ($suppression_mot_cles !== false) {
1872 raphael 77
			return TRUE;
934 aurelien 78
		}
1872 raphael 79
 
80
		$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete");
81
		return FALSE;
934 aurelien 82
	}
1300 aurelien 83
 
2042 aurelien 84
	public function supprimerToutesLiaisonsPourChemins($id_utilisateur, $chemins) {
934 aurelien 85
 
2042 aurelien 86
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
87
		$ids_elements_lies = $gestion_mots_cles->obtenirIdElementsLiesPourChemins($chemins);
1300 aurelien 88
 
2042 aurelien 89
		foreach($ids_elements_lies as $id_element_lie) {
90
			self::regenererIndexTexteMotCle($id_element_lie['id_element_lie'], $this->mode);
1300 aurelien 91
		}
2042 aurelien 92
 
93
		$suppression_mot_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourChemins($chemins, $id_utilisateur);
1300 aurelien 94
 
95
		if ($requete_suppression_liaison_mot_cle !== false) {
96
			$retour = true;
97
		} else {
98
			$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
99
			$this->logger($message);
100
 
101
			$retour = false;
102
		}
103
 
104
		return $retour;
105
	}
2042 aurelien 106
 
107
	public function supprimerLiaisonsPourIdEtEnfants($id_utilisateur, $id_mot_cle) {
1300 aurelien 108
 
2042 aurelien 109
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
110
 
111
		// même s'il n'a pas d'enfants, le tableau contient au moins l'id du mot clé lui même
112
		$ids_mot_cle_et_enfants = $gestion_mots_cles->obtenirIdsMotsClesParIdParent($id_utilisateur, $id_mot_cle);
113
		// obtention des ids des éléments liés au mot clé ainsi qu'à ces enfants (afin de pouvoir
114
		// régénérer les index texte de mots clés sur les éléments liés
115
		$ids_a_delier = array();
116
		// création de deux tableaux pour éviter un bug du au passage par référence
117
		// TODO: corriger ça bien proprement
118
		foreach($ids_mot_cle_et_enfants as &$id) {
119
			$ids_a_delier[] = $id['id_mot_cle'];
120
			$id = $id['id_mot_cle'];
934 aurelien 121
		}
1329 aurelien 122
 
2042 aurelien 123
		$ids_elements_lies = $gestion_mots_cles->obtenirIdElementsLiesPourIds($ids_a_delier);
124
		$suppression_liaison = $gestion_mots_cles->supprimerToutesLiaisonsIdsMotsCles($ids_mot_cle_et_enfants, $id_utilisateur);
1872 raphael 125
 
2042 aurelien 126
		foreach($ids_elements_lies as $id_element_lie) {
127
			self::regenererIndexTexteMotCle($id_element_lie, $this->mode);
128
		}
129
 
130
		return Cel::db()->executer($requete, __FILE__ , __LINE__);
934 aurelien 131
	}
132
 
2042 aurelien 133
	static private function regenererIndexTexteMotCle($id_element_lie, $mode) {
134
 
135
		$sous_requete_concat = '('.sprintf(GestionMotsClesChemin::obtenirTemplateRequeteMotsClesTexte($mode),
136
								Cel::db()->proteger($id_element_lie)).')';
137
 
138
		list($table, $champ_id) = self::getNomTables($mode);
139
		$requete = 'UPDATE '.$table.' SET mots_cles_texte = '.$sous_requete_concat.' '.
140
		           'WHERE '.$champ_id.' = '.Cel::db()->proteger($id_element_lie).' ';
141
 
142
		return Cel::db()->executer($requete, __FILE__ , __LINE__);
143
 
144
	}
145
 
1872 raphael 146
	private static function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode) {
147
		return Cel::db()->requeter(sprintf('SELECT mot_cle FROM cel_mots_cles_%1$s WHERE id_mot_cle_%2$s IN '.
148
										   ' (SELECT id_mot_cle_%2$s FROM cel_%1$s_mots_cles WHERE %3$s = %4$s)'.
149
										   ' AND id_utilisateur = %5$s -- %6$s:%7$d',
150
										   $mode,
151
										   $mode == 'obs' ? 'obs' : 'image',
152
										   $mode == 'obs' ? 'id_observation' : 'id_image',
153
										   Cel::db()->proteger($id_image_ou_obs),
154
										   Cel::db()->proteger($identifiant_utilisateur),
155
										   __FILE__ , __LINE__));
934 aurelien 156
	}
157
 
1872 raphael 158
	private static function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
934 aurelien 159
		$mot_cles_texte_chaine = '';
160
 
161
		if (is_array($tableau_mots_cles_texte)) {
162
			foreach ($tableau_mots_cles_texte as $mot_cle) {
163
				$mot_cles_texte_chaine .= $mot_cle['mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
164
			}
165
		}
166
 
167
		$mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
168
 
169
		return $mot_cles_texte_chaine;
170
	}
171
 
1872 raphael 172
	static function nettoyerMotsCles($chaine) {
934 aurelien 173
		$valeur = str_replace('null', '', $chaine);
174
		$valeur = trim($valeur, ';;');
175
 
176
		return $valeur;
177
	}
1470 aurelien 178
 
179
	/**
180
	* Fonction utilisée pour importer les anciens mots clés saisis dans les widget dans un compte identifié
181
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
182
	* @param string $mail_utilisateur
183
	* @param string $id_utilisateur
184
	*/
185
	public function migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur) {
186
		// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
187
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
188
		$requete_migration_mc_images = 'UPDATE cel_mots_cles_images SET '.
1765 raphael 189
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
190
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
1470 aurelien 191
 
1765 raphael 192
		$migration_mc_images = Cel::db()->executerRequeteSimple($requete_migration_mc_images);
1470 aurelien 193
 
194
		// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
195
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
196
		$requete_migration_mc_obs = 'UPDATE cel_mots_cles_obs SET '.
1765 raphael 197
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
198
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
1470 aurelien 199
 
1765 raphael 200
		$migration_mc_obs = Cel::db()->executerRequeteSimple($requete_migration_mc_obs);
1470 aurelien 201
 
202
		// Migration des liaisons de mots clés
203
		$requete_migration_mc_liaisons_obs = 'UPDATE cel_obs_mots_cles SET '.
1765 raphael 204
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
205
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
1470 aurelien 206
 
1765 raphael 207
		$migration_mc_liaisons_obs = Cel::db()->executerRequeteSimple($requete_migration_mc_liaisons_obs);
1470 aurelien 208
 
209
		$requete_migration_mc_liaisons_images = 'UPDATE cel_images_mots_cles SET '.
1765 raphael 210
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
211
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
1470 aurelien 212
 
1765 raphael 213
		$migration_mc_liaisons_images = Cel::db()->executerRequeteSimple($requete_migration_mc_liaisons_images);
1470 aurelien 214
 
215
		return $migration_mc_images !== false &&
216
				$migration_mc_obs  !== false &&
217
				$migration_mc_liaisons_obs !== false &&
218
				$migration_mc_liaisons_images  !== false;
219
	}
934 aurelien 220
}
221
?>