Subversion Repositories eFlore/Applications.cel

Rev

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