Subversion Repositories eFlore/Applications.cel

Rev

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

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