Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 828 Rev 930
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service de liaisons d'images à des observations.
4
 * Service de liaisons de mots clés à des observations.
5
 * Le service lie une ou plusieurs images à une ou plusieurs observations
5
 * Le service lie une ou plusieurs mots clés à une ou plusieurs observations
6
 * Le service renvoie les observations liées à une image
-
 
-
 
6
 * 
7
 * Encodage en entrée : utf8
7
 * Encodage en entrée : utf8
8
 * Encodage en sortie : utf8
8
 * Encodage en sortie : utf8
9
 *
9
 *
10
 * Cas d'utilisation :
10
 * Cas d'utilisation :
11
 *
11
 *
12
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
12
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
13
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @version $Id$
15
 * @version $Id$
16
 * @copyright © 2011, Tela-Botanica
16
 * @copyright © 2011, Tela-Botanica
17
 */
17
 */
18
class InventoryKeyWordObsLink extends Cel {
18
class InventoryKeyWordObsLink extends Cel {
19
	
19
	
20
	const SEPARATEUR_MOT_CLE_TEXTE = '##';
20
	const SEPARATEUR_MOT_CLE_TEXTE = '##';
21
	const SEPARATEUR_MOT_CLE_ID = ';';
21
	const SEPARATEUR_MOT_CLE_ID = ';';
22
	
22
	
23
	public function getRessource() {
23
	public function getRessource() {
24
		//$this->migrerMotsClesDansTableLiaison();	
24
		//$this->migrerMotsClesDansTableLiaison();	
25
	}
25
	}
26
	
26
	
27
	public function getElement($uid) {
27
	public function getElement($uid) {
28
	
28
	
29
	}
29
	}
30
 
30
	
31
	// met à jour les associations des mots clés des observations
-
 
32
	public function updateElement($uid,$pairs) {
31
	public function createElement($pairs) {
-
 
32
		
33
		// Controle detournement utilisateur
33
		// Controle detournement utilisateur
34
		session_start();
34
		session_start();
35
		if (($_SESSION['user'] != '') && $_SESSION['user']['name'] != $uid[0]) {
35
		$this->controleUtilisateur($pairs['ce_utilisateur']);
36
			print "Acces interdit";
-
 
37
			return;
-
 
38
		}
-
 
39
	
36
	
40
		if (!isset($pairs['mots_cles']) || !isset($uid[1])) {
37
		if (!isset($pairs['mots_cles']) || !isset($pairs['observations']) || !isset($pairs['ce_utilisateur'])) {
41
			return;
38
			return;
42
		}
39
		}
-
 
40
		
-
 
41
		$observations = explode(',',$pairs['observations']);
-
 
42
		$mots_cles = explode(',',$pairs['mots_cles']);
-
 
43
		
-
 
44
		$gestionnaire_observation = new RechercheObservation($this->config);
-
 
45
		$ids_obs = $gestionnaire_observation->obtenirIdObservationsPourOrdre($pairs['ce_utilisateur'],$observations);
-
 
46
				
-
 
47
		$requete_liaison_mots_cles = 'INSERT INTO cel_obs_mots_cles '.
-
 
48
								   '(id_observation, id_mot_cle_utilisateur)'.
-
 
49
								   'VALUES (';
43
 
50
								   
44
		if (isset($pairs['action'])) {
51
		foreach($ids_obs as $obs) {
-
 
52
			foreach($mots_cles as $mot) {
-
 
53
				$requete_liaison_mots_cles .= '('.$obs.','.$mot.')';
-
 
54
			}
45
			$action = $pairs['action'];
55
			$this->regenererIndexTexteMotCleObservation($obs, $pairs['ce_utilisateur']);
46
		}
-
 
47
 
-
 
48
		$valeur = $pairs['mots_cles'];
-
 
49
		$valeur = $this->nettoyerMotsCles($valeur);
-
 
50
		$requete =	'UPDATE cel_inventory '.
-
 
51
					"SET mots_cles = REPLACE(CONCAT(IFNULL(mots_cles, ''), '$valeur;'), 'null', '') ".
-
 
52
					"WHERE ordre IN ({$uid[1]}) AND identifiant = ".$this->proteger($uid[0]);
56
		}
53
 
-
 
54
		$resultat = $this->executerRequeteSimple($requete);
57
 
55
		
-
 
56
		$retour = false;
-
 
57
		if ($resultat) {
58
		$resultat_liaison_mots_cles = $this->executer($requete_liaison_mots_cles);
58
			$retour = true;
59
		
59
		} else {
-
 
60
			$this->logger('CEL_bugs', "Erreur de mise à jour des mots clés d'une obs : $requete");
-
 
61
		}
-
 
62
		
-
 
63
		$tableau_id_obs = split(',', $uid[1]);
-
 
64
		foreach($tableau_id_obs as $ordre_obs) {
60
		if(!$resultat_liaison_mots_cles) {
65
			$this->regenererIndexTexteMotCleObservation($ordre_obs, $uid[0]);
61
			$this->logger('CEL_bugs', "Erreur d'ajout de mots clés à des obs : ".$requete_liaison_mots_cles);	
66
		}
62
		}
67
 
63
		
68
		return $retour;
64
		return $resultat_liaison_mots_cles;		
69
	}
65
	}
70
 
66
 
71
	public function deleteElement($uid){
67
	public function deleteElement($uid){
72
		$retour = false;
68
		$retour = false;
73
		
69
		
74
		// Controle detournement utilisateur
70
		// Controle detournement utilisateur
75
		session_start();
71
		session_start();
-
 
72
		$this->controleUtilisateur($uid[0]);
-
 
73
	
76
		if ($_SESSION['user'] != '' && $_SESSION['user']['name'] != $uid[0]) {
74
		if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2])) {
-
 
75
			return;
-
 
76
		}
-
 
77
		
-
 
78
		$mots_cle = $this->nettoyerMotsCles($uid[2]);
-
 
79
		$mots_cle = $this->proteger($mots_cle);
-
 
80
		
-
 
81
		$ordre_observations = $uid[1];
-
 
82
		$id_utilisateur = $uid[0];
-
 
83
		
-
 
84
		$gestionnaire_observation = new RechercheObservation($this->config);
-
 
85
		$ids_obs = $gestionnaire_observation->obtenirIdObservationsPourOrdre($id_utilisateur,$ordre_observations);
-
 
86
		
-
 
87
		$requete_suppression_liaison_mot_cle = 'DELETE FROM cel_obs_mots_cles WHERE ';
-
 
88
											   'id_observation IN ('.implode(',',$ids_obs).') '.
-
 
89
											   'AND id_mot_cle_utilisateur IN ('.$mots_cle.')';
-
 
90
		
-
 
91
		$resultat_suppression_mot_cle = $this->executer($requete_suppression_liaison_mot_cle);
-
 
92
		
-
 
93
		if ($resultat_suppression_mot_cle) {
77
			print "Acces interdit";
94
			$retour = true;
78
		} else {
95
		} else {
79
			if (!isset($uid[2]) || !isset($uid[1])) {
-
 
80
				print 'pas de mots clés';
-
 
81
			} else {
-
 
82
				$mot_cle = $this->nettoyerMotsCles($uid[2]);
96
			$message = "Erreur de suppression des mots clés de plusieurs observations : $requete";
83
				$mot_cle = $this->proteger($mot_cle);
97
			$this->logger($message);
84
		
98
		}
85
				$requete =	'UPDATE cel_inventory '.
-
 
86
							"SET mots_cles = REPLACE(REPLACE(mots_cles, '$mot_cle', ''), ';;', ';') ".
-
 
87
							"WHERE ordre IN ({$uid[1]}) ".
-
 
88
							"	AND identifiant = '".$DB->escapeSimple($uid[0])."'";
-
 
89
				$resultat = $this->executerRequeteSimple($requete);
-
 
90
		
99
		
91
				if ($resultat) {
100
		foreach($ids_obs as $obs) {
92
					$retour = true;
-
 
93
				} else {
-
 
94
					$e = "Erreur de suppression des mots clés de plusieurs observations : $requete";
101
			$this->regenererIndexTexteMotCleObservation($obs, $id_utilisateur);	
95
					$this->logger('CEL_bugs', $e);
-
 
96
				}
-
 
97
			}
-
 
98
		}
102
		}
99
 
103
 
100
		return $retour;
104
		return $retour;
101
	}
105
	}
102
	
106
	
103
	private function regenererIndexTexteMotCleObservation($ordre_observation, $identifiant_utilisateur) {
107
	private function regenererIndexTexteMotCleObservation($id_observation, $identifiant_utilisateur) {
104
		$mots_cles_obs = $this->obtenirMotsClesObs($ordre_observation, $identifiant_utilisateur);
108
		$mots_cles_obs = $this->obtenirMotsClesObs($id_observation, $identifiant_utilisateur);
105
		
109
		
106
		if (count($mots_cles_obs) > 0) {
110
		if (count($mots_cles_obs) > 0) {
107
			$tableau_texte_mots_cles = $this->obtenirMotClesTexte($mots_cles_obs[0]['mots_cles'], $identifiant_utilisateur);
111
			$tableau_texte_mots_cles = $this->obtenirMotClesTexte($mots_cles_obs[0]['mots_cles'], $identifiant_utilisateur);
108
			$mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($tableau_texte_mots_cles);
112
			$mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($tableau_texte_mots_cles);
109
			$this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $ordre_observation, $identifiant_utilisateur);
113
			$this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_observation, $identifiant_utilisateur);
110
		}
114
		}
111
	}
115
	}
-
 
116
	
-
 
117
	//TODO : a refaire 
112
	
118
	
113
	private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $ordre_observation, $identifiant_utilisateur) {
119
	private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_observation, $identifiant_utilisateur) {
114
		$requete = 	'UPDATE cel_inventory '.
120
		$requete = 	'UPDATE cel_obs '.
115
					'SET mots_cles_texte = '.$this->proteger($mots_cles_texte_chaine).' '.
121
					'SET mots_cles_texte = '.$this->proteger($mots_cles_texte_chaine).' '.
116
					'WHERE ordre = '.$this->proteger($ordre_observation).
122
					'WHERE id_observation = '.$this->proteger($id_observation).
117
					'	AND identifiant = '.$this->proteger($identifiant_utilisateur);
123
					'	AND identifiant = '.$this->proteger($identifiant_utilisateur);
118
		
124
		
119
		$this->executerRequeteSimple($requete);
125
		$this->executerRequeteSimple($requete);
120
	}
126
	}
121
	
127
	
122
	private function obtenirMotsClesObs($ordre_observation, $identifiant_utilisateur) {
128
	private function obtenirMotsClesTexte($id_observation, $identifiant_utilisateur) {
123
		$requete = 	'SELECT mots_cles '.
129
		$requete = 	'SELECT mots_cles_texte '.
124
					'FROM cel_inventory '.
130
					'FROM cel_obs '.
125
					'WHERE ordre = '.$this->proteger($ordre_observation).
131
					'WHERE id_observation = '.$this->proteger($id_observation).
126
					'	AND identifiant = '.$this->proteger($identifiant_utilisateur);
132
					'	AND identifiant = '.$this->proteger($identifiant_utilisateur);
127
		
133
		
128
		$resultats = $this->executerRequete($requete);
134
		$resultats = $this->executerRequete($requete);
129
				
135
				
130
		return $resultats;
136
		return $resultats;
131
	}
137
	}
132
	
-
 
133
	private function obtenirMotClesTexte($chaine_mot_cle, $identifiant_utilisateur) {
-
 
134
		$chaine_mot_cle_obs = $this->formaterChaineMotClePourConditionSql($chaine_mot_cle);
-
 
135
		
-
 
136
		$requete = 'SELECT cmc_mot_cle FROM cel_mots_cles_obs '.
-
 
137
					'WHERE cmc_id_mot_cle_utilisateur IN ('.$chaine_mot_cle_obs.') '.
-
 
138
					'AND cmc_id_proprietaire = '.$this->proteger($identifiant_utilisateur);
-
 
139
												
-
 
140
		$resultat = $this->executerRequete($requete);
-
 
141
		
-
 
142
		return $resultat;
-
 
143
	}
-
 
144
	
138
	
145
	private function formaterChaineMotClePourConditionSql($chaine_mot_cle_obs) {
139
	private function formaterChaineMotClePourConditionSql($chaine_mot_cle_obs) {
146
		$chaine_mot_cle_obs = $this->nettoyerMotsCles($chaine_mot_cle_obs);
140
		$chaine_mot_cle_obs = $this->nettoyerMotsCles($chaine_mot_cle_obs);
147
		$chaine_mot_cle_obs = str_replace(self::SEPARATEUR_MOT_CLE_ID, ',', $chaine_mot_cle_obs);
141
		$chaine_mot_cle_obs = str_replace(self::SEPARATEUR_MOT_CLE_ID, ',', $chaine_mot_cle_obs);
148
		$chaine_mot_cle_obs = trim($chaine_mot_cle_obs, ',');
142
		$chaine_mot_cle_obs = trim($chaine_mot_cle_obs, ',');
149
		
143
		
150
		return $chaine_mot_cle_obs;
144
		return $chaine_mot_cle_obs;
151
	}
145
	}
152
	
146
	
153
	private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
147
	private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
154
		$mot_cles_texte_chaine = '';
148
		$mot_cles_texte_chaine = '';
155
		
149
		
156
		if (is_array($tableau_mots_cles_texte)) { 
150
		if (is_array($tableau_mots_cles_texte)) { 
157
			foreach ($tableau_mots_cles_texte as $mot_cle) {
151
			foreach ($tableau_mots_cles_texte as $mot_cle) {
158
				$mot_cles_texte_chaine .= $mot_cle['cmc_mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
152
				$mot_cles_texte_chaine .= $mot_cle['cmc_mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
159
			}
153
			}
160
		}
154
		}
161
		
155
		
162
		$mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
156
		$mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
163
		
157
		
164
		return $mot_cles_texte_chaine;
158
		return $mot_cles_texte_chaine;
165
	}
159
	}
166
	
160
	
167
	private function nettoyerMotsCles($chaine) {
161
	private function nettoyerMotsCles($chaine) {
168
		$valeur = str_replace('null', '', $chaine);
162
		$valeur = str_replace('null', '', $chaine);
169
		$valeur = trim($valeur, ';;');
163
		$valeur = trim($valeur, ';;');
170
		
164
		
171
		return $valeur;
165
		return $valeur;
172
	}
166
	}
173
	
167
	
174
	private function migrerMotsClesDansTableLiaison() {
168
	private function migrerMotsClesDansTableLiaison() {
175
		$requete = 	'SELECT id, ordre, identifiant, mots_cles '.
169
		$requete = 	'SELECT id, ordre, identifiant, mots_cles '.
176
					'FROM cel_inventory '.
170
					'FROM cel_inventory '.
177
					'WHERE TRIM(mots_cles) != "" ';
171
					'WHERE TRIM(mots_cles) != "" ';
178
		$obs_mots_cles = $this->executerRequete($requete);
172
		$obs_mots_cles = $this->executerRequete($requete);
179
		
173
		
180
		echo '<pre>'.print_r($obs_mots_cles, true).'</pre>';
174
		echo '<pre>'.print_r($obs_mots_cles, true).'</pre>';
181
		
175
		
182
		$max = 20000;
176
		$max = 20000;
183
		$i = 0;
177
		$i = 0;
184
		foreach ($obs_mots_cles as $obs_mc) {
178
		foreach ($obs_mots_cles as $obs_mc) {
185
			$mots_cles_nettoyes = $this->nettoyerMotsCles($obs_mc['mots_cles']);
179
			$mots_cles_nettoyes = $this->nettoyerMotsCles($obs_mc['mots_cles']);
186
			$tableau_mots_cles_codes = split(self::SEPARATEUR_MOT_CLE_ID, $mots_cles_nettoyes);
180
			$tableau_mots_cles_codes = split(self::SEPARATEUR_MOT_CLE_ID, $mots_cles_nettoyes);
187
			
181
			
188
			$requete_values = '';
182
			$requete_values = '';
189
			
183
			
190
			if (count($tableau_mots_cles_codes) > 0) {
184
			if (count($tableau_mots_cles_codes) > 0) {
191
				foreach($tableau_mots_cles_codes as $mots_cles_codes) {
185
				foreach($tableau_mots_cles_codes as $mots_cles_codes) {
192
					$mots_cles_codes = trim($mots_cles_codes, self::SEPARATEUR_MOT_CLE_ID);
186
					$mots_cles_codes = trim($mots_cles_codes, self::SEPARATEUR_MOT_CLE_ID);
193
					if ($this->estUnIdentifiantMotCle($mots_cles_codes)) {							
187
					if ($this->estUnIdentifiantMotCle($mots_cles_codes)) {							
194
						$requete_values .= '('.$mots_cles_codes.','.$obs_mc['id'].'),';
188
						$requete_values .= '('.$mots_cles_codes.','.$obs_mc['id'].'),';
195
					}
189
					}
196
				}
190
				}
197
				
191
				
198
				$requete_values = rtrim($requete_values, ',');
192
				$requete_values = rtrim($requete_values, ',');
199
				if (trim($requete_values) != '') { 
193
				if (trim($requete_values) != '') { 
200
					$requete = 	'INSERT IGNORE INTO cel_obs_mots_cles (ce_observation, ce_mot_cle) '.
194
					$requete = 	'INSERT IGNORE INTO cel_obs_mots_cles (id_observation, id_mot_cle_utilisateur) '.
201
								'VALUES '.$requete_values.' ';
195
								'VALUES '.$requete_values.' ';
202
					echo $requete.'<br />';
196
					echo $requete.'<br />';
203
					$i++;
197
					$i++;
204
				}
198
				}
205
			}
199
			}
206
		}
200
		}
207
	}
201
	}
208
	
202
	
209
	private function estUnIdentifiantMotCle($chaine) {
203
	private function estUnIdentifiantMotCle($chaine) {
210
		return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
204
		return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
211
	}
205
	}
212
}
206
}
213
?>
207
?>