Subversion Repositories eFlore/Applications.cel

Rev

Rev 2681 | 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 {
260
			$this->messages[] = "Aucune observation disponible.";
261
		}
1338 jpm 262
 
715 delphine 263
        return $contenu;
264
	}
1338 jpm 265
 
715 delphine 266
	private function creerSousRequeteRechercheParCriteres($criteres) {
267
		$requete = '';
268
		foreach ($criteres as $pair) {
269
			$nom_valeur = explode("=",$pair);
270
			if (sizeof($nom_valeur) != 0) {
271
				switch ($nom_valeur[0]) {
1765 raphael 272
					case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
715 delphine 273
					case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
274
						foreach($mots_comment_liste as $mot_comment) {
275
							$mot_comment = trim($mot_comment) ;
1765 raphael 276
							$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
715 delphine 277
						}
278
						break;
1338 jpm 279
					case "date_observation" :
715 delphine 280
						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
281
						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
282
							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
283
						}
1765 raphael 284
						$requete .= $nom_valeur[0].'='.Cel::db()->quote($nom_valeur[1]).' AND '; break;
1330 aurelien 285
					case "ce_zone_geo" :
286
						$requete .= ' ('.$nom_valeur[0].' LIKE "INSEE-C:'.$nom_valeur[1].'%") AND '; break;
1338 jpm 287
					case "nom_ret" :
288
						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
715 delphine 289
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR nom_sel LIKE "%'.
290
							$nom_valeur[1].'%") AND '; break;
1338 jpm 291
					case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
1477 aurelien 292
					case "tags" : $requete .= $this->creerSousRequeteTags($nom_valeur[1]).' AND '; break;
2681 aurelien 293
					case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break;
715 delphine 294
					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
295
				}
296
			}
297
		}
298
		$requete = rtrim($requete,' AND ');
299
		return $requete;
300
	}
2681 aurelien 301
 
302
	private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) {
303
		$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo);
304
		$res = Cel::db()->requeter($req);
305
		$zones = array();
306
		foreach($res as &$r) {
307
			$zones[] = Cel::db()->proteger($r['valeur']);
308
		}
309
		$sql = '(ce_zone_geo IN ('.implode(',', $zones).')) ';
310
 
311
		return $sql;
312
	}
1338 jpm 313
 
715 delphine 314
	private function creerSousRequeteMotsCles($mot_cle) {
1330 aurelien 315
		$requete = '';
741 delphine 316
		if (preg_match('/.*OU.*/', $mot_cle)) {
1330 aurelien 317
			$mots_cles_tab = explode('OU',$mot_cle);
318
			foreach($mots_cles_tab as $mot_cle_item) {
1765 raphael 319
				$requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
1330 aurelien 320
			}
321
			$requete = '('.rtrim($requete,'OR ').') ';
715 delphine 322
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
1330 aurelien 323
			$mots_cles_tab = explode('ET',$mot_cle);
324
			foreach($mots_cles_tab as $mot_cle_item) {
1765 raphael 325
				$requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
715 delphine 326
			}
1330 aurelien 327
			$requete = '('.rtrim($requete, 'AND ').') ';
328
		} else {
1765 raphael 329
			$requete = "(mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
715 delphine 330
		}
331
		return $requete;
332
	}
2143 jpm 333
 
1477 aurelien 334
	private function creerSousRequeteTags($tag) {
2446 jpm 335
		$requete = '(id_observation IN (SELECT ce_observation FROM cel_images ci WHERE ';
1477 aurelien 336
		$where = '';
337
		if (preg_match('/.*OU.*/', $tag)) {
338
			$mots_cles_tab = explode('OU',$tag);
339
			foreach($mots_cles_tab as $mot_cle_item) {
1765 raphael 340
				$where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
1477 aurelien 341
			}
342
			$where .= '('.rtrim($where,'OR ').') ';
343
		} else if (preg_match('/.*ET.*/', $tag)) {
344
			$mots_cles_tab = explode('ET',$tag);
345
			foreach($mots_cles_tab as $mot_cle_item) {
1765 raphael 346
				$where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
1477 aurelien 347
			}
348
			$where .= '('.rtrim($where, 'AND ').') ';
349
		} else {
1765 raphael 350
			$where .= "(ci.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$tag.'%').') ';
1477 aurelien 351
		}
352
		$requete .= $where.' ))';
353
		return $requete;
354
	}
1338 jpm 355
 
715 delphine 356
	private function traiterCriteresMultiples($tableau_criteres) {
357
		$tableau_criteres_pour_bdd = array();
1338 jpm 358
 
715 delphine 359
		foreach($tableau_criteres as $nom_critere => $valeur_critere) {
360
			if (isset($this->criteres[$nom_critere])) {
361
				$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
362
			}
363
		}
364
		return $tableau_criteres_pour_bdd;
365
	}
1338 jpm 366
 
715 delphine 367
	private function creerSousRequeteRechercheGenerale($chaine_requete) {
368
		$requete = '';
1338 jpm 369
		if (trim($chaine_requete) != '') {
715 delphine 370
			$chaine_requete = strtolower($chaine_requete);
371
			$chaine_requete = str_replace(' ', '_', $chaine_requete);
372
			$requete = ' ('.
373
				'nom_ret LIKE "'.$chaine_requete.'%"'.
374
				' OR '.
375
				'nom_sel LIKE "'.$chaine_requete.'%"'.
376
				' OR '.
1330 aurelien 377
				'zone_geo LIKE "'.$chaine_requete.'%" '.
715 delphine 378
				' OR '.
1330 aurelien 379
				'ce_zone_geo LIKE "'.$chaine_requete.'%" '.
715 delphine 380
				' OR '.
1330 aurelien 381
				'ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '.
382
				' OR '.
383
				'courriel_utilisateur LIKE "'.$chaine_requete.'%" '.
384
				' OR '.
385
				'mots_cles_texte LIKE "'.$chaine_requete.'%" '.
715 delphine 386
				') ';
387
		}
388
		return $requete;
389
	}
1338 jpm 390
 
715 delphine 391
	private function estUneRechercheGenerale() {
392
		return isset($_GET['recherche']);
393
	}
1338 jpm 394
 
416 aurelien 395
	private function executerService($elements) {
396
		$contenu = '';
397
		if (is_array($elements)) {
398
			// Prétraitement des données
399
			$donnees = $this->construireDonneesCommunesAuFlux($elements);
1550 aurelien 400
			$ids_observations = array();
416 aurelien 401
			foreach ($elements as $element) {
1338 jpm 402
				$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur'];
1550 aurelien 403
				$ids_observations[] = $element['id_observation'];
790 delphine 404
			}
1550 aurelien 405
			$gestion_champs_etendus = new GestionChampsEtendus($this->config, 'obs');
1571 aurelien 406
			$champs_etendus = $gestion_champs_etendus->consulterParLots($ids_observations);
2394 aurelien 407
			if(!empty($champs_etendus)) {
408
				$this->catalogue_cles_labels_champs_etendus = $gestion_champs_etendus->consulterCatalogueChampsEtendusPredefinis(true);
2403 aurelien 409
				// afin de simplifier les erreurs de majuscules et minuscules
410
				$this->catalogue_cles_labels_champs_etendus = array_change_key_case($this->catalogue_cles_labels_champs_etendus);
2394 aurelien 411
			}
790 delphine 412
			$this->auteurs = $this->creerAuteurs($identifiants);
413
			foreach ($elements as $element) {
1550 aurelien 414
				$element['obs_etendue'] = isset($champs_etendus[$element['id_observation']]) ? $champs_etendus[$element['id_observation']] : array();
416 aurelien 415
				$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
416
			}
1338 jpm 417
 
416 aurelien 418
			// Création du contenu à partir d'un template PHP
419
			if (isset($this->squelette)) {
420
				$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
421
			}
1338 jpm 422
		}
416 aurelien 423
		return $contenu;
424
	}
1338 jpm 425
 
416 aurelien 426
	private function construireDonneesCommunesAuFlux($observations) {
427
		$donnees = $this->getFlux($this->service);
428
		$donnees['guid'] = $this->getUrlServiceBase();
741 delphine 429
		$donnees['titre'] = 'Flux des observations du CEL';
416 aurelien 430
		$donnees['lien_service'] = $this->creerUrlService();
715 delphine 431
		$donnees['lien_cel'] = $this->config['settings']['baseURLAbsolu'];
416 aurelien 432
		$donnees['editeur'] = $this->config['settings']['editeur'];
433
		$derniere_info_en_date = reset($observations);
434
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']);
435
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
436
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
437
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
438
		$donnees['annee_courante'] = date('Y');
439
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation';
715 delphine 440
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
1338 jpm 441
		return $donnees;
416 aurelien 442
	}
1338 jpm 443
 
416 aurelien 444
	private function construireDonneesCommunesAuxItems($observation) {
445
		$item = array();
528 jpm 446
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']);
416 aurelien 447
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
448
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
449
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
450
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
451
		$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation']));
452
		$item['titre'] = $this->creerTitre($observation);
453
		$item['guid'] = $this->creerGuidItem($observation);
454
		$item['lien'] = $this->creerLienItem($observation);
455
		$item['categorie'] = $this->creerCategorie($item);
1790 raphael 456
		$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($observation), $item);
528 jpm 457
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item));
2400 jpm 458
		$item['modifier_par'] = $this->nettoyerTexte($observation['id_observation']);
416 aurelien 459
		return $item;
460
	}
1338 jpm 461
 
416 aurelien 462
	private function creerTitre($obs) {
1464 aurelien 463
		$date = ($obs['date_observation'] != '0000-00-00 00:00:00') ? 'le '.date("d/m/Y", strtotime($obs['date_observation'])) : '' ;
1330 aurelien 464
		$nom_plante = $obs['nom_sel'].' [nn'.$obs['nom_sel_nn'].']';
2560 aurelien 465
		$lieu = Cel::formaterZoneGeoEtCodePourAffichage($obs);
1361 aurelien 466
		$utilisateur = $this->getIntituleAuteur($obs['courriel_utilisateur']);
1410 aurelien 467
		$titre = "$nom_plante à $lieu par $utilisateur $date";
416 aurelien 468
		$titre = $this->nettoyerTexte($titre);
469
		return $titre;
470
	}
1338 jpm 471
 
416 aurelien 472
	private function creerGuidItem($element) {
1330 aurelien 473
		$guid = sprintf($this->config['settings']['guidObsTpl'], $element['id_observation']);
416 aurelien 474
		return $guid;
475
	}
1338 jpm 476
 
416 aurelien 477
	private function creerLienItem($element) {
506 jpm 478
		$lien = null;
1330 aurelien 479
		if ($element['nom_sel_nn'] != 0) {
1622 aurelien 480
			$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'cel');
506 jpm 481
		}
416 aurelien 482
		return $lien;
483
	}
1338 jpm 484
 
416 aurelien 485
	private function creerDescription($obs, $item) {
1330 aurelien 486
		$id_obs = $obs['id_observation'];
528 jpm 487
		$famille = $obs['famille'];
488
		$nom_saisi = $obs['nom_sel'];
489
		$nom_retenu = $obs['nom_ret'];
1338 jpm 490
		$auteur = $this->getIntituleAuteur($obs['courriel_utilisateur']);
1330 aurelien 491
		$auteur_mail = $obs['courriel_utilisateur'];
492
		$mots_cles_obs = $obs['mots_cles_texte'];
493
		$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id_observation']);
2560 aurelien 494
 
495
		$lieu =  Cel::formaterZoneGeoEtCodePourAffichage($obs).' > '.$obs['lieudit'].' > '.$obs['station'];
528 jpm 496
		$milieu = $obs['milieu'];
1330 aurelien 497
		$coordonnees = ($this->etreNull($obs['latitude']) && $this->etreNull($obs['longitude'])) ? '' : $obs['latitude'].'/'.$obs['longitude'];
529 jpm 498
		$commentaire = $obs['commentaire'];
1464 aurelien 499
		$date_observation = ($obs['date_observation'] != '0000-00-00 00:00:00') ? $this->formaterDate($obs['date_observation'], '%A %d %B %Y') : '';
528 jpm 500
		$date_transmission = $this->formaterDate($obs['date_transmission']);
501
		$date_modification = $this->formaterDate($obs['date_modification']);
502
		$date_creation = $this->formaterDate($obs['date_creation']);
503
		$transmission = $obs['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
1338 jpm 504
 
528 jpm 505
		$description = '<h2>'."Observation #$id_obs de $nom_saisi".'</h2>'.
416 aurelien 506
			'<ul>'.
528 jpm 507
			'<li>'.'Famille : '.$famille.'</li>'.
508
			'<li>'.'Nom saisi : '.$nom_saisi.'</li>'.
509
			'<li>'.'Nom retenu : '.$nom_retenu.'</li>'.
510
			'<li>'.'Observée le : '.$date_observation.'</li>'.
2400 jpm 511
			'<li>'.'Lieu : '.$lieu.'</li>'.
528 jpm 512
			'<li>'.'Milieu : '.$milieu.'</li>'.
513
			(($this->etreFluxAdmin()) ? '<li>Coordonnées (Lat/Long) : '.$coordonnees.'</li>' : '').
2272 aurelien 514
			'<li>'.'Commentaire : '.$this->nePasInterpreterXml($commentaire).'</li>'.
515
			'<li>'.'Mots-clés : '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'.
528 jpm 516
			(($this->etreFluxAdmin()) ? '<li>Transmis (= public) : '.$transmission.'</li>' : '').
517
			'<li>Modifiée le : '.$date_modification.'</li>'.
518
			'<li>Créée le : '.$date_creation.'</li>'.
813 delphine 519
			'<li>'.'Par : '.
520
				(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
521
			'</li>'.
1550 aurelien 522
			$this->creerDescriptionChampsEtendus($obs, $item).
528 jpm 523
			(($this->etreFluxAdmin()) ? '<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : '').
416 aurelien 524
			'</ul>';
525
		$description = $this->nettoyerTexte($description);
526
		return $description;
527
	}
2143 jpm 528
 
1550 aurelien 529
	private function creerDescriptionChampsEtendus($obs, $item) {
530
		$champs_etendus = '';
1571 aurelien 531
		foreach($obs['obs_etendue'] as $cle => &$champ) {
2403 aurelien 532
			if($this->doitAfficherChampEtendu($champ->cle, $this->catalogue_cles_labels_champs_etendus)) {
533
				if(isset($this->catalogue_cles_labels_champs_etendus[$champ->cle])) {
534
					$label = $this->catalogue_cles_labels_champs_etendus[$champ->cle]['label'];
535
				} else {
2446 jpm 536
					$label = preg_replace("/(?<=\\w)(?=[A-Z])/"," $1", $champ->cle);
2403 aurelien 537
					$label = trim($label);
538
					$label = $label;
539
				}
540
				$champs_etendus .= '<li>'.$this->nePasInterpreterXml($label.' : '.$champ->valeur).' </li>';
2394 aurelien 541
			}
1550 aurelien 542
		}
2143 jpm 543
 
1571 aurelien 544
		if($champs_etendus != '') {
545
			$champs_etendus = '<li> Champs supplémentaires : <ul>'.$champs_etendus.'</ul></li>';
546
		}
2403 aurelien 547
 
1550 aurelien 548
		return $champs_etendus;
549
	}
2446 jpm 550
 
2403 aurelien 551
	private function doitAfficherChampEtendu($cle, $catalogue) {
552
		// Suppression des nombres à la fin de la chaines dans le cas des clés
553
		// "multiples" et mise en minuscule
554
		$cle_simplifiee = preg_replace("/\d+$/","",$cle);
555
		$cle_simplifiee = strtolower(rtrim($cle_simplifiee, ":"));
2446 jpm 556
 
2403 aurelien 557
		// Un champ est affichable s'il n'est pas au catalogue ou bien
558
		// s'il n'est pas marqué privé dans celui-ci
559
		$affichable = !isset($catalogue[$cle_simplifiee]) ||
560
						$catalogue[$cle_simplifiee]['options']['prive'] != 1;
2446 jpm 561
 
562
		return $affichable;
2403 aurelien 563
	}
1338 jpm 564
 
416 aurelien 565
	private function creerCategorie($element) {
566
		$categorie = '';
567
		$categorie = 'Observation';
568
		$categorie = $this->nettoyerTexte($categorie);
569
		return $categorie;
570
	}
1338 jpm 571
 
416 aurelien 572
	private function etreFluxAdmin() {
715 delphine 573
		return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
416 aurelien 574
	}
1338 jpm 575
 
416 aurelien 576
	private function creerUrlService() {
577
		$url_service = $this->getUrlServiceBase();
528 jpm 578
		if (count($_GET) > 0) {
637 jpm 579
			$parametres_get = array();
580
			foreach ($_GET as $cle => $valeur) {
581
				$parametres_get[] = $cle.'='.$valeur;
582
			}
583
			$url_service .= '?'.implode('&amp;', $parametres_get);
416 aurelien 584
		}
585
		return $url_service;
586
	}
2143 jpm 587
 
588
	private function getIntituleAuteur($courriel) {
1410 aurelien 589
		$courriel = strtolower($courriel);
2143 jpm 590
		if(isset($this->auteurs[$courriel])) {
1410 aurelien 591
			$intitule = $this->auteurs[$courriel];
592
		} else {
593
			$intitule = $courriel;
2143 jpm 594
		}
595
		return $intitule;
1338 jpm 596
	}
597
}