Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2043 Rev 2045
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
 * @author    Raphaël Droz <raphael@tela-botania.org>
5
 * @author    Raphaël Droz <raphael@tela-botania.org>
6
 * @copyright 2010, 2013 Tela-Botanica
6
 * @copyright 2010, 2013 Tela-Botanica
7
 * @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
7
 * @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
8
 *
8
 *
9
 * Librairie de liaison d'images et d'observation à des mots clés
9
 * Librairie de liaison d'images et d'observation à des mots clés
10
 */
10
 */
11
 
11
 
12
//TODO : cette classe devrait disparaitre pour être intégrée dans la classe 
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 
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
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)
15
// et les tables de mots clés (elle sera supprimée lorsque le champ mots_cles_texte le sera aussi)
16
class LiaisonMotsCles extends Cel {
16
class LiaisonMotsCles extends Cel {
17
	
17
	
18
	const SEPARATEUR_MOT_CLE_TEXTE = ',';
18
	const SEPARATEUR_MOT_CLE_TEXTE = ',';
19
	private $mode = 'obs';
19
	private $mode = 'obs';
20
	private $table_elements_lies;
20
	private $table_elements_lies;
21
	private $champ_id_element_lie;
21
	private $champ_id_element_lie;
22
	
22
	
23
	public function LiaisonMotsCles($config, $mode) {
23
	public function LiaisonMotsCles($config, $mode) {
24
		parent::__construct($config);
24
		parent::__construct($config);
25
		$this->mode = $mode;
25
		$this->mode = $mode;
26
		list($this->table_elements_lies, $this->champ_id_element_lie) = self::getNomTables($mode);
26
		list($this->table_elements_lies, $this->champ_id_element_lie) = self::getNomTables($mode);
27
	}
27
	}
28
	
28
	
29
	private static function getNomTables($mode) {
29
	private static function getNomTables($mode) {
30
		$tables = array();
30
		$tables = array();
31
		if($mode == 'obs') {
31
		if($mode == 'obs') {
32
			$tables = array('cel_obs','id_observation');
32
			$tables = array('cel_obs','id_observation');
33
		} else {
33
		} else {
34
			$tables = array('cel_images','id_image');
34
			$tables = array('cel_images','id_image');
35
		}
35
		}
36
		return $tables;
36
		return $tables;
37
	}
37
	}
38
	
38
	
39
	public function ajouterLiaisonMotsCles($id_utilisateur, $ids_elements_lies, $ids_mots_cles) {
39
	public function ajouterLiaisonMotsCles($id_utilisateur, $ids_elements_lies, $ids_mots_cles) {
40
		$mode = $this->mode;
40
		$mode = $this->mode;
41
		
41
		
42
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $mode);
42
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $mode);
43
		$insertion = $gestion_mots_cles->lierParTableaux($ids_mots_cles, $ids_elements_lies, $id_utilisateur);
43
		$insertion = $gestion_mots_cles->lierParTableaux($ids_mots_cles, $ids_elements_lies, $id_utilisateur);
44
 
44
 
45
		if(!$insertion) {
45
		if(!$insertion) {
46
			// peut arriver, par exemple lorsqu'on décoche tous les mots-clef associés à une image
46
			// peut arriver, par exemple lorsqu'on décoche tous les mots-clef associés à une image
47
			$this->logger('CEL_bugs', 'Pas de mot-clef à ajouter à des '.$mode.' : '. implode(',', $ids_elements_lies));
47
			$this->logger('CEL_bugs', 'Pas de mot-clef à ajouter à des '.$mode.' : '. implode(',', $ids_elements_lies));
48
		}
48
		}
49
 
49
 
50
		// ... donc dans tous les cas nous devons conserver une cohérence entre les deux modes de stockage des mots-clefs
50
		// ... donc dans tous les cas nous devons conserver une cohérence entre les deux modes de stockage des mots-clefs
51
		$ret = TRUE;
51
		$ret = TRUE;
52
		
52
		
53
		foreach($ids_elements_lies as $id_element_lie) {
53
		foreach($ids_elements_lies as $id_element_lie) {
54
			$bool = self::regenererIndexTexteMotCle($id_element_lie, $mode);
54
			$bool = self::regenererIndexTexteMotCle($id_element_lie, $mode);
55
			$ret = $ret & ($bool !== FALSE); // peut légitimement retourner 0
55
			$ret = $ret & ($bool !== FALSE); // peut légitimement retourner 0
56
		}
56
		}
57
		return $ret;
57
		return $ret;
58
	}
58
	}
59
	
59
	
60
	public function supprimerLiaisonsMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_elements_lies, $chemins) {
60
	public function supprimerLiaisonsMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_elements_lies, $chemins) {
61
		
61
		
62
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
62
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
63
		$retour = $gestion_mots_cles->supprimerLiaisonsMotsCles($chemins, $ids_elements_lies, $id_utilisateur);
63
		$retour = $gestion_mots_cles->supprimerLiaisonsMotsCles($chemins, $ids_elements_lies, $id_utilisateur);
64
		
64
		
65
		foreach($ids_elements_lies as $id_element_lie) {
65
		foreach($ids_elements_lies as $id_element_lie) {
66
			self::regenererIndexTexteMotCle($id_element_lie, $this->mode);
66
			self::regenererIndexTexteMotCle($id_element_lie, $this->mode);
67
		}	
67
		}	
68
		
68
		
69
		return $retour;
69
		return $retour;
70
	}
70
	}
71
	
71
	
72
	public function supprimerToutesLiaisonsPourIdsElementsLies($id_utilisateur, $ids_elements_lie) {
72
	public function supprimerToutesLiaisonsPourIdsElementsLies($id_utilisateur, $ids_elements_lies) {
73
		
73
		
-
 
74
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
-
 
75
		$suppression_mot_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lies, $id_utilisateur);
-
 
76
		
-
 
77
		foreach($ids_elements_lies as $id_element_lie) {
-
 
78
			self::regenererIndexTexteMotCle($id_element_lie, $this->mode);
74
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
79
		}	
75
		$suppression_mot_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lie, $id_utilisateur);
80
		
76
		if ($suppression_mot_cles !== false) {
81
		if ($suppression_mot_cles !== false) {
77
			return TRUE;
82
			return TRUE;
78
		}
83
		}
79
 
84
 
80
		$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete");
85
		$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete");
81
		return FALSE;
86
		return FALSE;
82
	}
87
	}
83
	
88
	
84
	public function supprimerToutesLiaisonsPourChemins($id_utilisateur, $chemins) {
89
	public function supprimerToutesLiaisonsPourChemins($id_utilisateur, $chemins) {
85
		
90
		
86
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
91
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, $this->mode);
87
		$ids_elements_lies = $gestion_mots_cles->obtenirIdElementsLiesPourChemins($chemins);
92
		$ids_elements_lies = $gestion_mots_cles->obtenirIdElementsLiesPourChemins($chemins);
88
		
93
		
89
		foreach($ids_elements_lies as $id_element_lie) {
94
		foreach($ids_elements_lies as $id_element_lie) {
90
			self::regenererIndexTexteMotCle($id_element_lie['id_element_lie'], $this->mode);
95
			self::regenererIndexTexteMotCle($id_element_lie['id_element_lie'], $this->mode);
91
		}
96
		}
92
		
97
		
93
		$suppression_mot_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourChemins($chemins, $id_utilisateur);
98
		$suppression_mot_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourChemins($chemins, $id_utilisateur);
94
	
99
	
95
		if ($requete_suppression_liaison_mot_cle !== false) {
100
		if ($requete_suppression_liaison_mot_cle !== false) {
96
			$retour = true;
101
			$retour = true;
97
		} else {
102
		} else {
98
			$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
103
			$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
99
			$this->logger($message);
104
			$this->logger($message);
100
				
105
				
101
			$retour = false;
106
			$retour = false;
102
		}
107
		}
103
	
108
	
104
		return $retour;
109
		return $retour;
105
	}
110
	}
106
	
111
	
107
	static private function regenererIndexTexteMotCle($id_element_lie, $mode) {
112
	static private function regenererIndexTexteMotCle($id_element_lie, $mode) {
108
		return GestionMotsClesChemin::regenererIndexTexteMotCle($id_element_lie, $mode);	
113
		return GestionMotsClesChemin::regenererIndexTexteMotCle($id_element_lie, $mode);	
109
	}
114
	}
110
	
115
	
111
	private static function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode) {
116
	private static function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode) {
112
		return Cel::db()->requeter(sprintf('SELECT mot_cle FROM cel_mots_cles_%1$s WHERE id_mot_cle_%2$s IN '.
117
		return Cel::db()->requeter(sprintf('SELECT mot_cle FROM cel_mots_cles_%1$s WHERE id_mot_cle_%2$s IN '.
113
										   ' (SELECT id_mot_cle_%2$s FROM cel_%1$s_mots_cles WHERE %3$s = %4$s)'.
118
										   ' (SELECT id_mot_cle_%2$s FROM cel_%1$s_mots_cles WHERE %3$s = %4$s)'.
114
										   ' AND id_utilisateur = %5$s -- %6$s:%7$d',
119
										   ' AND id_utilisateur = %5$s -- %6$s:%7$d',
115
										   $mode,
120
										   $mode,
116
										   $mode == 'obs' ? 'obs' : 'image',
121
										   $mode == 'obs' ? 'obs' : 'image',
117
										   $mode == 'obs' ? 'id_observation' : 'id_image',
122
										   $mode == 'obs' ? 'id_observation' : 'id_image',
118
										   Cel::db()->proteger($id_image_ou_obs),
123
										   Cel::db()->proteger($id_image_ou_obs),
119
										   Cel::db()->proteger($identifiant_utilisateur),
124
										   Cel::db()->proteger($identifiant_utilisateur),
120
										   __FILE__ , __LINE__));
125
										   __FILE__ , __LINE__));
121
	}
126
	}
122
	
127
	
123
	private static function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
128
	private static function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
124
		$mot_cles_texte_chaine = '';
129
		$mot_cles_texte_chaine = '';
125
		
130
		
126
		if (is_array($tableau_mots_cles_texte)) { 
131
		if (is_array($tableau_mots_cles_texte)) { 
127
			foreach ($tableau_mots_cles_texte as $mot_cle) {
132
			foreach ($tableau_mots_cles_texte as $mot_cle) {
128
				$mot_cles_texte_chaine .= $mot_cle['mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
133
				$mot_cles_texte_chaine .= $mot_cle['mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
129
			}
134
			}
130
		}
135
		}
131
		
136
		
132
		$mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
137
		$mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
133
		
138
		
134
		return $mot_cles_texte_chaine;
139
		return $mot_cles_texte_chaine;
135
	}
140
	}
136
	
141
	
137
	static function nettoyerMotsCles($chaine) {
142
	static function nettoyerMotsCles($chaine) {
138
		$valeur = str_replace('null', '', $chaine);
143
		$valeur = str_replace('null', '', $chaine);
139
		$valeur = trim($valeur, ';;');
144
		$valeur = trim($valeur, ';;');
140
		
145
		
141
		return $valeur;
146
		return $valeur;
142
	}
147
	}
143
	
148
	
144
	/**
149
	/**
145
	* Fonction utilisée pour importer les anciens mots clés saisis dans les widget dans un compte identifié
150
	* Fonction utilisée pour importer les anciens mots clés saisis dans les widget dans un compte identifié
146
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
151
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
147
	* @param string $mail_utilisateur
152
	* @param string $mail_utilisateur
148
	* @param string $id_utilisateur
153
	* @param string $id_utilisateur
149
	*/
154
	*/
150
	public function migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur) {
155
	public function migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur) {
151
		// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
156
		// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
152
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
157
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
153
		$requete_migration_mc_images = 'UPDATE cel_mots_cles_images SET '.
158
		$requete_migration_mc_images = 'UPDATE cel_mots_cles_images SET '.
154
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
159
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
155
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
160
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
156
 
161
 
157
		$migration_mc_images = Cel::db()->executerRequeteSimple($requete_migration_mc_images);
162
		$migration_mc_images = Cel::db()->executerRequeteSimple($requete_migration_mc_images);
158
		
163
		
159
		// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
164
		// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
160
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
165
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
161
		$requete_migration_mc_obs = 'UPDATE cel_mots_cles_obs SET '.
166
		$requete_migration_mc_obs = 'UPDATE cel_mots_cles_obs SET '.
162
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
167
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
163
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
168
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
164
		
169
		
165
		$migration_mc_obs = Cel::db()->executerRequeteSimple($requete_migration_mc_obs);
170
		$migration_mc_obs = Cel::db()->executerRequeteSimple($requete_migration_mc_obs);
166
		
171
		
167
		// Migration des liaisons de mots clés
172
		// Migration des liaisons de mots clés
168
		$requete_migration_mc_liaisons_obs = 'UPDATE cel_obs_mots_cles SET '.
173
		$requete_migration_mc_liaisons_obs = 'UPDATE cel_obs_mots_cles SET '.
169
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
174
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
170
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
175
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
171
		
176
		
172
		$migration_mc_liaisons_obs = Cel::db()->executerRequeteSimple($requete_migration_mc_liaisons_obs);
177
		$migration_mc_liaisons_obs = Cel::db()->executerRequeteSimple($requete_migration_mc_liaisons_obs);
173
		
178
		
174
		$requete_migration_mc_liaisons_images = 'UPDATE cel_images_mots_cles SET '.
179
		$requete_migration_mc_liaisons_images = 'UPDATE cel_images_mots_cles SET '.
175
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
180
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
176
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
181
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
177
		
182
		
178
		$migration_mc_liaisons_images = Cel::db()->executerRequeteSimple($requete_migration_mc_liaisons_images);
183
		$migration_mc_liaisons_images = Cel::db()->executerRequeteSimple($requete_migration_mc_liaisons_images);
179
	
184
	
180
		return $migration_mc_images !== false &&
185
		return $migration_mc_images !== false &&
181
				$migration_mc_obs  !== false && 
186
				$migration_mc_obs  !== false && 
182
				$migration_mc_liaisons_obs !== false && 
187
				$migration_mc_liaisons_obs !== false && 
183
				$migration_mc_liaisons_images  !== false;
188
				$migration_mc_liaisons_images  !== false;
184
	}
189
	}
185
}
190
}
186
?>
191
?>