Subversion Repositories eFlore/Applications.del

Rev

Rev 1229 | 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
	 * */
51
	public function consulter($params = array()) {
52
		$this->verifierConfiguration();
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
 
110
		$requete =  'SELECT id_vote, prenom, nom, nom_sel, intitule, ce_image,  valeur, do.id_observation as del_obs, divo.date as date_vote '.
111
					' FROM `del_image_vote` divo '.
112
					' INNER JOIN del_image_protocole ON ce_protocole = id_protocole '.
113
					' INNER JOIN del_obs_image doi ON ce_image = id_image '.
114
					' INNER JOIN del_observation  do ON do.id_observation = doi.id_observation '.
115
					' INNER JOIN del_utilisateur ON do.ce_utilisateur = id_utilisateur '.
116
					$this->chargerClauseWhere()." ".
117
					' ORDER BY divo.date DESC '.
118
					' LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite();
119
		$elements = $this->gestionBdd->getBdd()->recupererTous($requete);
120
		return $elements;
121
	}
122
 
123
 
124
	/**
125
	 * Formater les données pour mettre en page le RSS
126
	 * */
127
	private function formaterPourRss($elements) {
128
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
129
		foreach ($elements as $element) {
1229 gduche 130
			$identifiants[$element['id_vote']] = $element['id_vote'];
1227 gduche 131
		}
132
		foreach ($elements as $element) {
133
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
134
		}
135
		return $donnees;
136
	}
137
 
138
	/**
139
	 * Générer les métadonnées du flux (titre, dates, editeur etc.)
140
	 * */
141
	private function construireDonneesCommunesAuFlux($infos) {
142
		$donnees = array();
143
		$donnees['guid'] = '';
144
		$donnees['titre'] = 'Derniers votes sur les images de l\'application PictoFlora';
145
		$donnees['description'] = 'Ce flux regroupe les derniers votes sur les images de Pictoflora';
146
		$donnees['lien_service'] = $this->creerUrlService();
147
		$donnees['lien_del'] = $this->conteneur->getParametre('pictoAppliLien');
148
		$donnees['editeur'] = $this->conteneur->getParametre('editeur');
149
		$derniere_info_en_date = reset($infos);
1229 gduche 150
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_vote']);
1227 gduche 151
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
152
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
153
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
154
		$donnees['annee_courante'] = date('Y');
155
		$donnees['generateur'] = 'DEL - SyndicationCommentaire';
156
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
157
		return $donnees;
158
	}
159
 
160
	/**
161
	 * Générer le lien du flux RSS
162
	 * */
163
	private function creerUrlService() {
164
		$url_service = $this->conteneur->getParametre('url_service');
165
		$url_service .= '/'.$this->type_rss;
166
		//$url_service = '';
167
		if (count($_GET) > 0) {
168
			$parametres_get = array();
169
			foreach ($_GET as $cle => $valeur) {
170
				$parametres_get[] = $cle.'='.$valeur;
171
			}
172
			$url_service .= '?'.implode('&amp;', $parametres_get);
173
		}
174
		return $url_service;
175
	}
176
 
177
	/**
178
	 * Générer les données communes & spécifiques à chaque item
179
	 * */
180
	private function construireDonneesCommunesAuxItems($info) {
181
		$item = array();
1229 gduche 182
		$date_modification_timestamp = strtotime($info['date_vote']);
1227 gduche 183
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
184
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
185
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
186
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
187
		$item['titre'] = $this->creerTitre($info);
188
		$item['guid'] = $this->creerGuidItem($info);
189
		$item['lien'] = $this->creerLienItem($info);
190
		$item['categorie'] = $this->creerCategorie($item);
191
		$item['description'] = $this->creerDescription($info, $item);
192
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
193
		$item['modifie_par'] = $this->creerAuteur($info);
194
		return $item;
195
	}
196
 
197
 
198
	private function creerCategorie($element) {
199
		$categorie = 'Vote protocole';
200
		$categorie = htmlentities($categorie);
201
		return $categorie;
202
	}
203
 
204
	private function creerGuidItem($element) {
205
		$guid = sprintf($this->conteneur->getParametre('voteParProtocole'), $element['id_vote']);
206
		return $guid;
207
	}
208
 
209
	private function creerLienItem($element) {
210
		$lien = sprintf($this->conteneur->getParametre('pictofloraFicheObsTpl'), $element['del_obs']);
211
		return $lien;
212
	}
213
 
214
	private function creerTitre($element) {
215
		$intitule = 'Vote';
1230 gduche 216
		$titre = $intitule.' '.$element['valeur'].' - '.htmlspecialchars($this->creerAuteur($element)).' ('.htmlspecialchars($element['nom_sel']).', par '.htmlspecialchars($this->creerAuteur($element));
1227 gduche 217
		return $titre;
218
	}
219
 
220
	private function creerDescription($donnees, $item) {
221
		$description = '<ul>';
222
		$description .= '<li>Image : '.htmlspecialchars($donnees['ce_image']).'</li>';
223
		$description .= '<li>Proposition : <em>'.htmlspecialchars($donnees['nom_sel']).'</em></li>';
224
		$description .= '<li>Protocole : '.htmlspecialchars($donnees['intitule']).'</li>';
225
		$description .= '<li>Valeur : '.$donnees['valeur'].'</li>';
226
 
227
		$auteur = htmlspecialchars($this->creerAuteur($donnees));
228
		$auteur .= $this->fluxAdminDemande() ? ' ('.$donnees['utilisateur_courriel'].')' : '';
229
 
230
		$description .= '<li>Auteur : '.$auteur.'</li>'.
231
		             	'</ul>';
232
		return $description;
233
	}
234
 
235
	private function creerAuteur($info) {
236
		return $info['prenom'].' '.$info['nom'];
237
	}
238
 
239
 
240
 
241
	/**
242
	* Charger la clause WHERE en fonction des paramètres de masque
243
	* */
244
	private function chargerClauseWhere() {
245
		$where = array();
246
		$tableauMasque = $this->masque->getMasque();
247
		if (!empty($tableauMasque)) {
248
			foreach($tableauMasque as $idMasque => $valeurMasque) {
249
				$idMasque = str_replace('masque.', '', $idMasque);
250
				switch ($idMasque) {
251
					case 'image':
252
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque);
253
					break;
254
					case 'protocole':
255
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque).' ';
256
					break;
257
					default:
258
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque);
259
					break;
260
				}
261
			}
262
		}
263
		if (!empty($where)) {
264
			return ' WHERE '.implode('AND', $where);
265
		} else {
266
			return;
267
		}
268
	}
269
 
270
	private function creerFiltreAuteur($valeurMasque) {
271
		$masque = '';
272
		$auteurId = $valeurMasque;
273
		if (is_numeric($auteurId)) {
274
			$masque = ' dc.ce_utilisateur = '.$auteurId;
275
		} else {
276
			if (strpos($auteurId, '@') === false) {
277
				$tableauNomPrenom = explode(' ',$auteurId, 2);
278
				if(count($tableauNomPrenom) == 2) {
279
					// on teste potentiellement un nom prenom ou bien un prénom nom
280
					$masque = '('.
281
							          	'(dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[0].'%').' AND '.
282
									  	'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[1].'%').') OR '.
283
									 	'(dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[1].'%').' AND '.
284
									  	'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[0].'%').')'.
285
									  ')';
286
				} else {
287
					$masque = '(
288
							            (dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($auteurId.'%').' OR '.
289
										'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($auteurId.'%').')'.
290
									  ')';
291
				}
292
			} else {
293
				$masque = " dob.utilisateur_courriel LIKE ".$this->gestionBdd->getBdd()->proteger($valeurMasque.'%')." ";
294
			}
295
		}
296
		return $masque;
297
	}
298
}