Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
934 aurelien 1
<?php
2
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
3
/**
4
* PHP Version 5
5
*
6
* @category  PHP
7
* @package   jrest
8
* @author    Aurélien Peronnet <aurelien@tela-botania.org>
9
* @copyright 2010 Tela-Botanica
10
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
11
* @version   SVN: <svn_id>
12
* @link      /doc/jrest/
13
*/
14
 
15
/**
16
* in : utf8
17
* out : utf8
18
*
19
* Librairie de liaison d'images et d'observation à des mots clés
20
*
21
*/
22
class LiaisonMotsCles extends Cel {
23
 
1164 aurelien 24
	const SEPARATEUR_MOT_CLE_TEXTE = ',';
934 aurelien 25
	private $mode = 'obs';
26
 
27
	public function LiaisonMotsCles($config, $mode) {
958 aurelien 28
		parent::__construct($config);
934 aurelien 29
		$this->mode = $mode;
30
	}
31
 
32
	public function ajouterLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) {
33
 
1300 aurelien 34
		$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image';
35
		$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image';
970 aurelien 36
 
958 aurelien 37
		// le mot clé ignore est spécifique mysql, mais il est utilisé ici pour des raisons
38
		// de performance, à remplacer par un test sur les mots clés déjà existant si ça gène
39
		$requete_liaison_mots_cles = 'INSERT IGNORE INTO cel_'.$this->mode.'_mots_cles '.
1300 aurelien 40
								   '('.$champ_objet_lie.', '.$champ_mot_cle.') '.
958 aurelien 41
								   'VALUES ';
934 aurelien 42
 
43
		foreach($ids_images_ou_obs as $id_image_ou_obs) {
44
			foreach($mots_cles as $mot) {
1765 raphael 45
				$requete_liaison_mots_cles .= '('.$id_image_ou_obs.','.Cel::db()->proteger($mot).'),';
934 aurelien 46
			}
47
		}
958 aurelien 48
 
49
		$requete_liaison_mots_cles = rtrim($requete_liaison_mots_cles,',');
1765 raphael 50
		$resultat_liaison_mots_cles = Cel::db()->executer($requete_liaison_mots_cles);
934 aurelien 51
 
1300 aurelien 52
		foreach($ids_images_ou_obs as $id_image_ou_obs) {
53
			$this->regenererIndexTexteMotCle($id_image_ou_obs, $id_utilisateur);
54
		}
55
 
934 aurelien 56
		if(!$resultat_liaison_mots_cles) {
57
			$this->logger('CEL_bugs', 'Erreur d\'ajout de mots clés à des '.$this->mode.' : '.$requete_liaison_mots_cles);
58
		}
59
 
60
		return $resultat_liaison_mots_cles;
61
	}
62
 
970 aurelien 63
	public function supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_images_ou_obs, $mots_cles) {
64
 
65
		$retour = $this->supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles);
66
 
67
		foreach($ids_images_ou_obs as $image_ou_obs) {
68
			$this->regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur);
69
		}
70
 
71
		return $retour;
72
	}
73
 
934 aurelien 74
	public function supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) {
75
 
1300 aurelien 76
		$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image';
77
		$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image';
934 aurelien 78
 
958 aurelien 79
		$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_'.$this->mode.'_mots_cles WHERE '.
1300 aurelien 80
											   $champ_objet_lie.' IN ('.implode(',',$ids_images_ou_obs).') '.
81
											   'AND '.$champ_mot_cle.' IN ('.implode(',',$mots_cles).')';
934 aurelien 82
 
1765 raphael 83
		$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle);
970 aurelien 84
 
85
		if ($requete_suppression_liaison_mot_cle !== false) {
86
			$retour = true;
87
		} else {
88
			$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
89
			$this->logger($message);
90
 
91
			$retour = false;
92
		}
934 aurelien 93
 
970 aurelien 94
		return $retour;
95
	}
96
 
97
	public function supprimerToutesLiaisonsPourIdImageOuObs($id_utilisateur, $ids_images_ou_obs) {
98
 
1300 aurelien 99
		$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image';
100
		$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image';
970 aurelien 101
 
102
		$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_'.$this->mode.'_mots_cles WHERE '.
1300 aurelien 103
											   $champ_objet_lie.' IN ('.implode(',',$ids_images_ou_obs).') ';
970 aurelien 104
 
1765 raphael 105
		$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle);
970 aurelien 106
 
107
		if ($requete_suppression_liaison_mot_cle !== false) {
934 aurelien 108
			$retour = true;
109
		} else {
110
			$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
111
			$this->logger($message);
958 aurelien 112
 
113
			$retour = false;
934 aurelien 114
		}
115
 
958 aurelien 116
		return $retour;
934 aurelien 117
	}
1300 aurelien 118
 
119
	public function supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles) {
120
 
121
		$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image';
122
		$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image';
123
 
124
		$chaine_mot_cles_ids = '('.implode(',', $tableau_ids_mots_cles).')';
934 aurelien 125
 
1300 aurelien 126
		$requete_objets_lies_mot_cle = 'SELECT '.$champ_objet_lie.' as id FROM cel_'.$this->mode.'_mots_cles WHERE '.
127
		$champ_mot_cle.' IN '.$chaine_mot_cles_ids;
128
 
129
		$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_'.$this->mode.'_mots_cles WHERE '.
130
		$champ_mot_cle.' IN '.$chaine_mot_cles_ids;
1306 aurelien 131
 
1765 raphael 132
		$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle);
1300 aurelien 133
 
1765 raphael 134
		$resultat_requete_objets_lies_mot_cle = Cel::db()->requeter($requete_objets_lies_mot_cle);
1300 aurelien 135
		foreach($resultat_requete_objets_lies_mot_cle as $objet_lie) {
136
			$this->regenererIndexTexteMotCle($objet_lie['id'], $id_utilisateur);
137
		}
138
 
139
		if ($requete_suppression_liaison_mot_cle !== false) {
140
			$retour = true;
141
		} else {
142
			$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
143
			$this->logger($message);
144
 
145
			$retour = false;
146
		}
147
 
148
		return $retour;
149
	}
150
 
934 aurelien 151
	private function regenererIndexTexteMotCle($image_ou_obs, $identifiant_utilisateur) {
152
 
958 aurelien 153
		$mots_cles = $this->obtenirMotsClesTexte($image_ou_obs, $identifiant_utilisateur);
1300 aurelien 154
		$mots_cles_texte_chaine = "";
934 aurelien 155
		if (count($mots_cles) > 0) {
156
			$mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($mots_cles);
157
		}
1329 aurelien 158
 
1300 aurelien 159
		$this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $image_ou_obs, $identifiant_utilisateur);
934 aurelien 160
	}
161
 
162
	private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $identifiant_utilisateur) {
958 aurelien 163
		$requete = 	'UPDATE '.(($this->mode == 'obs') ? 'cel_obs' : 'cel_images').' '.
1765 raphael 164
					'SET mots_cles_texte = '.Cel::db()->proteger($mots_cles_texte_chaine).' '.
165
					'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs).
166
					' AND ce_utilisateur = '.Cel::db()->proteger($identifiant_utilisateur);
1329 aurelien 167
 
1765 raphael 168
		return Cel::db()->executer($requete);
934 aurelien 169
	}
170
 
171
	private function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur) {
958 aurelien 172
		$requete = 	'SELECT mot_cle '.
173
					'FROM '.'cel_mots_cles_'.$this->mode.' '.
1300 aurelien 174
					'WHERE id_mot_cle_'.(($this->mode == 'obs') ? 'obs' : 'image').' IN '.
958 aurelien 175
						'('.
1300 aurelien 176
							'SELECT id_mot_cle_'.(($this->mode == 'obs') ? 'obs' : 'image').' '.
958 aurelien 177
							'FROM cel_'.$this->mode.'_mots_cles '.
1765 raphael 178
							'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs).
958 aurelien 179
						')'.
1765 raphael 180
					' AND id_utilisateur = '.Cel::db()->proteger($identifiant_utilisateur);
1329 aurelien 181
 
1765 raphael 182
		$resultats = Cel::db()->requeter($requete);
934 aurelien 183
		return $resultats;
184
	}
185
 
186
	private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
187
		$mot_cles_texte_chaine = '';
188
 
189
		if (is_array($tableau_mots_cles_texte)) {
190
			foreach ($tableau_mots_cles_texte as $mot_cle) {
191
				$mot_cles_texte_chaine .= $mot_cle['mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
192
			}
193
		}
194
 
195
		$mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
196
 
197
		return $mot_cles_texte_chaine;
198
	}
199
 
958 aurelien 200
	public function nettoyerMotsCles($chaine) {
934 aurelien 201
		$valeur = str_replace('null', '', $chaine);
202
		$valeur = trim($valeur, ';;');
203
 
204
		return $valeur;
205
	}
1470 aurelien 206
 
207
	/**
208
	* Fonction utilisée pour importer les anciens mots clés saisis dans les widget dans un compte identifié
209
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
210
	* @param string $mail_utilisateur
211
	* @param string $id_utilisateur
212
	*/
213
	public function migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur) {
214
		// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
215
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
216
		$requete_migration_mc_images = 'UPDATE cel_mots_cles_images SET '.
1765 raphael 217
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
218
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
1470 aurelien 219
 
1765 raphael 220
		$migration_mc_images = Cel::db()->executerRequeteSimple($requete_migration_mc_images);
1470 aurelien 221
 
222
		// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà de mots clés dans le CEL
223
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
224
		$requete_migration_mc_obs = 'UPDATE cel_mots_cles_obs SET '.
1765 raphael 225
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
226
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
1470 aurelien 227
 
1765 raphael 228
		$migration_mc_obs = Cel::db()->executerRequeteSimple($requete_migration_mc_obs);
1470 aurelien 229
 
230
		// Migration des liaisons de mots clés
231
		$requete_migration_mc_liaisons_obs = 'UPDATE cel_obs_mots_cles SET '.
1765 raphael 232
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
233
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
1470 aurelien 234
 
1765 raphael 235
		$migration_mc_liaisons_obs = Cel::db()->executerRequeteSimple($requete_migration_mc_liaisons_obs);
1470 aurelien 236
 
237
		$requete_migration_mc_liaisons_images = 'UPDATE cel_images_mots_cles SET '.
1765 raphael 238
		'id_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).' '.
239
		'WHERE id_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' ';
1470 aurelien 240
 
1765 raphael 241
		$migration_mc_liaisons_images = Cel::db()->executerRequeteSimple($requete_migration_mc_liaisons_images);
1470 aurelien 242
 
243
		return $migration_mc_images !== false &&
244
				$migration_mc_obs  !== false &&
245
				$migration_mc_liaisons_obs !== false &&
246
				$migration_mc_liaisons_images  !== false;
247
	}
934 aurelien 248
}
249
?>