Subversion Repositories eFlore/Applications.cel

Rev

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