Subversion Repositories eFlore/Applications.cel

Rev

Rev 1320 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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