Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 3628 Rev 3629
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service fournissant des informations concernant les images du CEL au format RSS1, RSS2 ou ATOM.
4
 * Service fournissant des informations concernant les images du CEL au format RSS1, RSS2 ou ATOM.
5
 
5
 
6
 *
6
 *
7
 * @internal   Mininum PHP version : 5.2
7
 * @internal   Mininum PHP version : 5.2
8
 * @category   CEL
8
 * @category   CEL
9
 * @package    Services
9
 * @package    Services
10
 * @subpackage Syndication
10
 * @subpackage Syndication
11
 * @version    0.1
11
 * @version    0.1
12
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
12
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
13
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
14
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
14
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
15
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
15
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
16
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
17
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
18
 */
18
 */
19
class CelSyndicationImage extends Cel {
19
class CelSyndicationImage extends Cel {
20
 
20
 
21
	private $parametres_origines = null;
21
	private $parametres_origines = null;
22
	private $format = null;
22
	private $format = null;
23
	private $service = null;
23
	private $service = null;
24
	private $squelette = null;
24
	private $squelette = null;
25
	private $squelette_dossier = null;
25
	private $squelette_dossier = null;
26
	private $auteurs = array();
26
	private $auteurs = array();
27
	private $flux = array();
27
	private $flux = array();
28
 
28
 
29
	private $format_image = 'XL';
29
	private $format_image = 'XL';
30
 
30
 
31
	private $criteres = array(
31
	private $criteres = array(
32
		'utilisateur' => 'b.courriel_utilisateur',
32
		'utilisateur' => 'b.courriel_utilisateur',
33
		'commune' => 'b.zone_geo',
33
		'commune' => 'b.zone_geo',
34
		'dept' => 'b.dept',
34
		'dept' => 'b.dept',
35
		'taxon' => 'b.nom_ret',
35
		'taxon' => 'b.nom_ret',
36
		'num_taxon' => 'b.nt',
36
		'num_taxon' => 'b.nt',
37
		'num_nom' => 'b.nom_sel_nn',
37
		'num_nom' => 'b.nom_sel_nn',
38
		'commentaire' => 'c.commentaire',
38
		'commentaire' => 'c.commentaire',
39
		'date' => 'c.date_prise_de_vue',
39
		'date' => 'c.date_prise_de_vue',
40
		'tag' => 'tag',
40
		'tag' => 'tag',
41
		'motcle' => 'tag',
41
		'motcle' => 'tag',
42
		'projet' => 'projet',
42
		'projet' => 'projet',
43
		'referentiel' => 'referentiel',
43
		'referentiel' => 'referentiel',
44
		'groupe_zones_geo' => 'groupe_zones_geo',
44
		'groupe_zones_geo' => 'groupe_zones_geo',
45
	    'standard' => 'donnees_standard'
45
	    'standard' => 'donnees_standard'
46
	);
46
	);
47
 
47
 
48
	/**
48
	/**
49
	 * Méthode appelée avec une requête de type GET.
49
	 * Méthode appelée avec une requête de type GET.
50
	 */
50
	 */
51
	public function getElement($params = array()) {
51
	public function getElement($params = array()) {
52
		// Initialisation des variables
52
		// Initialisation des variables
53
		$this->parametres_origines = $params;
53
		$this->parametres_origines = $params;
54
		$info = array();
54
		$info = array();
55
		$contenu = '';
55
		$contenu = '';
56
 
56
 
57
		if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
57
		if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
58
			// Pré traitement des paramêtres
58
			// Pré traitement des paramêtres
59
			$pour_bdd = false;
59
			$pour_bdd = false;
60
			$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
60
			$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
61
			extract($p);
61
			extract($p);
62
			$this->parametres = $params;
62
			$this->parametres = $params;
63
			$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
63
			$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
64
 
64
 
65
			// Récupération de la liste des flux
65
			// Récupération de la liste des flux
66
			$this->chargerListeDesFlux();
66
			$this->chargerListeDesFlux();
67
 
67
 
68
			// Chargement du bon type de service demandé
68
			// Chargement du bon type de service demandé
69
			if (isset($service)) {
69
			if (isset($service)) {
70
				$this->service = $this->traiterNomService($service);
70
				$this->service = $this->traiterNomService($service);
71
				$methode = $this->getNomMethodeService();
71
				$methode = $this->getNomMethodeService();
72
				if (method_exists($this, $methode)) {
72
				if (method_exists($this, $methode)) {
73
					if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
73
					if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
74
						// Mise en minuscule de l'indication du format
74
						// Mise en minuscule de l'indication du format
75
						$this->format = strtolower($format);
75
						$this->format = strtolower($format);
76
						// Définition du fichier squelette demandé
76
						// Définition du fichier squelette demandé
77
						$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
77
						$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
78
					} else if (isset($this->flux[$this->service])) {
78
					} else if (isset($this->flux[$this->service])) {
79
						$this->format = '';
79
						$this->format = '';
80
						$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
80
						$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
81
					}
81
					}
82
 
82
 
83
					if (!isset($this->flux[$this->service]) || isset($this->format)) {
83
					if (!isset($this->flux[$this->service]) || isset($this->format)) {
84
						// Suppression des deux premiers paramètres (service et format)  pour le reste des méthodes
84
						// Suppression des deux premiers paramètres (service et format)  pour le reste des méthodes
85
						array_shift($this->parametres);
85
						array_shift($this->parametres);
86
						array_shift($this->parametres);
86
						array_shift($this->parametres);
87
 
87
 
88
						// Récupération du contenu à renvoyer
88
						// Récupération du contenu à renvoyer
89
						$contenu = $this->$methode();
89
						$contenu = $this->$methode();
90
					}
90
					}
91
				} else {
91
				} else {
92
					$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
92
					$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
93
				}
93
				}
94
			} else {
94
			} else {
95
				$this->messages[] = "Le service CEL Syndication Image nécessite d'indiquer en premier paramètre le type d'information demandé.";
95
				$this->messages[] = "Le service CEL Syndication Image nécessite d'indiquer en premier paramètre le type d'information demandé.";
96
			}
96
			}
97
		}
97
		}
98
 
98
 
99
		// Envoie sur la sortie standard
99
		// Envoie sur la sortie standard
100
		$encodage = 'utf-8';
100
		$encodage = 'utf-8';
101
		$mime = $this->getTypeMime();
101
		$mime = $this->getTypeMime();
102
		$formatage_json = $this->getFormatageJson();
102
		$formatage_json = $this->getFormatageJson();
103
		$this->envoyer($contenu, $mime, $encodage, $formatage_json);
103
		$this->envoyer($contenu, $mime, $encodage, $formatage_json);
104
	}
104
	}
105
 
105
 
106
	private function chargerListeDesFlux() {
106
	private function chargerListeDesFlux() {
107
		$this->setFlux('simple', 'Nouvelles images liées à une observation dans le CEL',
107
		$this->setFlux('simple', 'Nouvelles images liées à une observation dans le CEL',
108
			"Ce flux fournit l'url des nouvelles images du CEL liées à une observation.");
108
			"Ce flux fournit l'url des nouvelles images du CEL liées à une observation.");
109
		$this->setFlux('complet', 'Nouvelles images liées à une observation dans le CEL (détails)',
109
		$this->setFlux('complet', 'Nouvelles images liées à une observation dans le CEL (détails)',
110
			"Ce flux fournit les informations sur les nouvelles images du CEL liées à une observation.");
110
			"Ce flux fournit les informations sur les nouvelles images du CEL liées à une observation.");
111
		$this->setFlux('par-mots-cles', 'Flux de syndication obsolète',
111
		$this->setFlux('par-mots-cles', 'Flux de syndication obsolète',
112
			"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'.");
112
			"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'.");
113
		$this->setFlux('par-commune','Flux de syndication obsolète',
113
		$this->setFlux('par-commune','Flux de syndication obsolète',
114
			"Ce flux  est désormais accessible via le flux multicriteres/atom/M?commune='commune'.");
114
			"Ce flux  est désormais accessible via le flux multicriteres/atom/M?commune='commune'.");
115
		$this->setFlux('multicriteres','Flux de syndication des nouvelles images liées à une observation publique du CEL '.
115
		$this->setFlux('multicriteres','Flux de syndication des nouvelles images liées à une observation publique du CEL '.
116
			'filtrées par un ou plusieurs critères',
116
			'filtrées par un ou plusieurs critères',
117
			"Ce flux fournit des informations sur les nouvelles images liées à une observation du CEL filtrées par ".
117
			"Ce flux fournit des informations sur les nouvelles images liées à une observation du CEL filtrées par ".
118
			"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, tag ".
118
			"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, tag ".
119
			"et/ou date.");
119
			"et/ou date.");
120
	}
120
	}
121
 
121
 
122
	private function setFlux($nom, $titre, $description) {
122
	private function setFlux($nom, $titre, $description) {
123
		$url_base = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/';
123
		$url_base = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/';
124
		$formats = array('atom', 'rss2', 'rss1');
124
		$formats = array('atom', 'rss2', 'rss1');
125
		$flux = array();
125
		$flux = array();
126
		foreach ($formats as $format) {
126
		foreach ($formats as $format) {
127
			$url = $url_base.$nom.'/'.$format;
127
			$url = $url_base.$nom.'/'.$format;
128
			$flux[$format] = $url;
128
			$flux[$format] = $url;
129
		}
129
		}
130
		$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
130
		$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
131
	}
131
	}
132
 
132
 
133
	private function getFlux($nom) {
133
	private function getFlux($nom) {
134
		return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
134
		return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
135
	}
135
	}
136
 
136
 
137
	private function traiterNomService($nom) {
137
	private function traiterNomService($nom) {
138
		$nom = strtolower($nom);
138
		$nom = strtolower($nom);
139
		return $nom;
139
		return $nom;
140
	}
140
	}
141
 
141
 
142
	private function getNomMethodeService() {
142
	private function getNomMethodeService() {
143
		$methode = '';
143
		$methode = '';
144
		$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
144
		$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
145
		$methode = 'getService'.$service_formate;
145
		$methode = 'getService'.$service_formate;
146
		return $methode;
146
		return $methode;
147
	}
147
	}
148
 
148
 
149
	private function getUrlBase() {
149
	private function getUrlBase() {
150
		$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
150
		$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
151
		return $url_base;
151
		return $url_base;
152
	}
152
	}
153
 
153
 
154
	private function getUrlServiceBase() {
154
	private function getUrlServiceBase() {
155
		$url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
155
		$url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
156
		return $url_service;
156
		return $url_service;
157
	}
157
	}
158
 
158
 
159
	private function getTypeMime() {
159
	private function getTypeMime() {
160
		$mime = '';
160
		$mime = '';
161
		switch ($this->format) {
161
		switch ($this->format) {
162
			case 'atom' :
162
			case 'atom' :
163
				$mime = 'application/atom+xml';
163
				$mime = 'application/atom+xml';
164
				break;
164
				break;
165
			case 'rss1' :
165
			case 'rss1' :
166
			case 'rss2' :
166
			case 'rss2' :
167
				$mime = 'application/rss+xml';
167
				$mime = 'application/rss+xml';
168
				break;
168
				break;
169
			case 'opml' :
169
			case 'opml' :
170
				$mime = 'text/x-opml';
170
				$mime = 'text/x-opml';
171
				break;
171
				break;
172
			default:
172
			default:
173
				$mime = 'text/html';
173
				$mime = 'text/html';
174
		}
174
		}
175
		return $mime;
175
		return $mime;
176
	}
176
	}
177
 
177
 
178
	private function getFormatageJson() {
178
	private function getFormatageJson() {
179
		$json = false;
179
		$json = false;
180
		switch ($this->service) {
180
		switch ($this->service) {
181
			case 'liste-des-flux' :
181
			case 'liste-des-flux' :
182
				$json = true;
182
				$json = true;
183
				break;
183
				break;
184
			default:
184
			default:
185
				$json = false;
185
				$json = false;
186
		}
186
		}
187
		return $json;
187
		return $json;
188
	}
188
	}
189
 
189
 
190
	private function creerCategorie($element) {
190
	private function creerCategorie($element) {
191
		$categorie = '';
191
		$categorie = '';
192
		$categorie = 'Image';
192
		$categorie = 'Image';
193
		$categorie = $this->nettoyerTexte($categorie);
193
		$categorie = $this->nettoyerTexte($categorie);
194
		return $categorie;
194
		return $categorie;
195
	}
195
	}
196
 
196
 
197
	private function etreFluxAdmin() {
197
	private function etreFluxAdmin() {
198
		return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
198
		return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
199
	}
199
	}
200
 
200
 
201
	private function creerUrlService() {
201
	private function creerUrlService() {
202
		$url_service = $this->getUrlServiceBase();
202
		$url_service = $this->getUrlServiceBase();
203
		if (count($_GET) > 0) {
203
		if (count($_GET) > 0) {
204
			$parametres_get = array();
204
			$parametres_get = array();
205
			foreach ($_GET as $cle => $valeur) {
205
			foreach ($_GET as $cle => $valeur) {
206
				$parametres_get[] = $cle.'='.$valeur;
206
				$parametres_get[] = $cle.'='.$valeur;
207
			}
207
			}
208
			$url_service .= '?'.implode('&amp;', $parametres_get);
208
			$url_service .= '?'.implode('&amp;', $parametres_get);
209
		}
209
		}
210
		return $url_service;
210
		return $url_service;
211
	}
211
	}
212
 
212
 
213
	protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) {
213
	protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) {
214
		$infos = null;
214
		$infos = null;
215
		try {
215
		try {
216
			$infos = Cel::db()->query($requete)->fetchAll(PDO::FETCH_ASSOC);
216
			$infos = Cel::db()->query($requete)->fetchAll(PDO::FETCH_ASSOC);
217
			if ($infos === false) {
217
			if ($infos === false) {
218
				$this->messages[] = "La requête suivante n'a retourné aucun résultat :\n$requete";
218
				$this->messages[] = "La requête suivante n'a retourné aucun résultat :\n$requete";
219
			}
219
			}
220
		} catch (PDOException $e) {
220
		} catch (PDOException $e) {
221
			$msgTpl = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s';
221
			$msgTpl = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s';
222
			$this->messages[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage());
222
			$this->messages[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage());
223
		}
223
		}
224
		return $infos;
224
		return $infos;
225
	}
225
	}
226
 
226
 
227
	private function executerService($elements) {
227
	private function executerService($elements) {
228
		// Prétraitement des données
228
		// Prétraitement des données
229
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
229
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
230
		foreach ($elements as $element) {
230
		foreach ($elements as $element) {
231
			$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur'];
231
			$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur'];
232
		}
232
		}
233
		$this->auteurs = $this->creerAuteurs($identifiants);
233
		$this->auteurs = $this->creerAuteurs($identifiants);
234
 
234
 
235
		foreach ($elements as $element) {
235
		foreach ($elements as $element) {
236
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
236
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
237
		}
237
		}
238
 
238
 
239
		// Création du contenu à partir d'un template PHP
239
		// Création du contenu à partir d'un template PHP
240
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
240
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
241
 
241
 
242
		return $contenu;
242
		return $contenu;
243
	}
243
	}
244
 
244
 
245
	private function construireDonneesCommunesAuFlux($infos) {
245
	private function construireDonneesCommunesAuFlux($infos) {
246
		$donnees = $this->getFlux($this->service);
246
		$donnees = $this->getFlux($this->service);
247
		$donnees['guid'] = $this->getUrlServiceBase();
247
		$donnees['guid'] = $this->getUrlServiceBase();
248
		$donnees['lien_service'] = $this->creerUrlService();
248
		$donnees['lien_service'] = $this->creerUrlService();
249
		$donnees['lien_cel'] = (isset($infos['nom_sel_nn']) && $infos['nom_sel_nn'] != '' && $infos['nom_sel_nn'] != 0) ?
249
		$donnees['lien_cel'] = (isset($infos['nom_sel_nn']) && $infos['nom_sel_nn'] != '' && $infos['nom_sel_nn'] != 0) ?
250
			$this->getUrlEflore($infos['nom_referentiel'], $infos['nom_sel_nn']) : '';
250
			$this->getUrlEflore($infos['nom_referentiel'], $infos['nom_sel_nn']) : '';
251
		$donnees['editeur'] = $this->config['settings']['editeur'];
251
		$donnees['editeur'] = $this->config['settings']['editeur'];
252
		$derniere_info_en_date = reset($infos);
252
		$derniere_info_en_date = reset($infos);
253
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_creation']);
253
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_creation']);
254
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
254
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
255
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
255
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
256
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
256
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
257
		$donnees['annee_courante'] = date('Y');
257
		$donnees['annee_courante'] = date('Y');
258
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage';
258
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage';
259
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
259
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
260
		return $donnees;
260
		return $donnees;
261
	}
261
	}
262
 
262
 
263
	private function construireDonneesCommunesAuxItems($info) {
263
	private function construireDonneesCommunesAuxItems($info) {
264
		$item = array();
264
		$item = array();
265
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date_creation']);
265
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date_creation']);
266
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
266
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
267
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
267
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
268
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
268
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
269
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
269
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
270
		$item['titre'] = $this->creerTitre($info);
270
		$item['titre'] = $this->creerTitre($info);
271
		$item['guid'] = $this->creerGuidItem($info);
271
		$item['guid'] = $this->creerGuidItem($info);
272
		$item['lien'] = $this->creerLienItem($info);
272
		$item['lien'] = $this->creerLienItem($info);
273
		$item['categorie'] = $this->creerCategorie($item);
273
		$item['categorie'] = $this->creerCategorie($item);
274
		$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($info), $item);
274
		$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($info), $item);
275
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
275
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
276
		$item['modifier_par'] = $this->nettoyerTexte($this->getIntituleAuteur($info['courriel_utilisateur']));
276
		$item['modifier_par'] = $this->nettoyerTexte($this->getIntituleAuteur($info['courriel_utilisateur']));
277
		return $item;
277
		return $item;
278
	}
278
	}
279
 
279
 
280
	private function creerGuidItem($element) {
280
	private function creerGuidItem($element) {
281
		$guid = $this->getUrlImage($element['id_image']);
281
		$guid = $this->getUrlImage($element['id_image']);
282
		return $guid;
282
		return $guid;
283
	}
283
	}
284
 
284
 
285
	private function creerTitre($element) {
285
	private function creerTitre($element) {
286
		$methode = 'creerTitre'.$this->service;
286
		$methode = 'creerTitre'.$this->service;
287
		$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple';
287
		$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple';
288
		$titre = $this->$methode($element);
288
		$titre = $this->$methode($element);
289
		$titre = $this->nettoyerTexte($titre);
289
		$titre = $this->nettoyerTexte($titre);
290
		return $titre;
290
		return $titre;
291
	}
291
	}
292
 
292
 
293
	private function creerDescription($donnees, $item) {
293
	private function creerDescription($donnees, $item) {
294
		$methode = 'creerDescription'.$this->service;
294
		$methode = 'creerDescription'.$this->service;
295
		$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet';
295
		$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet';
296
		$description = $this->$methode($donnees, $item);
296
		$description = $this->$methode($donnees, $item);
297
		$description = $this->nettoyerTexte($description);
297
		$description = $this->nettoyerTexte($description);
298
		return $description;
298
		return $description;
299
	}
299
	}
300
 
300
 
301
	private function creerLienItem($element) {
301
	private function creerLienItem($element) {
302
 
302
 
303
		if ($this->etreNull($element['id_observation'])) {
303
		if ($this->etreNull($element['id_observation'])) {
304
			// Lien vers image grand format
304
			// Lien vers image grand format
305
			$lien = $this->getUrlImage($element['id_image'], $this->format_image);
305
			$lien = $this->getUrlImage($element['id_image'], $this->format_image);
306
		} else {
306
		} else {
307
			// Lien vers fiche eFlore onglet Illustration
307
			// Lien vers fiche eFlore onglet Illustration
308
			$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
308
			$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
309
		}
309
		}
310
		return $lien;
310
		return $lien;
311
	}
311
	}
312
 
312
 
313
	private function getServiceListeDesFlux() {
313
	private function getServiceListeDesFlux() {
314
		return $this->flux;
314
		return $this->flux;
315
	}
315
	}
316
 
316
 
317
	private function getServiceOpml() {
317
	private function getServiceOpml() {
318
		$donnees = array();
318
		$donnees = array();
319
		$id = 1;
319
		$id = 1;
320
		foreach ($this->flux as $flux_nom => $flux){
320
		foreach ($this->flux as $flux_nom => $flux){
321
			$info = array();
321
			$info = array();
322
			$info['type'] = 'atom';
322
			$info['type'] = 'atom';
323
			$info['titre'] = $flux['titre'];
323
			$info['titre'] = $flux['titre'];
324
			$info['texte'] = "CEL - Images - $flux_nom";
324
			$info['texte'] = "CEL - Images - $flux_nom";
325
			$info['description'] = $flux['description'];
325
			$info['description'] = $flux['description'];
326
			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
326
			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
327
			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
327
			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
328
			$donnees['liste_flux'][] = $info;
328
			$donnees['liste_flux'][] = $info;
329
		}
329
		}
330
 
330
 
331
		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
331
		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
332
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
332
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
333
		return $contenu;
333
		return $contenu;
334
	}
334
	}
335
 
335
 
336
	private function getServiceSimple() {
336
	private function getServiceSimple() {
337
		if (isset($this->parametres[0])) {
337
		if (isset($this->parametres[0])) {
338
			$this->format_image = $this->parametres[0];
338
			$this->format_image = $this->parametres[0];
339
		}
339
		}
340
 
340
 
341
		// Construction de la requête
341
		// Construction de la requête
342
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '.
342
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '.
343
			' ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '.
343
			' ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '.
344
			' co.mots_cles_texte AS mots_cles_texte_images_obs, "" as commentaire, "" as note_qualite, nom_referentiel '.
344
			' co.mots_cles_texte AS mots_cles_texte_images_obs, "" as commentaire, "" as note_qualite, nom_referentiel '.
345
			'FROM cel_export_total AS co LEFT JOIN cel_images_export AS ci ON (co.id_observation = ci.ce_observation) '.
345
			'FROM cel_export_total AS co LEFT JOIN cel_images_export AS ci ON (co.id_observation = ci.ce_observation) '.
346
			'WHERE co.transmission = 1 '.
346
			'WHERE co.transmission = 1 '.
347
			'	AND co.ce_utilisateur = ci.ce_utilisateur '.
347
			'	AND co.ce_utilisateur = ci.ce_utilisateur '.
348
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'ci.date_creation DESC').' '.
348
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'ci.date_creation DESC').' '.
349
			"LIMIT $this->start, $this->limit ";
349
			"LIMIT $this->start, $this->limit ";
350
 
350
 
351
		$elements = $this->executerRequete($requete);
351
		$elements = $this->executerRequete($requete);
352
 
352
 
353
		// Création du contenu
353
		// Création du contenu
354
		$contenu = $this->executerService($elements);
354
		$contenu = $this->executerService($elements);
355
		return $contenu;
355
		return $contenu;
356
	}
356
	}
357
 
357
 
358
	private function creerTitreSimple($element) {
358
	private function creerTitreSimple($element) {
359
		$date = $element['date_observation'];
359
		$date = $element['date_observation'];
360
		$date = date("d/m/Y", strtotime($date));
360
		$date = date("d/m/Y", strtotime($date));
361
		if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['nom_sel_nn'])) {
361
		if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['nom_sel_nn'])) {
362
			$titre = "Ajout d'une photo par ".$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;
362
			$titre = "Ajout d'une photo par ".$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;
363
		} else {
363
		} else {
364
			$titre = $element['nom_sel'].' [nn'.$element['nom_sel_nn'].'] par '.$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;
364
			$titre = $element['nom_sel'].' [nn'.$element['nom_sel_nn'].'] par '.$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;
365
		}
365
		}
366
		$zoneGeo = $element['zone_geo'];
366
		$zoneGeo = $element['zone_geo'];
367
		if ($zoneGeo) {
367
		if ($zoneGeo) {
368
			$titre .= " - $zoneGeo";
368
			$titre .= " - $zoneGeo";
369
		}
369
		}
370
		return $titre;
370
		return $titre;
371
	}
371
	}
372
 
372
 
373
	private function creerDescriptionSimple($donnees, $item) {
373
	private function creerDescriptionSimple($donnees, $item) {
374
		$description = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
374
		$description = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
375
		return $description;
375
		return $description;
376
	}
376
	}
377
 
377
 
378
	private function getServiceComplet() {
378
	private function getServiceComplet() {
379
 
379
 
380
		// Construction de la requête
380
		// Construction de la requête
381
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '.
381
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '.
382
			'	ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '.
382
			'	ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '.
383
			'	co.mots_cles_texte AS mots_cles_texte_obs, ci.commentaire AS commentaire_img, note_qualite, nom_referentiel, '.
383
			'	co.mots_cles_texte AS mots_cles_texte_obs, ci.commentaire AS commentaire_img, note_qualite, nom_referentiel, '.
384
			'	co.commentaire AS commentaire_obs '.
384
			'	co.commentaire AS commentaire_obs '.
385
			'FROM cel_images_export AS ci '.
385
			'FROM cel_images_export AS ci '.
386
			'	LEFT JOIN cel_export_total AS co '.
386
			'	LEFT JOIN cel_export_total AS co '.
387
			'		ON (ci.ce_observation = co.id_observation) '.
387
			'		ON (ci.ce_observation = co.id_observation) '.
388
			(($this->etreFluxAdmin()) ? '' : 'WHERE co.transmission = 1 ').
388
			(($this->etreFluxAdmin()) ? '' : 'WHERE co.transmission = 1 ').
389
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'ci.date_creation DESC').' '.
389
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'ci.date_creation DESC').' '.
390
			"LIMIT $this->start, $this->limit ";
390
			"LIMIT $this->start, $this->limit ";
391
		//echo $requete;
391
		//echo $requete;
392
		$elements = $this->executerRequete($requete);
392
		$elements = $this->executerRequete($requete);
393
 
393
 
394
		// Création du contenu
394
		// Création du contenu
395
		if ($elements != false && count($elements) > 0) {
395
		if ($elements != false && count($elements) > 0) {
396
			$contenu = $this->executerService($elements);
396
			$contenu = $this->executerService($elements);
397
		} else {
397
		} else {
398
			// ne pas faire ça, car ça déclenche une erreur 500 à tort !
398
			// ne pas faire ça, car ça déclenche une erreur 500 à tort !
399
			//$this->messages[] = "Aucune image disponible.";
399
			//$this->messages[] = "Aucune image disponible.";
400
			$contenu = array();
400
			$contenu = array();
401
		}
401
		}
402
 
402
 
403
		return $contenu;
403
		return $contenu;
404
	}
404
	}
405
 
405
 
406
	private function getServiceMultiCriteres() {
406
	private function getServiceMultiCriteres() {
407
		$contenu = '';
407
		$contenu = '';
408
		if (isset($_GET['debut'])) $this->start = $_GET['debut'];
408
		if (isset($_GET['debut'])) $this->start = $_GET['debut'];
409
		if (isset($_GET['limite'])) $this->limit = $_GET['limite'];
409
		if (isset($_GET['limite'])) $this->limit = $_GET['limite'];
410
 
410
 
411
		$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
411
		$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
412
 
412
 
413
		if ($this->parametresSontDemandes()) {
413
		if ($this->parametresSontDemandes()) {
414
			$requete = $this->creerRequeteAvecParametres();
414
			$requete = $this->creerRequeteAvecParametres();
415
		} else {
415
		} else {
416
			$requete = $this->creerRequeteSansParametres();
416
			$requete = $this->creerRequeteSansParametres();
417
		}
417
		}
418
		$elements = $this->executerRequete($requete);
418
		$elements = $this->executerRequete($requete);
419
 
419
 
420
		// Création du contenu
420
		// Création du contenu
421
		if ($elements != false && count($elements) > 0) {
421
		if ($elements != false && count($elements) > 0) {
422
			$contenu = $this->executerService($elements);
422
			$contenu = $this->executerService($elements);
423
		} else {
423
		} else {
424
			// ne pas faire ça, car ça déclenche une erreur 500 à tort !
424
			// ne pas faire ça, car ça déclenche une erreur 500 à tort !
425
			//$this->messages[] = "Aucune image disponible.";
425
			//$this->messages[] = "Aucune image disponible.";
426
		}
426
		}
427
 
427
 
428
        return $contenu;
428
        return $contenu;
429
	}
429
	}
430
 
430
 
431
	private function parametresSontDemandes() {
431
	private function parametresSontDemandes() {
432
		$criteres = $this->traiterCriteresMultiples($_GET) ;
432
		$criteres = $this->traiterCriteresMultiples($_GET) ;
433
		return (isset($_GET['recherche']) && $_GET['recherche'] != '') || !empty($criteres);
433
		return (isset($_GET['recherche']) && $_GET['recherche'] != '') || !empty($criteres);
434
	}
434
	}
435
 
435
 
436
	private function creerRequeteSansParametres() {
436
	private function creerRequeteSansParametres() {
437
		// Construction de la requête
437
		// Construction de la requête
438
		$requete = 'SELECT *, b.mots_cles_texte AS mots_cles_texte_obs, c.mots_cles_texte AS mots_cles_texte_images, '.
438
		$requete = 'SELECT *, b.mots_cles_texte AS mots_cles_texte_obs, c.mots_cles_texte AS mots_cles_texte_images, '.
439
			' b.commentaire AS commentaire_obs, "" AS commentaire_img, nom_referentiel '.
439
			' b.commentaire AS commentaire_obs, "" AS commentaire_img, nom_referentiel '.
440
			'FROM cel_images_export c '.
440
			'FROM cel_images_export c '.
441
			'	left JOIN cel_export AS b '.
441
			'	left JOIN cel_export AS b '.
442
			'		ON (c.ce_observation = b.id_observation) ';
442
			'		ON (c.ce_observation = b.id_observation) ';
443
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'c.date_creation DESC').' '.
443
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'c.date_creation DESC').' '.
444
				"LIMIT $this->start,$this->limit ";
444
				"LIMIT $this->start,$this->limit ";
445
		//echo $requete;
445
		//echo $requete;
446
		return $requete;
446
		return $requete;
447
	}
447
	}
448
 
448
 
449
	private function creerRequeteAvecParametres() {
449
	private function creerRequeteAvecParametres() {
450
		// Construction de la requête
450
		// Construction de la requête
451
		$requete = 'SELECT *, b.mots_cles_texte as mots_cles_texte_obs, c.mots_cles_texte as mots_cles_texte_images, '.
451
		$requete = 'SELECT *, b.mots_cles_texte as mots_cles_texte_obs, c.mots_cles_texte as mots_cles_texte_images, '.
452
		    ' b.commentaire as commentaire_obs, "" as commentaire_img, nom_referentiel '.
452
		    ' b.commentaire as commentaire_obs, "" as commentaire_img, nom_referentiel '.
453
			'FROM cel_images_export AS c '.
453
			'FROM cel_images_export AS c '.
454
			'	INNER JOIN cel_export_total AS b '.
454
			'	INNER JOIN cel_export_total AS b '.
455
			'		ON (c.ce_observation = b.id_observation) '.
455
			'		ON (c.ce_observation = b.id_observation) '.
456
			'WHERE donnees_standard = 1'.
456
			'WHERE donnees_standard = 1'.
457
			(($this->etreFluxAdmin()) ? '' : 'AND b.transmission = 1 ').
457
			(($this->etreFluxAdmin()) ? '' : ' AND b.transmission = 1 ').
458
			'	AND ';
458
			'	AND ';
459
 
459
 
460
		if ($this->estUneRechercheGenerale()) {
460
		if ($this->estUneRechercheGenerale()) {
461
			$chaine_requete = $_GET['recherche'];
461
			$chaine_requete = $_GET['recherche'];
462
			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
462
			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
463
		} else {
463
		} else {
464
			$criteres = $this->traiterCriteresMultiples($_GET) ;
464
			$criteres = $this->traiterCriteresMultiples($_GET) ;
465
			if (!empty($criteres)) {
465
			if (!empty($criteres)) {
466
				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
466
				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
467
			}
467
			}
468
		}
468
		}
469
		$requete = str_replace(' AND ) ',' ', $requete);
469
		$requete = str_replace(' AND ) ',' ', $requete);
470
		$requete = rtrim($requete, 'AND ');
470
		$requete = rtrim($requete, 'AND ');
471
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
471
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
472
			'c.date_creation DESC').' '."LIMIT $this->start,$this->limit ";
472
			'c.date_creation DESC').' '."LIMIT $this->start,$this->limit ";
473
		return $requete;
473
		return $requete;
474
	}
474
	}
475
 
475
 
476
	private function creerSousRequeteRechercheParCriteres($criteres) {
476
	private function creerSousRequeteRechercheParCriteres($criteres) {
477
		$requete = '';
477
		$requete = '';
478
		foreach ($criteres as $pair) {
478
		foreach ($criteres as $pair) {
479
			$nom_valeur = explode("=",$pair);
479
			$nom_valeur = explode("=",$pair);
480
			if (sizeof($nom_valeur) != 0) {
480
			if (sizeof($nom_valeur) != 0) {
481
				switch ($nom_valeur[0]) {
481
				switch ($nom_valeur[0]) {
482
					case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
482
					case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
483
					case "c.ci_numero_page" : $this->limit*Cel::db()->quote($nom_valeur[1]); break;
483
					case "c.ci_numero_page" : $this->limit*Cel::db()->quote($nom_valeur[1]); break;
484
					case "c.commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
484
					case "c.commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
485
						foreach($mots_comment_liste as $mot_comment) {
485
						foreach($mots_comment_liste as $mot_comment) {
486
							$mot_comment = trim($mot_comment) ;
486
							$mot_comment = trim($mot_comment) ;
487
							$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
487
							$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
488
						}
488
						}
489
						break;
489
						break;
490
					case "c.date_prise_de_vue" :
490
					case "c.date_prise_de_vue" :
491
						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
491
						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
492
						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
492
						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
493
							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
493
							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
494
						}
494
						}
495
						$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote($nom_valeur[1]."%").' AND '; break;
495
						$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote($nom_valeur[1]."%").' AND '; break;
496
					case "b.ce_zone_geo" :
496
					case "b.ce_zone_geo" :
497
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%") AND '; break;
497
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%") AND '; break;
498
					case "b.nom_ret" :
498
					case "b.nom_ret" :
499
						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
499
						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
500
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'.
500
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'.
501
							$nom_valeur[1].'%") AND '; break;
501
							$nom_valeur[1].'%") AND '; break;
502
					case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
502
					case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
503
					case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]).' AND '; break;
503
					case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]).' AND '; break;
504
					case "referentiel" : $requete .= $this->creerSousRequeteReferentiel($nom_valeur[1]).' AND '; break;
504
					case "referentiel" : $requete .= $this->creerSousRequeteReferentiel($nom_valeur[1]).' AND '; break;
505
					case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break;
505
					case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break;
506
					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
506
					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
507
				}
507
				}
508
			}
508
			}
509
		}
509
		}
510
		$requete = rtrim($requete,' AND ');
510
		$requete = rtrim($requete,' AND ');
511
		return $requete;
511
		return $requete;
512
	}
512
	}
513
	
513
	
514
	private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) {
514
	private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) {
515
		$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo);
515
		$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo);
516
		$res = Cel::db()->requeter($req);
516
		$res = Cel::db()->requeter($req);
517
		$zones = array();
517
		$zones = array();
518
		foreach($res as &$r) {
518
		foreach($res as &$r) {
519
			$zones[] = Cel::db()->proteger($r['valeur']);
519
			$zones[] = Cel::db()->proteger($r['valeur']);
520
		}
520
		}
521
		$sql = '(b.ce_zone_geo IN ('.implode(',', $zones).')) ';
521
		$sql = '(b.ce_zone_geo IN ('.implode(',', $zones).')) ';
522
	
522
	
523
		return $sql;
523
		return $sql;
524
	}
524
	}
525
 
525
 
526
	private function creerSousRequeteMotsCles($mot_cle) {
526
	private function creerSousRequeteMotsCles($mot_cle) {
527
	$requete = '';
527
	$requete = '';
528
		if (preg_match('/.*OU.*/', $mot_cle)) {
528
		if (preg_match('/.*OU.*/', $mot_cle)) {
529
			$mots_cles_tab = explode('OU',$mot_cle);
529
			$mots_cles_tab = explode('OU',$mot_cle);
530
			foreach($mots_cles_tab as $mot_cle_item) {
530
			foreach($mots_cles_tab as $mot_cle_item) {
531
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
531
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
532
			}
532
			}
533
			$requete = '('.rtrim($requete,'OR ').')';
533
			$requete = '('.rtrim($requete,'OR ').')';
534
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
534
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
535
			$mots_cles_tab = explode('ET',$mot_cle);
535
			$mots_cles_tab = explode('ET',$mot_cle);
536
			foreach($mots_cles_tab as $mot_cle_item) {
536
			foreach($mots_cles_tab as $mot_cle_item) {
537
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
537
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
538
			}
538
			}
539
			$requete = '('.rtrim($requete, 'AND ').') ';
539
			$requete = '('.rtrim($requete, 'AND ').') ';
540
		} else {
540
		} else {
541
			$requete = "(c.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
541
			$requete = "(c.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
542
		}
542
		}
543
		return $requete;
543
		return $requete;
544
	}
544
	}
545
 
545
 
546
	private function creerSousRequeteProjet($mot_cle) {
546
	private function creerSousRequeteProjet($mot_cle) {
547
		$requete = '';
547
		$requete = '';
548
		if (preg_match('/.*OU.*/', $mot_cle)) {
548
		if (preg_match('/.*OU.*/', $mot_cle)) {
549
			$mots_cles_tab = explode('OU',$mot_cle);
549
			$mots_cles_tab = explode('OU',$mot_cle);
550
			foreach($mots_cles_tab as $mot_cle_item) {
550
			foreach($mots_cles_tab as $mot_cle_item) {
551
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
551
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
552
			}
552
			}
553
			$requete = '('.rtrim($requete,'OR ').')';
553
			$requete = '('.rtrim($requete,'OR ').')';
554
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
554
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
555
			$mots_cles_tab = explode('ET',$mot_cle);
555
			$mots_cles_tab = explode('ET',$mot_cle);
556
			foreach($mots_cles_tab as $mot_cle_item) {
556
			foreach($mots_cles_tab as $mot_cle_item) {
557
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
557
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
558
			}
558
			}
559
			$requete = '('.rtrim($requete, 'AND ').') ';
559
			$requete = '('.rtrim($requete, 'AND ').') ';
560
		} else {
560
		} else {
561
			$requete = "(b.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
561
			$requete = "(b.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
562
		}
562
		}
563
		return $requete;
563
		return $requete;
564
	}
564
	}
565
 
565
 
566
	private function creerSousRequeteReferentiel($referentiel) {
566
	private function creerSousRequeteReferentiel($referentiel) {
567
		$requete = "b.nom_referentiel LIKE '$referentiel%'";
567
		$requete = "b.nom_referentiel LIKE '$referentiel%'";
568
		return $requete;
568
		return $requete;
569
	}
569
	}
570
 
570
 
571
	private function creerSousRequeteRechercheGenerale($chaine_requete) {
571
	private function creerSousRequeteRechercheGenerale($chaine_requete) {
572
		$requete = '';
572
		$requete = '';
573
		if (trim($chaine_requete) != '') {
573
		if (trim($chaine_requete) != '') {
574
			$chaine_requete = strtolower($chaine_requete);
574
			$chaine_requete = strtolower($chaine_requete);
575
			$chaine_requete = str_replace(' ', '_', $chaine_requete);
575
			$chaine_requete = str_replace(' ', '_', $chaine_requete);
576
			$requete = ' ('.
576
			$requete = ' ('.
577
				'b.nom_ret LIKE "'.$chaine_requete.'%"'.
577
				'b.nom_ret LIKE "'.$chaine_requete.'%"'.
578
				' OR '.
578
				' OR '.
579
				'b.nom_sel LIKE "'.$chaine_requete.'%"'.
579
				'b.nom_sel LIKE "'.$chaine_requete.'%"'.
580
				' OR '.
580
				' OR '.
581
				'b.zone_geo LIKE "'.$chaine_requete.'%" '.
581
				'b.zone_geo LIKE "'.$chaine_requete.'%" '.
582
				' OR '.
582
				' OR '.
583
				'b.ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '.
583
				'b.ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '.
584
				' OR '.
584
				' OR '.
585
				'b.ce_zone_geo LIKE "'.$chaine_requete.'%" '.
585
				'b.ce_zone_geo LIKE "'.$chaine_requete.'%" '.
586
				' OR '.
586
				' OR '.
587
				'b.ce_utilisateur LIKE "'.$chaine_requete.'%" '.
587
				'b.ce_utilisateur LIKE "'.$chaine_requete.'%" '.
588
				' OR '.
588
				' OR '.
589
				'b.courriel_utilisateur LIKE "'.$chaine_requete.'%" '.
589
				'b.courriel_utilisateur LIKE "'.$chaine_requete.'%" '.
590
				' OR '.
590
				' OR '.
591
				'b.mots_cles_texte LIKE "'.$chaine_requete.'%" '.
591
				'b.mots_cles_texte LIKE "'.$chaine_requete.'%" '.
592
				') ';
592
				') ';
593
		}
593
		}
594
		return $requete;
594
		return $requete;
595
	}
595
	}
596
 
596
 
597
	private function estUneRechercheGenerale() {
597
	private function estUneRechercheGenerale() {
598
		return isset($_GET['recherche']);
598
		return isset($_GET['recherche']);
599
	}
599
	}
600
 
600
 
601
	private function traiterCriteresMultiples($tableau_criteres) {
601
	private function traiterCriteresMultiples($tableau_criteres) {
602
		$tableau_criteres_pour_bdd = array();
602
		$tableau_criteres_pour_bdd = array();
603
 
603
 
604
		foreach($tableau_criteres as $nom_critere => $valeur_critere) {
604
		foreach($tableau_criteres as $nom_critere => $valeur_critere) {
605
			if (isset($this->criteres[$nom_critere])) {
605
			if (isset($this->criteres[$nom_critere])) {
606
				$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
606
				$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
607
			}
607
			}
608
		}
608
		}
609
		return $tableau_criteres_pour_bdd;
609
		return $tableau_criteres_pour_bdd;
610
	}
610
	}
611
 
611
 
612
	private function creerDescriptionComplet($donnees, $item) {
612
	private function creerDescriptionComplet($donnees, $item) {
613
		$auteur = $this->getIntituleAuteur($donnees['courriel_utilisateur']);
613
		$auteur = $this->getIntituleAuteur($donnees['courriel_utilisateur']);
614
		$auteur_mail = $donnees['courriel_utilisateur'];
614
		$auteur_mail = $donnees['courriel_utilisateur'];
615
 
615
 
616
		$id_img = $donnees['id_image'];
616
		$id_img = $donnees['id_image'];
617
		$nom_fichier = $donnees['nom_original'];
617
		$nom_fichier = $donnees['nom_original'];
618
		$url_img = $this->getUrlImage($donnees['id_image'], 'CS');
618
		$url_img = $this->getUrlImage($donnees['id_image'], 'CS');
619
		$url_img_normale = $this->getUrlImage($donnees['id_image'], 'XL');
619
		$url_img_normale = $this->getUrlImage($donnees['id_image'], 'XL');
620
		//
620
		//
621
		$mots_cles_image = $donnees['mots_cles_texte_images'];
621
		$mots_cles_image = $donnees['mots_cles_texte_images'];
622
		$note = ($donnees['note_qualite'] +1).'/5';
622
		$note = ($donnees['note_qualite'] +1).'/5';
623
		$commentaire_img = $donnees['commentaire_img'];
623
		$commentaire_img = $donnees['commentaire_img'];
624
 
624
 
625
		$id_obs = $donnees['id_observation'];
625
		$id_obs = $donnees['id_observation'];
626
		$famille = $donnees['famille'];
626
		$famille = $donnees['famille'];
627
		$nom_saisi = $donnees['nom_sel'];
627
		$nom_saisi = $donnees['nom_sel'];
628
		$nom_retenu = $donnees['nom_ret'];
628
		$nom_retenu = $donnees['nom_ret'];
629
		//
629
		//
630
		$mots_cles_obs = $donnees['mots_cles_texte_obs'];
630
		$mots_cles_obs = $donnees['mots_cles_texte_obs'];
631
		
631
		
632
		$lieu =  $this->formaterZoneGeoEtCodePourAffichage($donnees).' > '.$donnees['lieudit'].' > '.$donnees['station'];
632
		$lieu =  $this->formaterZoneGeoEtCodePourAffichage($donnees).' > '.$donnees['lieudit'].' > '.$donnees['station'];
633
		$milieu = $donnees['milieu'];
633
		$milieu = $donnees['milieu'];
634
		$coordonnees = ($this->etreNull($donnees['latitude']) && $this->etreNull($donnees['longitude'])) ? '' : $donnees['latitude'].'/'.$donnees['longitude'];
634
		$coordonnees = ($this->etreNull($donnees['latitude']) && $this->etreNull($donnees['longitude'])) ? '' : $donnees['latitude'].'/'.$donnees['longitude'];
635
		$commentaire_obs = $donnees['commentaire_obs'];
635
		$commentaire_obs = $donnees['commentaire_obs'];
636
		$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y');
636
		$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y');
637
		$date_transmission = $this->formaterDate($donnees['date_transmission']);
637
		$date_transmission = $this->formaterDate($donnees['date_transmission']);
638
		$date_modification = $this->formaterDate($donnees['date_modification']);
638
		$date_modification = $this->formaterDate($donnees['date_modification']);
639
		$date_creation = $this->formaterDate($donnees['date_creation']);
639
		$date_creation = $this->formaterDate($donnees['date_creation']);
640
		$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
640
		$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
641
 
641
 
642
		$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
642
		$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
643
			'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'.
643
			'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'.
644
			'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'.
644
			'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'.
645
			'<div class="gauche">'.
645
			'<div class="gauche">'.
646
			'<h3>'.'Image'.'</h3>'.
646
			'<h3>'.'Image'.'</h3>'.
647
			'<ul>'.
647
			'<ul>'.
648
			'<li>'.'<span class="champ">URL :</span> <a href="'.$url_img_normale.'" onclick="javascript:window.open(this.href);return false;">'.$url_img_normale.'</a></li>'.
648
			'<li>'.'<span class="champ">URL :</span> <a href="'.$url_img_normale.'" onclick="javascript:window.open(this.href);return false;">'.$url_img_normale.'</a></li>'.
649
			'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'.
649
			'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'.
650
			'<li>'.'<span class="champ">Par :</span> '.
650
			'<li>'.'<span class="champ">Par :</span> '.
651
				(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
651
				(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
652
			'</li>'.
652
			'</li>'.
653
			'<li>'.'<span class="champ">Nom du fichier :</span> '.$this->nePasInterpreterXml($nom_fichier).'</li>'.
653
			'<li>'.'<span class="champ">Nom du fichier :</span> '.$this->nePasInterpreterXml($nom_fichier).'</li>'.
654
			'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'.
654
			'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'.
655
			'<li>'.'<span class="champ">Commentaires :</span> '.$this->nePasInterpreterXml($commentaire_img).'</li>'.
655
			'<li>'.'<span class="champ">Commentaires :</span> '.$this->nePasInterpreterXml($commentaire_img).'</li>'.
656
			'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_image).'</li>'.
656
			'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_image).'</li>'.
657
			'</ul>'.
657
			'</ul>'.
658
			'</div>';
658
			'</div>';
659
			// TODO : ajouter le champ commentaire EXIF.
659
			// TODO : ajouter le champ commentaire EXIF.
660
		if (! $this->etreNull($id_obs)) {
660
		if (! $this->etreNull($id_obs)) {
661
			$description .=
661
			$description .=
662
				'<div class="gauche">'.
662
				'<div class="gauche">'.
663
				'<h3>'.'Observation'.'</h3>'.
663
				'<h3>'.'Observation'.'</h3>'.
664
				'<ul>'.
664
				'<ul>'.
665
				'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'.
665
				'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'.
666
				'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'.
666
				'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'.
667
				'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'.
667
				'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'.
668
				'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'.
668
				'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'.
669
				'<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'.
669
				'<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'.
670
				'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'.
670
				'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'.
671
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : '').
671
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : '').
672
				'<li>'.'<span class="champ">Commentaire :</span> '.$this->nePasInterpreterXml($commentaire_obs).'</li>'.
672
				'<li>'.'<span class="champ">Commentaire :</span> '.$this->nePasInterpreterXml($commentaire_obs).'</li>'.
673
				'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'.
673
				'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'.
674
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : '').
674
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : '').
675
				'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'.
675
				'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'.
676
				'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'.
676
				'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'.
677
				'</ul>'.
677
				'</ul>'.
678
				'</div>';
678
				'</div>';
679
		}
679
		}
680
		$description = $this->nettoyerTexte($description);
680
		$description = $this->nettoyerTexte($description);
681
		return $description;
681
		return $description;
682
	}
682
	}
683
 
683
 
684
	private function getServiceParMotsCles() {
684
	private function getServiceParMotsCles() {
685
		$infos=array();
685
		$infos=array();
686
		$infos[0]['nom_sel_nn'] = '';
686
		$infos[0]['nom_sel_nn'] = '';
687
		$infos[0]['date_creation'] = '2011-06-28';
687
		$infos[0]['date_creation'] = '2011-06-28';
688
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
688
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
689
		$donnees['items'][0]['guid'] = 0;
689
		$donnees['items'][0]['guid'] = 0;
690
		$donnees['items'][0]['description'] =  'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
690
		$donnees['items'][0]['description'] =  'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
691
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag=';
691
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag=';
692
		if (isset($this->parametres[0])) {
692
		if (isset($this->parametres[0])) {
693
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
693
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
694
		} else {
694
		} else {
695
			$donnees['items'][0]['description'] .= '</b>';
695
			$donnees['items'][0]['description'] .= '</b>';
696
		}
696
		}
697
		$donnees['items'][0]['titre'] = '';
697
		$donnees['items'][0]['titre'] = '';
698
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
698
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
699
		return $contenu;
699
		return $contenu;
700
	}
700
	}
701
 
701
 
702
	private function getServiceParCommune() {
702
	private function getServiceParCommune() {
703
		$infos=array();
703
		$infos=array();
704
		$infos[0]['nom_sel_nn'] = '';
704
		$infos[0]['nom_sel_nn'] = '';
705
		$infos[0]['date_creation'] = '2011-06-28';
705
		$infos[0]['date_creation'] = '2011-06-28';
706
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
706
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
707
		$donnees['items'][0]['guid'] = 0;
707
		$donnees['items'][0]['guid'] = 0;
708
		$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
708
		$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
709
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune=';
709
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune=';
710
		if (isset($this->parametres[0])) {
710
		if (isset($this->parametres[0])) {
711
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
711
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
712
		} else {
712
		} else {
713
			$donnees['items'][0]['description'] .= '</b>';
713
			$donnees['items'][0]['description'] .= '</b>';
714
		}
714
		}
715
		$donnees['items'][0]['titre'] = '';
715
		$donnees['items'][0]['titre'] = '';
716
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
716
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
717
		return $contenu;
717
		return $contenu;
718
	}
718
	}
719
 
719
 
720
	private function getIntituleAuteur($courriel) {
720
	private function getIntituleAuteur($courriel) {
721
		$courriel = strtolower($courriel);
721
		$courriel = strtolower($courriel);
722
		$intitule = $this->auteurs[$courriel];
722
		$intitule = $this->auteurs[$courriel];
723
		return $intitule;
723
		return $intitule;
724
	}
724
	}
725
}
725
}