Subversion Repositories eFlore/Applications.cel

Rev

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