Subversion Repositories eFlore/Applications.del

Rev

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

Rev Author Line No. Line
1227 gduche 1
<?php
2
/**
3
 * Service fournissant des informations concernant les votes sur les images de DEL en fonction d'un protocole
4
 * au format RSS1, RSS2 ou ATOM.
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
7
 *
8
 * @author Grégoire DUCHE <gregoire@tela-botanica.org>
9
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
11
 * @version $Id$
12
 * @copyright 2010
13
 */
14
class SyndicationVotesParProtocole {
15
 
16
 
17
	/**
18
	 * Paramètres du service
19
	 * */
20
	private $ressources = null;
21
	private $parametres = null;
22
	private $format = null;
23
	private $service = null;
24
	private $squelette = null;
25
	private $squelette_dossier = null;
26
	private $masque = array();
27
	private $mappingFiltre = array();
28
	private $conteneur = null;
29
	private $gestionBdd = null;
30
	private $navigation = null;
31
	private $type_rss = null;
32
 
33
	/**
34
	 * Constructeur
35
	 * Initialiser les configurations
36
	 * */
37
	public function __construct(Conteneur $conteneur = null) {
38
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
39
		$this->conteneur->chargerConfiguration('config_syndication_votesparprotocole.ini');
40
		$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
41
		$this->masque = $conteneur->getMasque();
42
		$this->gestionBdd = $conteneur->getGestionBdd();
43
		$this->navigation = $conteneur->getNavigation();
44
	}
45
 
46
	/**
47
	 * Consulter
48
	 * Méthode par défaut pour récupérer l'ensemble des votes.
49
	 * Vérifie la configuration et retourne les derniers votes formatés
50
	 * */
1247 gduche 51
	public function consulter($params = array()) {
52
		$this->verifierConfiguration();
1227 gduche 53
		$this->type_rss = $params[1];
54
		if ($this->fluxAdminDemande()) {
55
			$this->demanderAutorisationAdmin();
56
		}
57
 
58
		$donnees_brutes = $this->getDerniersVotesImage();
59
		$commentaires_formates = $this->formaterPourRss($donnees_brutes) ;
60
		return $commentaires_formates;
61
	}
62
 
63
	/**
64
	* Vérifier que le service est bien configuré
65
	* */
66
	public function verifierConfiguration() {
67
 
68
		$erreurs = array();
69
		$tableauImages = $this->conteneur->getParametre('mapping_masque');
70
 
71
		if (empty($this->mappingFiltre)) {
72
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_masque] ou celui-ci est vide ;';
73
		} else {
74
			$champsMappingFiltre = array('image', 'protocole');
75
			foreach ($champsMappingFiltre as $champ) {
76
				if (!isset($this->mappingFiltre[$champ])) {
77
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour le commentaire est manquant ;';
78
				}
79
			}
80
		}
81
 
82
		if (!empty($erreurs)) {
83
			$e = 'Erreur lors de la configuration : '."\n";
84
			$e .= implode("\n", $erreurs);
85
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
86
		}
87
	}
88
 
89
	/**
90
	 * Verifier si le flux admin est demandé
91
	 */
92
	private function fluxAdminDemande() {
93
		return $this->conteneur->getParametre('admin') != null && $this->conteneur->getParametre('admin') == 1;
94
	}
95
 
96
	/**
97
	 * Si le flux est un flux admin, demander un mot de passe
98
	 * */
99
	private function demanderAutorisationAdmin() {
100
		$verification = new ControleAcces($this->conteneur);
101
		$verification->demanderAuthentificationAdmin();
102
	}
103
 
104
 
105
	/**
106
	 * Retrouver les derniers votes image
107
	 * */
108
	private function getDerniersVotesImage() {
109
 
1247 gduche 110
		$requete =  'SELECT DISTINCT id_vote, duo.prenom AS observateur_prenom, duo.nom AS observateur_nom, du.prenom AS utilisateur_prenom, du.nom AS utilisateur_nom, nom_sel, intitule, ce_image,  valeur, dob.id_observation as del_obs, divo.date as date_vote '.
1227 gduche 111
					' FROM `del_image_vote` divo '.
1247 gduche 112
					' LEFT JOIN del_utilisateur AS du ON divo.ce_utilisateur = du.id_utilisateur '.
1233 gduche 113
					' INNER JOIN del_obs_image doi ON divo.ce_image = doi.id_image '.
114
					' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation '.
1227 gduche 115
					' INNER JOIN del_image_protocole ON ce_protocole = id_protocole '.
1247 gduche 116
					' INNER JOIN del_utilisateur AS duo ON dob.ce_utilisateur = duo.id_utilisateur '.
1227 gduche 117
					$this->chargerClauseWhere()." ".
118
					' ORDER BY divo.date DESC '.
119
					' LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite();
120
		$elements = $this->gestionBdd->getBdd()->recupererTous($requete);
121
		return $elements;
122
	}
123
 
124
 
125
	/**
126
	 * Formater les données pour mettre en page le RSS
127
	 * */
128
	private function formaterPourRss($elements) {
129
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
130
		foreach ($elements as $element) {
1229 gduche 131
			$identifiants[$element['id_vote']] = $element['id_vote'];
1227 gduche 132
		}
133
		foreach ($elements as $element) {
134
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
135
		}
136
		return $donnees;
137
	}
138
 
139
	/**
140
	 * Générer les métadonnées du flux (titre, dates, editeur etc.)
141
	 * */
142
	private function construireDonneesCommunesAuFlux($infos) {
143
		$donnees = array();
144
		$donnees['guid'] = '';
145
		$donnees['titre'] = 'Derniers votes sur les images de l\'application PictoFlora';
146
		$donnees['description'] = 'Ce flux regroupe les derniers votes sur les images de Pictoflora';
147
		$donnees['lien_service'] = $this->creerUrlService();
148
		$donnees['lien_del'] = $this->conteneur->getParametre('pictoAppliLien');
149
		$donnees['editeur'] = $this->conteneur->getParametre('editeur');
150
		$derniere_info_en_date = reset($infos);
1229 gduche 151
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_vote']);
1227 gduche 152
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
153
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
154
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
155
		$donnees['annee_courante'] = date('Y');
156
		$donnees['generateur'] = 'DEL - SyndicationCommentaire';
157
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
158
		return $donnees;
159
	}
160
 
161
	/**
162
	 * Générer le lien du flux RSS
163
	 * */
164
	private function creerUrlService() {
165
		$url_service = $this->conteneur->getParametre('url_service');
166
		$url_service .= '/'.$this->type_rss;
167
		//$url_service = '';
168
		if (count($_GET) > 0) {
169
			$parametres_get = array();
170
			foreach ($_GET as $cle => $valeur) {
171
				$parametres_get[] = $cle.'='.$valeur;
172
			}
173
			$url_service .= '?'.implode('&amp;', $parametres_get);
174
		}
175
		return $url_service;
176
	}
177
 
178
	/**
179
	 * Générer les données communes & spécifiques à chaque item
180
	 * */
181
	private function construireDonneesCommunesAuxItems($info) {
182
		$item = array();
1229 gduche 183
		$date_modification_timestamp = strtotime($info['date_vote']);
1227 gduche 184
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
185
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
186
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
187
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
188
		$item['titre'] = $this->creerTitre($info);
189
		$item['guid'] = $this->creerGuidItem($info);
190
		$item['lien'] = $this->creerLienItem($info);
191
		$item['categorie'] = $this->creerCategorie($item);
192
		$item['description'] = $this->creerDescription($info, $item);
193
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
194
		$item['modifie_par'] = $this->creerAuteur($info);
195
		return $item;
196
	}
197
 
198
 
199
	private function creerCategorie($element) {
200
		$categorie = 'Vote protocole';
201
		$categorie = htmlentities($categorie);
202
		return $categorie;
203
	}
204
 
205
	private function creerGuidItem($element) {
206
		$guid = sprintf($this->conteneur->getParametre('voteParProtocole'), $element['id_vote']);
207
		return $guid;
208
	}
209
 
210
	private function creerLienItem($element) {
211
		$lien = sprintf($this->conteneur->getParametre('pictofloraFicheObsTpl'), $element['del_obs']);
212
		return $lien;
213
	}
214
 
215
	private function creerTitre($element) {
216
		$intitule = 'Vote';
1247 gduche 217
		$utilisateur = array('prenom' => $element['utilisateur_prenom'], 'nom' => $element['utilisateur_nom']);
218
		$observateur = array('prenom' => $element['observateur_prenom'], 'nom' => $element['observateur_nom']);
219
		$titre = $intitule.' '.$element['valeur'].' - '.htmlspecialchars($this->creerAuteur($observateur)).' ('.htmlspecialchars($element['nom_sel']).', par '.htmlspecialchars($this->creerAuteur($utilisateur));
1227 gduche 220
		return $titre;
221
	}
222
 
223
	private function creerDescription($donnees, $item) {
1247 gduche 224
		$utilisateur = array('prenom' => $donnees['utilisateur_prenom'], 'nom' => $donnees['utilisateur_nom']);
225
		$utilisateurTxt = htmlspecialchars($this->creerAuteur($utilisateur));
226
 
227
		$observateur = array('prenom' => $donnees['observateur_prenom'], 'nom' => $donnees['observateur_nom']);
228
		$observateurTxt = htmlspecialchars($this->creerAuteur($observateur));
1227 gduche 229
 
1247 gduche 230
		$description = '<ul>'.
231
			'<li>Image : '.htmlspecialchars($donnees['ce_image']).'</li>'.
232
			'<li>Proposition : <em>'.htmlspecialchars($donnees['nom_sel']).'</em></li>'.
233
			'<li>Protocole : '.htmlspecialchars($donnees['intitule']).'</li>'.
234
			'<li>Valeur : '.$donnees['valeur'].'</li>'.
235
			'<li>Auteur : '.$observateurTxt.'</li>'.
236
			'<li>Votant : '.$utilisateurTxt.'</li>'.
237
			'</ul>';
1227 gduche 238
		return $description;
239
	}
240
 
241
	private function creerAuteur($info) {
242
		return $info['prenom'].' '.$info['nom'];
243
	}
244
 
245
 
246
 
247
	/**
248
	* Charger la clause WHERE en fonction des paramètres de masque
249
	* */
250
	private function chargerClauseWhere() {
251
		$where = array();
252
		$tableauMasque = $this->masque->getMasque();
253
		if (!empty($tableauMasque)) {
254
			foreach($tableauMasque as $idMasque => $valeurMasque) {
255
				$idMasque = str_replace('masque.', '', $idMasque);
256
				switch ($idMasque) {
257
					case 'image':
258
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque);
259
					break;
260
					case 'protocole':
261
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque).' ';
262
					break;
263
					default:
264
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque);
265
					break;
266
				}
267
			}
268
		}
269
		if (!empty($where)) {
270
			return ' WHERE '.implode('AND', $where);
271
		} else {
272
			return;
273
		}
274
	}
275
 
276
	private function creerFiltreAuteur($valeurMasque) {
277
		$masque = '';
278
		$auteurId = $valeurMasque;
279
		if (is_numeric($auteurId)) {
280
			$masque = ' dc.ce_utilisateur = '.$auteurId;
281
		} else {
282
			if (strpos($auteurId, '@') === false) {
283
				$tableauNomPrenom = explode(' ',$auteurId, 2);
284
				if(count($tableauNomPrenom) == 2) {
285
					// on teste potentiellement un nom prenom ou bien un prénom nom
286
					$masque = '('.
287
							          	'(dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[0].'%').' AND '.
288
									  	'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[1].'%').') OR '.
289
									 	'(dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[1].'%').' AND '.
290
									  	'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[0].'%').')'.
291
									  ')';
292
				} else {
293
					$masque = '(
294
							            (dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($auteurId.'%').' OR '.
295
										'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($auteurId.'%').')'.
296
									  ')';
297
				}
298
			} else {
299
				$masque = " dob.utilisateur_courriel LIKE ".$this->gestionBdd->getBdd()->proteger($valeurMasque.'%')." ";
300
			}
301
		}
302
		return $masque;
303
	}
1247 gduche 304
}