Subversion Repositories eFlore/Applications.cel

Rev

Rev 3671 | Rev 3792 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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