Subversion Repositories eFlore/Applications.cel

Rev

Rev 2394 | Rev 2400 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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