Subversion Repositories eFlore/Applications.cel

Rev

Rev 828 | Rev 936 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
416 aurelien 1
<?php
819 jpm 2
// declare(encoding='UTF-8');
416 aurelien 3
/**
930 aurelien 4
 * Service de liaisons de mots clés à des observations.
5
 * Le service lie une ou plusieurs mots clés à une ou plusieurs observations
6
 *
819 jpm 7
 * Encodage en entrée : utf8
8
 * Encodage en sortie : utf8
416 aurelien 9
 *
10
 * Cas d'utilisation :
11
 *
819 jpm 12
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
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>
15
 * @version $Id$
16
 * @copyright © 2011, Tela-Botanica
416 aurelien 17
 */
819 jpm 18
class InventoryKeyWordObsLink extends Cel {
19
 
20
	const SEPARATEUR_MOT_CLE_TEXTE = '##';
21
	const SEPARATEUR_MOT_CLE_ID = ';';
22
 
23
	public function getRessource() {
24
		//$this->migrerMotsClesDansTableLiaison();
25
	}
26
 
27
	public function getElement($uid) {
28
 
29
	}
930 aurelien 30
 
31
	public function createElement($pairs) {
32
 
416 aurelien 33
		// Controle detournement utilisateur
819 jpm 34
		session_start();
930 aurelien 35
		$this->controleUtilisateur($pairs['ce_utilisateur']);
819 jpm 36
 
930 aurelien 37
		if (!isset($pairs['mots_cles']) || !isset($pairs['observations']) || !isset($pairs['ce_utilisateur'])) {
819 jpm 38
			return;
39
		}
930 aurelien 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 (';
50
 
51
		foreach($ids_obs as $obs) {
52
			foreach($mots_cles as $mot) {
53
				$requete_liaison_mots_cles .= '('.$obs.','.$mot.')';
54
			}
55
			$this->regenererIndexTexteMotCleObservation($obs, $pairs['ce_utilisateur']);
819 jpm 56
		}
416 aurelien 57
 
930 aurelien 58
		$resultat_liaison_mots_cles = $this->executer($requete_liaison_mots_cles);
769 aurelien 59
 
930 aurelien 60
		if(!$resultat_liaison_mots_cles) {
61
			$this->logger('CEL_bugs', "Erreur d'ajout de mots clés à des obs : ".$requete_liaison_mots_cles);
769 aurelien 62
		}
63
 
930 aurelien 64
		return $resultat_liaison_mots_cles;
416 aurelien 65
	}
66
 
819 jpm 67
	public function deleteElement($uid){
68
		$retour = false;
69
 
70
		// Controle detournement utilisateur
71
		session_start();
930 aurelien 72
		$this->controleUtilisateur($uid[0]);
73
 
74
		if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2])) {
75
			return;
76
		}
819 jpm 77
 
930 aurelien 78
		$mots_cle = $this->nettoyerMotsCles($uid[2]);
79
		$mots_cle = $this->proteger($mots_cle);
819 jpm 80
 
930 aurelien 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) {
94
			$retour = true;
95
		} else {
96
			$message = "Erreur de suppression des mots clés de plusieurs observations : $requete";
97
			$this->logger($message);
819 jpm 98
		}
930 aurelien 99
 
100
		foreach($ids_obs as $obs) {
101
			$this->regenererIndexTexteMotCleObservation($obs, $id_utilisateur);
102
		}
416 aurelien 103
 
819 jpm 104
		return $retour;
769 aurelien 105
	}
106
 
930 aurelien 107
	private function regenererIndexTexteMotCleObservation($id_observation, $identifiant_utilisateur) {
108
		$mots_cles_obs = $this->obtenirMotsClesObs($id_observation, $identifiant_utilisateur);
769 aurelien 109
 
819 jpm 110
		if (count($mots_cles_obs) > 0) {
111
			$tableau_texte_mots_cles = $this->obtenirMotClesTexte($mots_cles_obs[0]['mots_cles'], $identifiant_utilisateur);
769 aurelien 112
			$mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($tableau_texte_mots_cles);
930 aurelien 113
			$this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_observation, $identifiant_utilisateur);
769 aurelien 114
		}
416 aurelien 115
	}
769 aurelien 116
 
930 aurelien 117
	//TODO : a refaire
118
 
119
	private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_observation, $identifiant_utilisateur) {
120
		$requete = 	'UPDATE cel_obs '.
819 jpm 121
					'SET mots_cles_texte = '.$this->proteger($mots_cles_texte_chaine).' '.
930 aurelien 122
					'WHERE id_observation = '.$this->proteger($id_observation).
819 jpm 123
					'	AND identifiant = '.$this->proteger($identifiant_utilisateur);
769 aurelien 124
 
819 jpm 125
		$this->executerRequeteSimple($requete);
769 aurelien 126
	}
127
 
930 aurelien 128
	private function obtenirMotsClesTexte($id_observation, $identifiant_utilisateur) {
129
		$requete = 	'SELECT mots_cles_texte '.
130
					'FROM cel_obs '.
131
					'WHERE id_observation = '.$this->proteger($id_observation).
819 jpm 132
					'	AND identifiant = '.$this->proteger($identifiant_utilisateur);
769 aurelien 133
 
819 jpm 134
		$resultats = $this->executerRequete($requete);
769 aurelien 135
 
819 jpm 136
		return $resultats;
769 aurelien 137
	}
138
 
139
	private function formaterChaineMotClePourConditionSql($chaine_mot_cle_obs) {
819 jpm 140
		$chaine_mot_cle_obs = $this->nettoyerMotsCles($chaine_mot_cle_obs);
141
		$chaine_mot_cle_obs = str_replace(self::SEPARATEUR_MOT_CLE_ID, ',', $chaine_mot_cle_obs);
142
		$chaine_mot_cle_obs = trim($chaine_mot_cle_obs, ',');
769 aurelien 143
 
819 jpm 144
		return $chaine_mot_cle_obs;
769 aurelien 145
	}
146
 
147
	private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
819 jpm 148
		$mot_cles_texte_chaine = '';
769 aurelien 149
 
819 jpm 150
		if (is_array($tableau_mots_cles_texte)) {
151
			foreach ($tableau_mots_cles_texte as $mot_cle) {
152
				$mot_cles_texte_chaine .= $mot_cle['cmc_mot_cle'].self::SEPARATEUR_MOT_CLE_TEXTE;
769 aurelien 153
			}
819 jpm 154
		}
155
 
156
		$mot_cles_texte_chaine = rtrim($mot_cles_texte_chaine, self::SEPARATEUR_MOT_CLE_TEXTE);
157
 
158
		return $mot_cles_texte_chaine;
769 aurelien 159
	}
160
 
161
	private function nettoyerMotsCles($chaine) {
819 jpm 162
		$valeur = str_replace('null', '', $chaine);
163
		$valeur = trim($valeur, ';;');
769 aurelien 164
 
819 jpm 165
		return $valeur;
769 aurelien 166
	}
167
 
168
	private function migrerMotsClesDansTableLiaison() {
819 jpm 169
		$requete = 	'SELECT id, ordre, identifiant, mots_cles '.
170
					'FROM cel_inventory '.
171
					'WHERE TRIM(mots_cles) != "" ';
172
		$obs_mots_cles = $this->executerRequete($requete);
769 aurelien 173
 
819 jpm 174
		echo '<pre>'.print_r($obs_mots_cles, true).'</pre>';
769 aurelien 175
 
176
		$max = 20000;
177
		$i = 0;
819 jpm 178
		foreach ($obs_mots_cles as $obs_mc) {
769 aurelien 179
			$mots_cles_nettoyes = $this->nettoyerMotsCles($obs_mc['mots_cles']);
819 jpm 180
			$tableau_mots_cles_codes = split(self::SEPARATEUR_MOT_CLE_ID, $mots_cles_nettoyes);
769 aurelien 181
 
819 jpm 182
			$requete_values = '';
769 aurelien 183
 
819 jpm 184
			if (count($tableau_mots_cles_codes) > 0) {
769 aurelien 185
				foreach($tableau_mots_cles_codes as $mots_cles_codes) {
819 jpm 186
					$mots_cles_codes = trim($mots_cles_codes, self::SEPARATEUR_MOT_CLE_ID);
187
					if ($this->estUnIdentifiantMotCle($mots_cles_codes)) {
188
						$requete_values .= '('.$mots_cles_codes.','.$obs_mc['id'].'),';
769 aurelien 189
					}
190
				}
191
 
819 jpm 192
				$requete_values = rtrim($requete_values, ',');
193
				if (trim($requete_values) != '') {
930 aurelien 194
					$requete = 	'INSERT IGNORE INTO cel_obs_mots_cles (id_observation, id_mot_cle_utilisateur) '.
819 jpm 195
								'VALUES '.$requete_values.' ';
196
					echo $requete.'<br />';
769 aurelien 197
					$i++;
198
				}
199
			}
200
		}
201
	}
202
 
203
	private function estUnIdentifiantMotCle($chaine) {
819 jpm 204
		return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
769 aurelien 205
	}
416 aurelien 206
}
207
?>