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