Subversion Repositories eFlore/Applications.cel

Rev

Rev 3556 | Rev 3743 | 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',
3569 delphine 49
	    'standard' => 'donnees_standard',
2681 aurelien 50
		'projet' => 'mots-cles',
51
		'groupe_zones_geo' => 'groupe_zones_geo');
2394 aurelien 52
	private $catalogue_cles_labels_champs_etendus = array();
1338 jpm 53
 
416 aurelien 54
	/**
55
	 * Méthode appelée avec une requête de type GET.
56
	 */
57
	public function getElement($params = array()) {
58
		// Initialisation des variables
528 jpm 59
		$this->parametres_origines = $params;
416 aurelien 60
		$info = array();
61
		$contenu = '';
1338 jpm 62
 
536 jpm 63
		if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
525 jpm 64
			// Pré traitement des paramêtres
65
			$pour_bdd = false;
66
			$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
67
			extract($p);
68
			$this->parametres = $params;
69
			$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
1338 jpm 70
 
525 jpm 71
			// Récupération de la liste des flux
72
			$this->chargerListeDesFlux();
1338 jpm 73
 
525 jpm 74
			// Chargement du bon type de service demandé
75
			if (isset($service)) {
76
				$this->service = $this->traiterNomService($service);
77
				$methode = $this->getNomMethodeService();
78
				if (method_exists($this, $methode)) {
79
					if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
80
						// Mise en minuscule de l'indication du format
81
						$this->format = strtolower($format);
82
						// Définition du fichier squelette demandé
83
						$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
84
					} else if (isset($this->flux[$this->service])) {
85
						$this->format = '';
86
						$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
87
					}
1338 jpm 88
 
525 jpm 89
					if (!isset($this->flux[$this->service]) || isset($this->format)) {
90
						// Suppression des paramêtres inutile pour le reste des méthodes
91
						array_shift($this->parametres);
92
						array_shift($this->parametres);
1338 jpm 93
 
525 jpm 94
						// Récupération du contenu à renvoyer
95
						$contenu = $this->$methode();
96
					}
97
				} else {
98
					$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
416 aurelien 99
				}
100
			} else {
525 jpm 101
				$this->messages[] = "Le service CEL Syndication Observation nécessite d'indiquer en premier paramètre le type d'information demandé.";
416 aurelien 102
			}
103
		}
1338 jpm 104
 
416 aurelien 105
		// Envoie sur la sortie standard
106
		$encodage = 'utf-8';
107
		$mime = $this->getTypeMime();
108
		$formatage_json = $this->getFormatageJson();
109
		$this->envoyer($contenu, $mime, $encodage, $formatage_json);
110
	}
1338 jpm 111
 
416 aurelien 112
	private function getUrlBase() {
637 jpm 113
		$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
416 aurelien 114
		return $url_base;
115
	}
1338 jpm 116
 
416 aurelien 117
	private function getUrlServiceBase() {
528 jpm 118
		$url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
416 aurelien 119
		return $url_service;
120
	}
1338 jpm 121
 
416 aurelien 122
	private function traiterNomService($nom) {
123
		$nom = strtolower($nom);
124
		return $nom;
125
	}
1338 jpm 126
 
416 aurelien 127
	private function getNomMethodeService() {
128
		$methode = '';
129
		$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
130
		$methode = 'getService'.$service_formate;
131
		return $methode;
132
	}
1338 jpm 133
 
416 aurelien 134
	private function getTypeMime() {
135
		$mime = '';
1338 jpm 136
		$test = isset($this->format) ? $this->format : $this->service;
416 aurelien 137
		switch ($test) {
138
			case 'atom' :
139
				$mime = 'application/atom+xml';
140
				break;
141
			case 'rss1' :
142
			case 'rss2' :
143
				$mime = 'application/rss+xml';
144
				break;
145
			case 'opml' :
146
				$mime = 'text/x-opml';
147
				break;
148
			default:
149
				$mime = 'text/html';
150
		}
151
		return $mime;
152
	}
1338 jpm 153
 
416 aurelien 154
	private function getFormatageJson() {
155
		$json = false;
156
		switch ($this->service) {
157
			case 'liste-des-flux' :
158
				$json = true;
159
				break;
160
			default:
161
				$json = false;
162
		}
163
		return $json;
164
	}
1338 jpm 165
 
416 aurelien 166
	private function getFlux($nom) {
167
		return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
168
	}
169
 
170
	private function setFlux($nom, $titre, $description) {
171
		$url_base = $this->getUrlBase();
172
		$formats = array('atom', 'rss2', 'rss1');
173
		$flux = array();
174
		foreach ($formats as $format) {
175
			$url = $url_base.$nom.'/'.$format;
176
			$flux[$format] = $url;
177
		}
178
		$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
179
	}
1338 jpm 180
 
416 aurelien 181
	private function chargerListeDesFlux() {
1338 jpm 182
		$this->setFlux('par-defaut', 'Flux de syndication des observations publiques du CEL',
416 aurelien 183
			'Ce flux fournit des informations sur les observations du CEL.');
742 delphine 184
		$this->setFlux('multicriteres','Flux de syndication des nouvelles observations publiques du CEL '.
185
			'filtrées par un ou plusieurs critères',
186
			"Ce flux fournit des informations sur les nouvelles observations du CEL filtrées par ".
187
			"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, projet ".
188
			"et/ou date.");
416 aurelien 189
	}
1338 jpm 190
 
416 aurelien 191
	private function getServiceListeDesFlux() {
192
		return $this->flux;
193
	}
1338 jpm 194
 
416 aurelien 195
	private function getServiceOpml() {
196
		$donnees = array();
197
		$id = 1;
198
		foreach ($this->flux as $flux_nom => $flux){
199
			$info = array();
200
			$info['type'] = 'atom';
201
			$info['titre'] = $flux['titre'];
202
			$info['texte'] = "CEL - Obs - $flux_nom";
203
			$info['description'] = $flux['description'];
204
			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
205
			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
206
			$donnees['liste_flux'][] = $info;
207
		}
1338 jpm 208
 
416 aurelien 209
		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
210
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
211
		return $contenu;
212
	}
1338 jpm 213
 
416 aurelien 214
	private function getServiceParDefaut() {
215
		// Construction de la requête
715 delphine 216
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
3521 delphine 217
			'FROM cel_export_total '.
1330 aurelien 218
			(($this->etreFluxAdmin()) ? '' : 'WHERE transmission = 1 ').
715 delphine 219
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'date_modification DESC').' '.
416 aurelien 220
			"LIMIT $this->start,$this->limit ";
1338 jpm 221
 
2143 jpm 222
		$elements = Cel::db()->requeter($requete);
1338 jpm 223
 
416 aurelien 224
		// Création du contenu
225
		$contenu = $this->executerService($elements);
226
		return $contenu;
227
	}
1338 jpm 228
 
715 delphine 229
	private function getServiceMultiCriteres() {
230
		$contenu = '';
1338 jpm 231
		if (isset($_GET['debut'])) $this->start = $_GET['debut'];
1550 aurelien 232
		if (isset($_GET['limite'])) $this->limit = $_GET['limite'];
2143 jpm 233
 
1550 aurelien 234
		$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
1338 jpm 235
 
715 delphine 236
		// Construction de la requête
237
		$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
3521 delphine 238
				'FROM cel_export_total '.
1330 aurelien 239
				'WHERE 1 AND '.(($this->etreFluxAdmin()) ? '' : ' transmission = 1 AND ');
1338 jpm 240
 
715 delphine 241
		if ($this->estUneRechercheGenerale()) {
242
			$chaine_requete = $_GET['recherche'];
243
			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
244
		} else {
245
			$criteres = $this->traiterCriteresMultiples($_GET) ;
246
			if (!empty($criteres)) {
247
				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
1338 jpm 248
			}
715 delphine 249
		}
250
		$requete = rtrim($requete, 'AND ');
1338 jpm 251
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
1330 aurelien 252
			'date_modification DESC, zone_geo ASC').' '.
715 delphine 253
				"LIMIT $this->start,$this->limit ";
1330 aurelien 254
 
2143 jpm 255
		$elements = Cel::db()->requeter($requete);
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
	}
3556 killian 599
}