Subversion Repositories eFlore/Applications.del

Rev

Rev 1233 | Rev 1285 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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