Subversion Repositories eFlore/Applications.cel

Rev

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

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