Subversion Repositories eFlore/Applications.cel

Rev

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