Subversion Repositories eFlore/Applications.cel

Rev

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

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