Subversion Repositories eFlore/Applications.cel

Rev

Rev 3005 | Rev 3556 | 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').' * '.
3521 delphine 216
			'FROM cel_export_total '.
1330 aurelien 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').' * '.
3521 delphine 237
				'FROM cel_export_total '.
1330 aurelien 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
			}
3521 delphine 406
			$gestion_obs_etendus = new GestionChampsEtendus($this->config, 'obs');
407
			$gestion_champs_etendus = new GestionChampsEtendus2($this->config);
408
			$champs_etendus = $gestion_obs_etendus->consulterParLots($ids_observations);
2394 aurelien 409
			if(!empty($champs_etendus)) {
410
				$this->catalogue_cles_labels_champs_etendus = $gestion_champs_etendus->consulterCatalogueChampsEtendusPredefinis(true);
2403 aurelien 411
				// afin de simplifier les erreurs de majuscules et minuscules
412
				$this->catalogue_cles_labels_champs_etendus = array_change_key_case($this->catalogue_cles_labels_champs_etendus);
2394 aurelien 413
			}
790 delphine 414
			$this->auteurs = $this->creerAuteurs($identifiants);
415
			foreach ($elements as $element) {
1550 aurelien 416
				$element['obs_etendue'] = isset($champs_etendus[$element['id_observation']]) ? $champs_etendus[$element['id_observation']] : array();
416 aurelien 417
				$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
418
			}
1338 jpm 419
 
416 aurelien 420
			// Création du contenu à partir d'un template PHP
421
			if (isset($this->squelette)) {
422
				$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
423
			}
1338 jpm 424
		}
416 aurelien 425
		return $contenu;
426
	}
1338 jpm 427
 
416 aurelien 428
	private function construireDonneesCommunesAuFlux($observations) {
429
		$donnees = $this->getFlux($this->service);
430
		$donnees['guid'] = $this->getUrlServiceBase();
741 delphine 431
		$donnees['titre'] = 'Flux des observations du CEL';
416 aurelien 432
		$donnees['lien_service'] = $this->creerUrlService();
715 delphine 433
		$donnees['lien_cel'] = $this->config['settings']['baseURLAbsolu'];
416 aurelien 434
		$donnees['editeur'] = $this->config['settings']['editeur'];
435
		$derniere_info_en_date = reset($observations);
436
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']);
437
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
438
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
439
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
440
		$donnees['annee_courante'] = date('Y');
441
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation';
715 delphine 442
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
1338 jpm 443
		return $donnees;
416 aurelien 444
	}
1338 jpm 445
 
416 aurelien 446
	private function construireDonneesCommunesAuxItems($observation) {
447
		$item = array();
528 jpm 448
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']);
416 aurelien 449
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
450
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
451
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
452
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
453
		$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation']));
454
		$item['titre'] = $this->creerTitre($observation);
455
		$item['guid'] = $this->creerGuidItem($observation);
456
		$item['lien'] = $this->creerLienItem($observation);
457
		$item['categorie'] = $this->creerCategorie($item);
1790 raphael 458
		$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($observation), $item);
528 jpm 459
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item));
2400 jpm 460
		$item['modifier_par'] = $this->nettoyerTexte($observation['id_observation']);
416 aurelien 461
		return $item;
462
	}
1338 jpm 463
 
416 aurelien 464
	private function creerTitre($obs) {
1464 aurelien 465
		$date = ($obs['date_observation'] != '0000-00-00 00:00:00') ? 'le '.date("d/m/Y", strtotime($obs['date_observation'])) : '' ;
1330 aurelien 466
		$nom_plante = $obs['nom_sel'].' [nn'.$obs['nom_sel_nn'].']';
2778 mathias 467
		$lieu = $this->formaterZoneGeoEtCodePourAffichage($obs);
1361 aurelien 468
		$utilisateur = $this->getIntituleAuteur($obs['courriel_utilisateur']);
1410 aurelien 469
		$titre = "$nom_plante à $lieu par $utilisateur $date";
416 aurelien 470
		$titre = $this->nettoyerTexte($titre);
471
		return $titre;
472
	}
1338 jpm 473
 
416 aurelien 474
	private function creerGuidItem($element) {
1330 aurelien 475
		$guid = sprintf($this->config['settings']['guidObsTpl'], $element['id_observation']);
416 aurelien 476
		return $guid;
477
	}
1338 jpm 478
 
416 aurelien 479
	private function creerLienItem($element) {
506 jpm 480
		$lien = null;
1330 aurelien 481
		if ($element['nom_sel_nn'] != 0) {
1622 aurelien 482
			$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'cel');
506 jpm 483
		}
416 aurelien 484
		return $lien;
485
	}
1338 jpm 486
 
416 aurelien 487
	private function creerDescription($obs, $item) {
1330 aurelien 488
		$id_obs = $obs['id_observation'];
528 jpm 489
		$famille = $obs['famille'];
490
		$nom_saisi = $obs['nom_sel'];
491
		$nom_retenu = $obs['nom_ret'];
1338 jpm 492
		$auteur = $this->getIntituleAuteur($obs['courriel_utilisateur']);
1330 aurelien 493
		$auteur_mail = $obs['courriel_utilisateur'];
494
		$mots_cles_obs = $obs['mots_cles_texte'];
495
		$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id_observation']);
2560 aurelien 496
 
2778 mathias 497
		$lieu =  $this->formaterZoneGeoEtCodePourAffichage($obs).' > '.$obs['lieudit'].' > '.$obs['station'];
528 jpm 498
		$milieu = $obs['milieu'];
1330 aurelien 499
		$coordonnees = ($this->etreNull($obs['latitude']) && $this->etreNull($obs['longitude'])) ? '' : $obs['latitude'].'/'.$obs['longitude'];
529 jpm 500
		$commentaire = $obs['commentaire'];
1464 aurelien 501
		$date_observation = ($obs['date_observation'] != '0000-00-00 00:00:00') ? $this->formaterDate($obs['date_observation'], '%A %d %B %Y') : '';
528 jpm 502
		$date_transmission = $this->formaterDate($obs['date_transmission']);
503
		$date_modification = $this->formaterDate($obs['date_modification']);
504
		$date_creation = $this->formaterDate($obs['date_creation']);
505
		$transmission = $obs['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
1338 jpm 506
 
528 jpm 507
		$description = '<h2>'."Observation #$id_obs de $nom_saisi".'</h2>'.
416 aurelien 508
			'<ul>'.
528 jpm 509
			'<li>'.'Famille : '.$famille.'</li>'.
510
			'<li>'.'Nom saisi : '.$nom_saisi.'</li>'.
511
			'<li>'.'Nom retenu : '.$nom_retenu.'</li>'.
512
			'<li>'.'Observée le : '.$date_observation.'</li>'.
2400 jpm 513
			'<li>'.'Lieu : '.$lieu.'</li>'.
528 jpm 514
			'<li>'.'Milieu : '.$milieu.'</li>'.
515
			(($this->etreFluxAdmin()) ? '<li>Coordonnées (Lat/Long) : '.$coordonnees.'</li>' : '').
2272 aurelien 516
			'<li>'.'Commentaire : '.$this->nePasInterpreterXml($commentaire).'</li>'.
517
			'<li>'.'Mots-clés : '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'.
528 jpm 518
			(($this->etreFluxAdmin()) ? '<li>Transmis (= public) : '.$transmission.'</li>' : '').
519
			'<li>Modifiée le : '.$date_modification.'</li>'.
520
			'<li>Créée le : '.$date_creation.'</li>'.
813 delphine 521
			'<li>'.'Par : '.
522
				(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
523
			'</li>'.
1550 aurelien 524
			$this->creerDescriptionChampsEtendus($obs, $item).
528 jpm 525
			(($this->etreFluxAdmin()) ? '<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : '').
416 aurelien 526
			'</ul>';
527
		$description = $this->nettoyerTexte($description);
528
		return $description;
529
	}
2143 jpm 530
 
1550 aurelien 531
	private function creerDescriptionChampsEtendus($obs, $item) {
532
		$champs_etendus = '';
1571 aurelien 533
		foreach($obs['obs_etendue'] as $cle => &$champ) {
2403 aurelien 534
			if($this->doitAfficherChampEtendu($champ->cle, $this->catalogue_cles_labels_champs_etendus)) {
535
				if(isset($this->catalogue_cles_labels_champs_etendus[$champ->cle])) {
536
					$label = $this->catalogue_cles_labels_champs_etendus[$champ->cle]['label'];
537
				} else {
2446 jpm 538
					$label = preg_replace("/(?<=\\w)(?=[A-Z])/"," $1", $champ->cle);
2403 aurelien 539
					$label = trim($label);
540
					$label = $label;
541
				}
542
				$champs_etendus .= '<li>'.$this->nePasInterpreterXml($label.' : '.$champ->valeur).' </li>';
2394 aurelien 543
			}
1550 aurelien 544
		}
2143 jpm 545
 
1571 aurelien 546
		if($champs_etendus != '') {
547
			$champs_etendus = '<li> Champs supplémentaires : <ul>'.$champs_etendus.'</ul></li>';
548
		}
2403 aurelien 549
 
1550 aurelien 550
		return $champs_etendus;
551
	}
2446 jpm 552
 
2403 aurelien 553
	private function doitAfficherChampEtendu($cle, $catalogue) {
554
		// Suppression des nombres à la fin de la chaines dans le cas des clés
555
		// "multiples" et mise en minuscule
556
		$cle_simplifiee = preg_replace("/\d+$/","",$cle);
557
		$cle_simplifiee = strtolower(rtrim($cle_simplifiee, ":"));
2446 jpm 558
 
2403 aurelien 559
		// Un champ est affichable s'il n'est pas au catalogue ou bien
560
		// s'il n'est pas marqué privé dans celui-ci
561
		$affichable = !isset($catalogue[$cle_simplifiee]) ||
562
						$catalogue[$cle_simplifiee]['options']['prive'] != 1;
2446 jpm 563
 
564
		return $affichable;
2403 aurelien 565
	}
1338 jpm 566
 
416 aurelien 567
	private function creerCategorie($element) {
568
		$categorie = '';
569
		$categorie = 'Observation';
570
		$categorie = $this->nettoyerTexte($categorie);
571
		return $categorie;
572
	}
1338 jpm 573
 
416 aurelien 574
	private function etreFluxAdmin() {
715 delphine 575
		return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
416 aurelien 576
	}
1338 jpm 577
 
416 aurelien 578
	private function creerUrlService() {
579
		$url_service = $this->getUrlServiceBase();
528 jpm 580
		if (count($_GET) > 0) {
637 jpm 581
			$parametres_get = array();
582
			foreach ($_GET as $cle => $valeur) {
583
				$parametres_get[] = $cle.'='.$valeur;
584
			}
585
			$url_service .= '?'.implode('&amp;', $parametres_get);
416 aurelien 586
		}
587
		return $url_service;
588
	}
2143 jpm 589
 
590
	private function getIntituleAuteur($courriel) {
1410 aurelien 591
		$courriel = strtolower($courriel);
2143 jpm 592
		if(isset($this->auteurs[$courriel])) {
1410 aurelien 593
			$intitule = $this->auteurs[$courriel];
594
		} else {
595
			$intitule = $courriel;
2143 jpm 596
		}
597
		return $intitule;
1338 jpm 598
	}
599
}