Subversion Repositories eFlore/Applications.cel

Rev

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

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