Subversion Repositories eFlore/Applications.cel

Rev

Rev 2397 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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