Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | 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
 
528 jpm 26
	private $parametres_origines = null;
416 aurelien 27
	private $format = null;
28
	private $service = null;
29
	private $squelette = null;
30
	private $squelette_dossier = null;
31
	private $flux = array();
715 delphine 32
	private $criteres = array(
741 delphine 33
		'utilisateur' => 'identifiant',
715 delphine 34
		'commune' => 'location',
741 delphine 35
		'dept' => 'id_location',
715 delphine 36
		'taxon' => 'nom_ret',
37
		'commentaire' => 'commentaire',
38
		'date' => 'date_observation',
39
		'projet' => 'mots-cles');
416 aurelien 40
 
41
	/**
42
	 * Méthode appelée avec une requête de type GET.
43
	 */
44
	public function getElement($params = array()) {
45
		// Initialisation des variables
528 jpm 46
		$this->parametres_origines = $params;
416 aurelien 47
		$info = array();
48
		$contenu = '';
49
 
536 jpm 50
		if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
525 jpm 51
			// Pré traitement des paramêtres
52
			$pour_bdd = false;
53
			$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
54
			extract($p);
55
			$this->parametres = $params;
56
			$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
416 aurelien 57
 
525 jpm 58
			// Récupération de la liste des flux
59
			$this->chargerListeDesFlux();
60
 
61
			// Chargement du bon type de service demandé
62
			if (isset($service)) {
63
				$this->service = $this->traiterNomService($service);
64
				$methode = $this->getNomMethodeService();
65
				if (method_exists($this, $methode)) {
66
					if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
67
						// Mise en minuscule de l'indication du format
68
						$this->format = strtolower($format);
69
						// Définition du fichier squelette demandé
70
						$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
71
					} else if (isset($this->flux[$this->service])) {
72
						$this->format = '';
73
						$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
74
					}
75
 
76
					if (!isset($this->flux[$this->service]) || isset($this->format)) {
77
						// Suppression des paramêtres inutile pour le reste des méthodes
78
						array_shift($this->parametres);
79
						array_shift($this->parametres);
80
 
81
						// Récupération du contenu à renvoyer
82
						$contenu = $this->$methode();
83
					}
84
				} else {
85
					$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
416 aurelien 86
				}
87
			} else {
525 jpm 88
				$this->messages[] = "Le service CEL Syndication Observation nécessite d'indiquer en premier paramètre le type d'information demandé.";
416 aurelien 89
			}
90
		}
91
 
92
		// Envoie sur la sortie standard
93
		$encodage = 'utf-8';
94
		$mime = $this->getTypeMime();
95
		$formatage_json = $this->getFormatageJson();
96
		$this->envoyer($contenu, $mime, $encodage, $formatage_json);
97
	}
98
 
99
	private function getUrlBase() {
637 jpm 100
		$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
416 aurelien 101
		return $url_base;
102
	}
103
 
104
	private function getUrlServiceBase() {
528 jpm 105
		$url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
416 aurelien 106
		return $url_service;
107
	}
108
 
109
	private function traiterNomService($nom) {
110
		$nom = strtolower($nom);
111
		return $nom;
112
	}
113
 
114
	private function getNomMethodeService() {
115
		$methode = '';
116
		$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
117
		$methode = 'getService'.$service_formate;
118
		return $methode;
119
	}
120
 
121
	private function getTypeMime() {
122
		$mime = '';
123
		$test = isset($this->format) ? $this->format : $this->service;
124
		switch ($test) {
125
			case 'atom' :
126
				$mime = 'application/atom+xml';
127
				break;
128
			case 'rss1' :
129
			case 'rss2' :
130
				$mime = 'application/rss+xml';
131
				break;
132
			case 'opml' :
133
				$mime = 'text/x-opml';
134
				break;
135
			default:
136
				$mime = 'text/html';
137
		}
138
		return $mime;
139
	}
140
 
141
	private function getFormatageJson() {
142
		$json = false;
143
		switch ($this->service) {
144
			case 'liste-des-flux' :
145
				$json = true;
146
				break;
147
			default:
148
				$json = false;
149
		}
150
		return $json;
151
	}
152
 
153
	private function getFlux($nom) {
154
		return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
155
	}
156
 
157
	private function setFlux($nom, $titre, $description) {
158
		$url_base = $this->getUrlBase();
159
		$formats = array('atom', 'rss2', 'rss1');
160
		$flux = array();
161
		foreach ($formats as $format) {
162
			$url = $url_base.$nom.'/'.$format;
163
			$flux[$format] = $url;
164
		}
165
		$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
166
	}
167
 
168
	private function chargerListeDesFlux() {
169
		$this->setFlux('par-defaut', 'Flux de syndication des observations publiques du CEL',
170
			'Ce flux fournit des informations sur les observations du CEL.');
742 delphine 171
		$this->setFlux('par-mots-cles', 'Flux de syndication obsolète',
172
			"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'.");
173
		$this->setFlux('par-commune','Flux de syndication obsolète',
174
			"Ce flux  est désormais accessible via le flux multicriteres/atom/M?commune='commune'.");
175
		$this->setFlux('multicriteres','Flux de syndication des nouvelles observations publiques du CEL '.
176
			'filtrées par un ou plusieurs critères',
177
			"Ce flux fournit des informations sur les nouvelles observations du CEL filtrées par ".
178
			"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, projet ".
179
			"et/ou date.");
416 aurelien 180
	}
181
 
182
	private function getServiceListeDesFlux() {
183
		return $this->flux;
184
	}
185
 
186
	private function getServiceOpml() {
187
		$donnees = array();
188
		$id = 1;
189
		foreach ($this->flux as $flux_nom => $flux){
190
			$info = array();
191
			$info['type'] = 'atom';
192
			$info['titre'] = $flux['titre'];
193
			$info['texte'] = "CEL - Obs - $flux_nom";
194
			$info['description'] = $flux['description'];
195
			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
196
			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
197
			$donnees['liste_flux'][] = $info;
198
		}
199
 
200
		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
201
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
202
		return $contenu;
203
	}
204
 
205
	private function getServiceParDefaut() {
206
		// Construction de la requête
715 delphine 207
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
416 aurelien 208
			'FROM cel_inventory '.
528 jpm 209
			(($this->etreFluxAdmin()) ? '' : 'WHERE transmission = 1 ').
715 delphine 210
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'date_modification DESC').' '.
416 aurelien 211
			"LIMIT $this->start,$this->limit ";
212
 
213
		$elements = $this->executerRequete($requete);
214
 
215
		// Création du contenu
216
		$contenu = $this->executerService($elements);
217
		return $contenu;
218
	}
219
 
220
	private function getServiceParMotsCles() {
221
		$contenu = '';
222
		$mot_cle = $this->parametres[0];
223
 
224
		if (isset($mot_cle)) {
225
			$mot_cle_encode = $this->bdd->quote($this->encoderMotCle($mot_cle));
226
 
227
			// Construction de la requête
228
			$requete = 	'SELECT * '.
229
				'FROM cel_mots_cles_obs '.
230
				"WHERE cmc_id_mot_cle_general = $mot_cle_encode ";
231
			$elements = $this->executerRequete($requete);
232
 
233
			if ($elements != false && count($elements) > 0) {
234
				// Pré-construction du where de la requête
235
				$tpl_where = '(mots_cles LIKE "%%%s%%" AND identifiant = %s )';
236
				$requete_where = array();
237
				foreach ($elements as $occurence) {
238
					$requete_where[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire']));
239
				}
240
 
241
				// Construction de la requête
242
				$requete = 	'SELECT * '.
243
					'FROM cel_inventory '.
528 jpm 244
					'WHERE '.implode(" \nOR ", $requete_where).' '.
245
					'	'.(($this->etreFluxAdmin()) ? '' : 'AND transmission = 1 ').
715 delphine 246
					'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
247
						'date_modification, date_creation DESC').' '.
416 aurelien 248
					"LIMIT $this->start,$this->limit ";
249
				$elements = $this->executerRequete($requete);
250
 
251
				// Création du contenu
252
				$contenu = $this->executerService($elements);
253
			} else {
254
				$this->messages[] = "Aucune observation ne correspond à ce mot clé.";
255
			}
256
		} else {
257
			$this->messages[] = "Le service demandé nécessite d'indiquer un mot-clé en dernier paramêtre.";
258
		}
259
		return $contenu;
260
	}
261
 
262
	private function getServiceParCommune() {
263
		$contenu = '';
264
		$commune = $this->parametres[0];
265
		if (isset($commune)) {
266
			$commune = $this->bdd->quote($commune);
267
 
268
			// Construction de la requête
715 delphine 269
			$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
416 aurelien 270
				'FROM cel_inventory '.
528 jpm 271
				"WHERE location = $commune ".
272
				'	'.(($this->etreFluxAdmin()) ? '' : 'AND transmission = 1 ').
715 delphine 273
				'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'date_modification DESC, location ASC').' '.
416 aurelien 274
				"LIMIT $this->start,$this->limit ";
275
 
276
			$elements = $this->executerRequete($requete);
277
 
278
			// Création du contenu
279
			$contenu = $this->executerService($elements);
280
		} else {
281
			$this->messages[] = "Le service demandé nécessite d'indiquer une nom de commune en dernier paramêtre.";
282
		}
283
		return $contenu;
284
	}
285
 
715 delphine 286
	private function getServiceMultiCriteres() {
287
		$contenu = '';
288
		if (isset($_GET['debut'])) $this->start = $_GET['debut'];
289
		if (isset($_GET['limite'])) $this->limite = $_GET['limite'];
290
 
291
		// Construction de la requête
292
		$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
293
				'FROM cel_inventory '.
294
				'WHERE transmission = 1 '.
295
			'	AND ';
296
 
297
		if ($this->estUneRechercheGenerale()) {
298
			$chaine_requete = $_GET['recherche'];
299
			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
300
		} else {
301
			$criteres = $this->traiterCriteresMultiples($_GET) ;
302
			if (!empty($criteres)) {
303
				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
304
			}
305
		}
306
		$requete = rtrim($requete, 'AND ');
307
		$requete .= 'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
308
			'date_modification DESC, location ASC').' '.
309
				"LIMIT $this->start,$this->limit ";
310
 
311
		$elements = $this->executerRequete($requete);//echo $requete;
312
 
313
		// Création du contenu
314
		if ($elements != false && count($elements) > 0) {
315
			$contenu = $this->executerService($elements);
316
		} else {
317
			$this->messages[] = "Aucune observation disponible.";
318
		}
319
 
320
        return $contenu;
321
	}
322
 
323
	private function creerSousRequeteRechercheParCriteres($criteres) {
324
		$requete = '';
325
		foreach ($criteres as $pair) {
326
			$nom_valeur = explode("=",$pair);
327
			if (sizeof($nom_valeur) != 0) {
328
				switch ($nom_valeur[0]) {
329
					case "ci_limite" : $this->limite = $this->bdd->quote($nom_valeur[1]); break;
330
					case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
331
						foreach($mots_comment_liste as $mot_comment) {
332
							$mot_comment = trim($mot_comment) ;
333
							$requete .= $nom_valeur[0].' LIKE '.$this->bdd->quote('%'.$mot_comment.'%').' AND ';
334
						}
335
						break;
336
					case "date_observation" :
337
						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
338
						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
339
							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
340
						}
341
						$requete .= $nom_valeur[0].'='.$this->bdd->quote($nom_valeur[1]).' AND '; break;
342
					case "nom_ret" :
343
						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
344
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR nom_sel LIKE "%'.
345
							$nom_valeur[1].'%") AND '; break;
346
					case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]); break;
347
					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
348
				}
349
			}
350
		}
351
		$requete = rtrim($requete,' AND ');
352
		return $requete;
353
	}
354
 
355
	private function creerSousRequeteMotsCles($mot_cle) {
356
		$requete = 'mots_cles like "inexistant" OR';
741 delphine 357
		if (preg_match('/.*OU.*/', $mot_cle)) {
715 delphine 358
			$requete = $this->creerSousRequeteMotsClesOu($mot_cle);
359
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
360
			$requete = $this->creerSousRequeteMotsClesEt($mot_cle);
361
		} else {
362
			// Construction de la requête
363
			$prerequete = 	'SELECT * '.
364
				'FROM cel_mots_cles_obs '.
365
				'WHERE cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle));
366
			$elements = $this->executerRequete($prerequete);
367
			if ($elements != false && count($elements) > 0) {
368
				$requete = '';
369
				foreach ($elements as $occurence) {
370
					$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '.
371
						$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
372
				}
373
			}
374
		}
375
		$requete = rtrim($requete,' OR ').' AND ';
376
		return $requete;
377
	}
378
 
379
	private function creerSousRequeteMotsClesOu($mot_cle) {
380
		$requete = 'mots_cles like "inexistant" OR';
741 delphine 381
		$tab_mots_cles = explode('OU', $mot_cle);
715 delphine 382
		$where = '';
383
		foreach ($tab_mots_cles as $mot) {
741 delphine 384
			$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR ';
715 delphine 385
		}
386
		$where = rtrim($where,' OR ');
387
 
388
		// Construction de la requête
389
		$prerequete = 	"SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_obs WHERE $where ";
390
		$elements = $this->executerRequete($prerequete);//print_r($elements);
391
		if ($elements != false && count($elements) > 0) {
392
			$requete = '';
393
			foreach ($elements as $occurence) {
394
				$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '.
395
					$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
396
			}
397
		}
398
		return $requete;
399
	}
400
 
401
	private function creerSousRequeteMotsClesEt($mot_cle) {
402
		$requete = 'mots_cles like "inexistant" OR';
403
		$where = '';
404
		$champs = 'a.cmc_id_proprietaire , ';
405
		$table = '';
406
		$i = "a"; $j = "a";
407
 
408
		$tab_mots_cles = explode("ET", $mot_cle);
409
		foreach ($tab_mots_cles as $mot) {
410
			$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , ";
411
			$table .= "cel_mots_cles_obs $i , ";
741 delphine 412
			$where .= "$i.cmc_id_mot_cle_general = ".$this->bdd->quote($this->encoderMotCle(trim($mot))).' AND ';
715 delphine 413
			if ($i !== "a") {
414
				$where .= " $i.cmc_id_proprietaire = ".$j.".cmc_id_proprietaire AND ";
415
				$j++;
416
			}
417
			$i++;
418
		}
419
		$where = rtrim($where,' AND '); $champs = rtrim($champs,' , '); $table = rtrim($table,' , ');
420
 
421
		// Construction de la requête
422
		$prerequete = 	"SELECT $champs FROM $table WHERE $where ";
423
		$elements = $this->executerRequete($prerequete);//print_r($elements);
424
		if ($elements != false && count($elements) > 0) {
425
			$requete = '';
426
			foreach ($elements as $occurence) {
427
				$requete = ' (';
428
				for ($j = 'a'; $j < $i; $j++) {
429
					$requete .= 'mots_cles like "%'.$occurence[$j].'%" AND ';
430
				}
431
				$requete .= ' identifiant = '.$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
432
			}
433
		}
434
		return $requete;
435
	}
436
 
437
	private function traiterCriteresMultiples($tableau_criteres) {
438
		$tableau_criteres_pour_bdd = array();
439
 
440
		foreach($tableau_criteres as $nom_critere => $valeur_critere) {
441
			if (isset($this->criteres[$nom_critere])) {
442
				$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
443
			}
444
		}
445
		return $tableau_criteres_pour_bdd;
446
	}
447
 
448
	private function creerSousRequeteRechercheGenerale($chaine_requete) {
449
		$requete = '';
450
		if (trim($chaine_requete) != '') {
451
			$chaine_requete = strtolower($chaine_requete);
452
			$chaine_requete = str_replace(' ', '_', $chaine_requete);
453
			$requete = ' ('.
454
				'nom_ret LIKE "'.$chaine_requete.'%"'.
455
				' OR '.
456
				'nom_sel LIKE "'.$chaine_requete.'%"'.
457
				' OR '.
458
				'location LIKE "'.$chaine_requete.'%" '.
459
				' OR '.
460
				'id_location LIKE "'.$chaine_requete.'%" '.
461
				' OR '.
462
				'identifiant LIKE "'.$chaine_requete.'%" '.
463
				') ';
464
		}
465
		return $requete;
466
	}
467
 
468
	private function estUneRechercheGenerale() {
469
		return isset($_GET['recherche']);
470
	}
471
 
416 aurelien 472
	private function executerService($elements) {
473
		$contenu = '';
474
		if (is_array($elements)) {
475
			// Prétraitement des données
476
			$donnees = $this->construireDonneesCommunesAuFlux($elements);
477
 
478
			foreach ($elements as $element) {
479
				$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
480
			}
481
 
482
			// Création du contenu à partir d'un template PHP
483
			if (isset($this->squelette)) {
484
				$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
485
			}
486
		}
487
		return $contenu;
488
	}
489
 
490
	private function construireDonneesCommunesAuFlux($observations) {
491
		$donnees = $this->getFlux($this->service);
492
		$donnees['guid'] = $this->getUrlServiceBase();
741 delphine 493
		$donnees['titre'] = 'Flux des observations du CEL';
416 aurelien 494
		$donnees['lien_service'] = $this->creerUrlService();
715 delphine 495
		$donnees['lien_cel'] = $this->config['settings']['baseURLAbsolu'];
416 aurelien 496
		$donnees['editeur'] = $this->config['settings']['editeur'];
497
		$derniere_info_en_date = reset($observations);
498
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']);
499
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
500
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
501
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
502
		$donnees['annee_courante'] = date('Y');
503
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation';
715 delphine 504
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
416 aurelien 505
		return $donnees;
506
	}
507
 
508
	private function construireDonneesCommunesAuxItems($observation) {
509
		$item = array();
528 jpm 510
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']);
416 aurelien 511
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
512
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
513
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
514
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
515
		$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation']));
516
		$item['titre'] = $this->creerTitre($observation);
517
		$item['guid'] = $this->creerGuidItem($observation);
518
		$item['lien'] = $this->creerLienItem($observation);
519
		$item['categorie'] = $this->creerCategorie($item);
528 jpm 520
		$item['description'] = $this->creerDescription($this->protegerCaracteresHtmlDansChamps($observation), $item);
521
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item));
522 jpm 522
		$item['modifier_par'] = $this->creerAuteur($observation['identifiant'], $this->etreFluxAdmin());
416 aurelien 523
		return $item;
524
	}
525
 
526
	private function creerTitre($obs) {
527
		$nom_plante = $obs['nom_sel'].' [nn'.$obs['num_nom_sel'].']';
528
		$lieu = $obs['location'].' ('.$obs['id_location'].')';
522 jpm 529
		$utilisateur = $this->creerAuteur($obs['identifiant'], $this->etreFluxAdmin());
416 aurelien 530
		$titre = "$nom_plante à $lieu par $utilisateur";
531
		$titre = $this->nettoyerTexte($titre);
532
		return $titre;
533
	}
534
 
535
	private function creerGuidItem($element) {
536
		$guid = sprintf($this->config['settings']['guidObsTpl'], 'obs'.$element['id']);
537
		return $guid;
538
	}
539
 
540
	private function creerLienItem($element) {
506 jpm 541
		$lien = null;
542
		if ($element['num_nom_sel'] != 0) {
585 jpm 543
			$lien = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($element['num_nom_sel']), 'cel');
506 jpm 544
		}
416 aurelien 545
		return $lien;
546
	}
547
 
548
	private function creerDescription($obs, $item) {
568 jpm 549
		$id_obs = $obs['id'];
528 jpm 550
		$famille = $obs['famille'];
551
		$nom_saisi = $obs['nom_sel'];
552
		$nom_retenu = $obs['nom_ret'];
553
		$auteur = $this->creerAuteur($obs['identifiant'], $this->etreFluxAdmin());
554
		$mots_cles_obs = $this->decoderMotsClesObs($obs['identifiant'], $obs['mots_cles']);
416 aurelien 555
		$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id']);
528 jpm 556
		$lieu = $obs['location'].' ('.$obs['id_location'].') > '.$obs['lieudit'].' > '.$obs['station'];
557
		$milieu = $obs['milieu'];
558
		$coordonnees = ($this->etreNull($obs['coord_x']) && $this->etreNull($obs['coord_y'])) ? '' : $obs['coord_x'].'/'.$obs['coord_y'];
529 jpm 559
		$commentaire = $obs['commentaire'];
528 jpm 560
		$date_observation = $this->formaterDate($obs['date_observation'], '%A %d %B %Y');
561
		$date_transmission = $this->formaterDate($obs['date_transmission']);
562
		$date_modification = $this->formaterDate($obs['date_modification']);
563
		$date_creation = $this->formaterDate($obs['date_creation']);
564
		$transmission = $obs['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
565
 
566
		$description = '<h2>'."Observation #$id_obs de $nom_saisi".'</h2>'.
416 aurelien 567
			'<ul>'.
528 jpm 568
			'<li>'.'Famille : '.$famille.'</li>'.
569
			'<li>'.'Nom saisi : '.$nom_saisi.'</li>'.
570
			'<li>'.'Nom retenu : '.$nom_retenu.'</li>'.
571
			'<li>'.'Observée le : '.$date_observation.'</li>'.
572
			'<li>'.'Lieu : '.$lieu.'</li>'.
573
			'<li>'.'Milieu : '.$milieu.'</li>'.
574
			(($this->etreFluxAdmin()) ? '<li>Coordonnées (Lat/Long) : '.$coordonnees.'</li>' : '').
575
			'<li>'.'Commentaire : '.$commentaire.'</li>'.
576
			'<li>'.'Mots-clés : '.implode(', ', $mots_cles_obs).'</li>'.
577
			(($this->etreFluxAdmin()) ? '<li>Transmis (= public) : '.$transmission.'</li>' : '').
578
			'<li>Modifiée le : '.$date_modification.'</li>'.
579
			'<li>Créée le : '.$date_creation.'</li>'.
580
			(($this->etreFluxAdmin()) ? '<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : '').
416 aurelien 581
			'</ul>';
582
		$description = $this->nettoyerTexte($description);
583
		return $description;
584
	}
585
 
586
	private function creerCategorie($element) {
587
		$categorie = '';
588
		$categorie = 'Observation';
589
		$categorie = $this->nettoyerTexte($categorie);
590
		return $categorie;
591
	}
592
 
593
	private function etreFluxAdmin() {
715 delphine 594
		return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
416 aurelien 595
	}
596
 
597
	private function creerUrlService() {
598
		$url_service = $this->getUrlServiceBase();
528 jpm 599
		if (count($_GET) > 0) {
637 jpm 600
			$parametres_get = array();
601
			foreach ($_GET as $cle => $valeur) {
602
				$parametres_get[] = $cle.'='.$valeur;
603
			}
604
			$url_service .= '?'.implode('&amp;', $parametres_get);
416 aurelien 605
		}
606
		return $url_service;
607
	}
608
}