Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
416 aurelien 1
<?php
2
/**
3
 * Service fournissant des informations concernant le CEL au format RSS1, RSS2 ou ATOM.
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
6
 * Format du service :
7
 * /CelSyndicationObservation/liste-des-flux
8
 * /CelSyndicationObservation/opml
9
 * /CelSyndicationObservation/par-defaut/(rss1|rss2|atom)?start=0&limit=150
10
 * /CelSyndicationObservation/pour-admin/(rss1|rss2|atom)?start=0&limit=150
11
 * /CelSyndicationObservation/par-mots-cles/(rss1|rss2|atom)/mot-cle?start=0&limit=150
12
 * /CelSyndicationObservation/par-commune/(rss1|rss2|atom)/nom-commune?start=0&limit=150
13
 *
14
 * Les paramêtres :
15
 *  - "start" indique le numéro du premier item à afficher
16
 *  - "limit" nombre d'items à afficher
17
 *
18
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
19
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
20
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
21
 * @version $Id$
22
 * @copyright 2010
23
 */
24
class CelSyndicationObservation extends Cel {
25
 
26
	private $format = null;
27
	private $service = null;
502 aurelien 28
	public $parametres = null;
416 aurelien 29
	private $squelette = null;
30
	private $squelette_dossier = null;
31
	private $flux = array();
32
 
33
	/**
34
	 * Méthode appelée avec une requête de type GET.
35
	 */
36
	public function getElement($params = array()) {
37
		// Initialisation des variables
38
		$info = array();
39
		$contenu = '';
40
 
525 jpm 41
		if (! $this->etreFluxAdmin() || $this->authentifier()) {
42
			// Pré traitement des paramêtres
43
			$pour_bdd = false;
44
			$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
45
			extract($p);
46
			$this->parametres = $params;
47
			$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
416 aurelien 48
 
525 jpm 49
			// Récupération de la liste des flux
50
			$this->chargerListeDesFlux();
51
 
52
			// Chargement du bon type de service demandé
53
			if (isset($service)) {
54
				$this->service = $this->traiterNomService($service);
55
				$methode = $this->getNomMethodeService();
56
				if (method_exists($this, $methode)) {
57
					if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
58
						// Mise en minuscule de l'indication du format
59
						$this->format = strtolower($format);
60
						// Définition du fichier squelette demandé
61
						$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
62
					} else if (isset($this->flux[$this->service])) {
63
						$this->format = '';
64
						$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
65
					}
66
 
67
					if (!isset($this->flux[$this->service]) || isset($this->format)) {
68
						// Suppression des paramêtres inutile pour le reste des méthodes
69
						array_shift($this->parametres);
70
						array_shift($this->parametres);
71
 
72
						// Récupération du contenu à renvoyer
73
						$contenu = $this->$methode();
74
					}
75
				} else {
76
					$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
416 aurelien 77
				}
78
			} else {
525 jpm 79
				$this->messages[] = "Le service CEL Syndication Observation nécessite d'indiquer en premier paramètre le type d'information demandé.";
416 aurelien 80
			}
81
		}
82
 
83
		// Envoie sur la sortie standard
84
		$encodage = 'utf-8';
85
		$mime = $this->getTypeMime();
86
		$formatage_json = $this->getFormatageJson();
87
		$this->envoyer($contenu, $mime, $encodage, $formatage_json);
88
	}
89
 
90
	private function getUrlBase() {
91
		$url_base = sprintf($this->config['settings']['baseURLAbsoluDyn'], get_class($this).'/');
92
		return $url_base;
93
	}
94
 
95
	private function getUrlServiceBase() {
96
		$url_service = $this->getUrlBase().$this->service.'/'.$this->format;
97
		return $url_service;
98
	}
99
 
100
	private function traiterNomService($nom) {
101
		$nom = strtolower($nom);
102
		return $nom;
103
	}
104
 
105
	private function getNomMethodeService() {
106
		$methode = '';
107
		$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
108
		$methode = 'getService'.$service_formate;
109
		return $methode;
110
	}
111
 
112
	private function getTypeMime() {
113
		$mime = '';
114
		$test = isset($this->format) ? $this->format : $this->service;
115
		switch ($test) {
116
			case 'atom' :
117
				$mime = 'application/atom+xml';
118
				break;
119
			case 'rss1' :
120
			case 'rss2' :
121
				$mime = 'application/rss+xml';
122
				break;
123
			case 'opml' :
124
				$mime = 'text/x-opml';
125
				break;
126
			default:
127
				$mime = 'text/html';
128
		}
129
		return $mime;
130
	}
131
 
132
	private function getFormatageJson() {
133
		$json = false;
134
		switch ($this->service) {
135
			case 'liste-des-flux' :
136
				$json = true;
137
				break;
138
			default:
139
				$json = false;
140
		}
141
		return $json;
142
	}
143
 
144
	private function getFlux($nom) {
145
		return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
146
	}
147
 
148
	private function setFlux($nom, $titre, $description) {
149
		$url_base = $this->getUrlBase();
150
		$formats = array('atom', 'rss2', 'rss1');
151
		$flux = array();
152
		foreach ($formats as $format) {
153
			$url = $url_base.$nom.'/'.$format;
154
			$flux[$format] = $url;
155
		}
156
		$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
157
	}
158
 
159
	private function chargerListeDesFlux() {
160
		$this->setFlux('par-defaut', 'Flux de syndication des observations publiques du CEL',
161
			'Ce flux fournit des informations sur les observations du CEL.');
162
		$this->setFlux('par-mots-cles', 'Flux de syndication des observations publiques du CEL filtrées par mots clés',
163
			"Ce flux fournit des informations sur les observations du CEL filtrées par mots-clés. Il nécessite d'être
164
			paramétré en indiquant en dernier position de l'url le mot-clé à rechercher.");
165
		$this->setFlux('par-commune','Flux de syndication des observations publiques du CEL filtrées par commune',
166
			"Ce flux fournit des informations sur les observations du CEL filtrées par commune. Il nécessite d'être
167
			paramétré en indiquant en dernier position de l'url le nom de la commune à rechercher.");
168
	}
169
 
170
	private function getServiceListeDesFlux() {
171
		return $this->flux;
172
	}
173
 
174
	private function getServiceOpml() {
175
		$donnees = array();
176
		$id = 1;
177
		foreach ($this->flux as $flux_nom => $flux){
178
			$info = array();
179
			$info['type'] = 'atom';
180
			$info['titre'] = $flux['titre'];
181
			$info['texte'] = "CEL - Obs - $flux_nom";
182
			$info['description'] = $flux['description'];
183
			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
184
			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
185
			$donnees['liste_flux'][] = $info;
186
		}
187
 
188
		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
189
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
190
		return $contenu;
191
	}
192
 
193
	private function getServiceParDefaut() {
194
		// Construction de la requête
195
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
196
			'FROM cel_inventory '.
197
			'WHERE transmission = 1 '.
198
			'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'date_modification DESC').' '.
199
			"LIMIT $this->start,$this->limit ";
200
 
201
		$elements = $this->executerRequete($requete);
202
 
203
		// Création du contenu
204
		$contenu = $this->executerService($elements);
205
		return $contenu;
206
	}
207
 
208
	private function getServicePourAdmin() {
525 jpm 209
		// Construction de la requête
210
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
211
			'FROM cel_inventory '.
212
			'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'date_modification DESC').' '.
213
			"LIMIT $this->start,$this->limit ";
214
 
215
		$elements = $this->executerRequete($requete);
216
 
217
		// Création du contenu
218
		$contenu = $this->executerService($elements);
416 aurelien 219
		return $contenu;
220
	}
221
 
222
	private function getServiceParMotsCles() {
223
		$contenu = '';
224
		$mot_cle = $this->parametres[0];
225
 
226
		if (isset($mot_cle)) {
227
			$mot_cle_encode = $this->bdd->quote($this->encoderMotCle($mot_cle));
228
 
229
			// Construction de la requête
230
			$requete = 	'SELECT * '.
231
				'FROM cel_mots_cles_obs '.
232
				"WHERE cmc_id_mot_cle_general = $mot_cle_encode ";
233
			$elements = $this->executerRequete($requete);
234
 
235
			if ($elements != false && count($elements) > 0) {
236
				// Pré-construction du where de la requête
237
				$tpl_where = '(mots_cles LIKE "%%%s%%" AND identifiant = %s )';
238
				$requete_where = array();
239
				foreach ($elements as $occurence) {
240
					$requete_where[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire']));
241
				}
242
 
243
				// Construction de la requête
244
				$requete = 	'SELECT * '.
245
					'FROM cel_inventory '.
246
					'WHERE transmission = 1 '.
247
					'AND '.implode(" \nOR ", $requete_where).' '.
248
					'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'date_modification, date_creation DESC').' '.
249
					"LIMIT $this->start,$this->limit ";
250
				$elements = $this->executerRequete($requete);
251
 
252
				// Création du contenu
253
				$contenu = $this->executerService($elements);
254
			} else {
255
				$this->messages[] = "Aucune observation ne correspond à ce mot clé.";
256
			}
257
		} else {
258
			$this->messages[] = "Le service demandé nécessite d'indiquer un mot-clé en dernier paramêtre.";
259
		}
260
		return $contenu;
261
	}
262
 
263
	private function getServiceParCommune() {
264
		$contenu = '';
265
		$commune = $this->parametres[0];
266
		if (isset($commune)) {
267
			$commune = $this->bdd->quote($commune);
268
 
269
			// Construction de la requête
270
			$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
271
				'FROM cel_inventory '.
272
				'WHERE transmission = 1 '.
273
				"AND location = $commune ".
274
				'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'date_modification DESC, location ASC').' '.
275
				"LIMIT $this->start,$this->limit ";
276
 
277
			$elements = $this->executerRequete($requete);
278
 
279
			// Création du contenu
280
			$contenu = $this->executerService($elements);
281
		} else {
282
			$this->messages[] = "Le service demandé nécessite d'indiquer une nom de commune en dernier paramêtre.";
283
		}
284
		return $contenu;
285
	}
286
 
287
	private function executerService($elements) {
288
		$contenu = '';
289
		if (is_array($elements)) {
290
			// Prétraitement des données
291
			$donnees = $this->construireDonneesCommunesAuFlux($elements);
292
 
293
			foreach ($elements as $element) {
294
				$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
295
			}
296
 
297
			// Création du contenu à partir d'un template PHP
298
			if (isset($this->squelette)) {
299
				$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
300
			}
301
		}
302
		return $contenu;
303
	}
304
 
305
	private function construireDonneesCommunesAuFlux($observations) {
306
		$donnees = $this->getFlux($this->service);
307
		$donnees['guid'] = $this->getUrlServiceBase();
308
		$donnees['lien_service'] = $this->creerUrlService();
309
		$donnees['lien_cel'] = $this->config['settings']['celUrlAbsolu'];
310
		$donnees['editeur'] = $this->config['settings']['editeur'];
311
		$derniere_info_en_date = reset($observations);
312
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']);
313
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
314
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
315
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
316
		$donnees['annee_courante'] = date('Y');
317
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation';
318
		preg_match('/([0-9]+)/', '$Revision$', $match);
319
		$donnees['generateur_version'] = $match[1];
320
		return $donnees;
321
	}
322
 
323
	private function construireDonneesCommunesAuxItems($observation) {
324
		$item = array();
325
		$date_modification_timestamp = strtotime($observation['date_modification']);
326
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
327
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
328
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
329
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
330
		$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation']));
331
		$item['titre'] = $this->creerTitre($observation);
332
		$item['guid'] = $this->creerGuidItem($observation);
333
		$item['lien'] = $this->creerLienItem($observation);
334
		$item['description'] = $this->creerDescription($observation, $item);
335
		$item['categorie'] = $this->creerCategorie($item);
336
		$item['description_encodee'] = htmlspecialchars($item['description']);
522 jpm 337
		$item['modifier_par'] = $this->creerAuteur($observation['identifiant'], $this->etreFluxAdmin());
416 aurelien 338
		return $item;
339
	}
340
 
341
	private function creerTitre($obs) {
342
		$nom_plante = $obs['nom_sel'].' [nn'.$obs['num_nom_sel'].']';
343
		$lieu = $obs['location'].' ('.$obs['id_location'].')';
522 jpm 344
		$utilisateur = $this->creerAuteur($obs['identifiant'], $this->etreFluxAdmin());
416 aurelien 345
		$titre = "$nom_plante à $lieu par $utilisateur";
346
		$titre = $this->nettoyerTexte($titre);
347
		return $titre;
348
	}
349
 
350
	private function creerGuidItem($element) {
351
		$guid = sprintf($this->config['settings']['guidObsTpl'], 'obs'.$element['id']);
352
		return $guid;
353
	}
354
 
355
	private function creerLienItem($element) {
506 jpm 356
		$lien = null;
357
		if ($element['num_nom_sel'] != 0) {
358
			$lien = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($element['num_nom_sel']));
359
		}
416 aurelien 360
		return $lien;
361
	}
362
 
363
	private function creerDescription($obs, $item) {
364
		$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id']);
365
		$description =
366
			'<ul>'.
367
			'	<li>Nom saisi : '.$obs['nom_sel'].'</li>'.
368
			(($obs['nom_sel'] != $obs['nom_ret']) ? '	<li>Nom retenu : '.$obs['nom_ret'].'</li>' : '').
369
			'	<li>Lieu : '.$obs['location'].' ('.$obs['id_location'].')</li>'.
370
			($this->etreNull($obs['station']) ? '': '	<li>Station : '.$obs['station'].'</li>').
371
			($this->etreNull($obs['milieu']) ? '': '	<li>Milieu : '.$obs['milieu'].'</li>').
372
			($this->etreNull($obs['commentaire']) ? '': '	<li>Commentaire : '.$obs['commentaire'].'</li>').
373
			(($this->etreFluxAdmin()) ? '	<li>Transmis (= public) : '.($obs['transmission'] == 1 ? 'oui' : 'non').'</li>' : '').
374
			'	<li>Modifiée le : '.$item['date_maj_simple'].'</li>'.
375
			'	<li>Créée le : '.$item['date_creation_simple'].'</li>'.
376
			(($this->etreFluxAdmin()) ? '	<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : '').
377
			'</ul>';
378
		$description = $this->nettoyerTexte($description);
379
		return $description;
380
	}
381
 
382
	private function creerCategorie($element) {
383
		$categorie = '';
384
		$categorie = 'Observation';
385
		$categorie = $this->nettoyerTexte($categorie);
386
		return $categorie;
387
	}
388
 
389
	private function etreFluxAdmin() {
525 jpm 390
		return ($this->service == 'pour-admin' || $_GET['admin'] == '1') ? true : false;
416 aurelien 391
	}
392
 
393
	private function creerUrlService() {
394
		$url_service = $this->getUrlServiceBase();
395
		if (isset($this->start) || isset($this->limit)) {
396
			$arguments = array();
397
			if (isset($this->start) && isset($_GET['start'])) {
398
				$arguments[] = 'start='.$this->start;
399
			}
400
			if (isset($this->limit) && isset($_GET['limit'])) {
401
				$arguments[] = 'limit='.($this->limit);
402
			}
403
			if (count($arguments) > 0) {
404
				$url_service .= '?'.implode('&', $arguments);
405
			}
406
		}
407
		return $url_service;
408
	}
409
}