Subversion Repositories eFlore/Applications.cel

Rev

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

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