Subversion Repositories eFlore/Applications.cel

Rev

Rev 2397 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2397 Rev 2399
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 = Cel::db()->query($requete)->fetchAll(PDO::FETCH_ASSOC);
208
			$infos = Cel::db()->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
			$msgTpl = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s';
213
			$msgTpl = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s';
214
			$this->messages[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage());
214
			$this->messages[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage());
215
		}
215
		}
216
		return $infos;
216
		return $infos;
217
	}
217
	}
218
 
218
 
219
	private function executerService($elements) {
219
	private function executerService($elements) {
220
		// Prétraitement des données
220
		// Prétraitement des données
221
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
221
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
222
		foreach ($elements as $element) {
222
		foreach ($elements as $element) {
223
			$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur'];
223
			$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur'];
224
		}
224
		}
225
		$this->auteurs = $this->creerAuteurs($identifiants);
225
		$this->auteurs = $this->creerAuteurs($identifiants);
226
 
226
 
227
		foreach ($elements as $element) {
227
		foreach ($elements as $element) {
228
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
228
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
229
		}
229
		}
230
 
230
 
231
		// Création du contenu à partir d'un template PHP
231
		// Création du contenu à partir d'un template PHP
232
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
232
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
233
 
233
 
234
		return $contenu;
234
		return $contenu;
235
	}
235
	}
236
 
236
 
237
	private function construireDonneesCommunesAuFlux($infos) {
237
	private function construireDonneesCommunesAuFlux($infos) {
238
		$donnees = $this->getFlux($this->service);
238
		$donnees = $this->getFlux($this->service);
239
		$donnees['guid'] = $this->getUrlServiceBase();
239
		$donnees['guid'] = $this->getUrlServiceBase();
240
		$donnees['lien_service'] = $this->creerUrlService();
240
		$donnees['lien_service'] = $this->creerUrlService();
241
		$donnees['lien_cel'] = (isset($infos['nom_sel_nn']) && $infos['nom_sel_nn'] != '' && $infos['nom_sel_nn'] != 0) ?
241
		$donnees['lien_cel'] = (isset($infos['nom_sel_nn']) && $infos['nom_sel_nn'] != '' && $infos['nom_sel_nn'] != 0) ?
242
			$this->getUrlEflore($infos['nom_referentiel'], $infos['nom_sel_nn']) : '';
242
			$this->getUrlEflore($infos['nom_referentiel'], $infos['nom_sel_nn']) : '';
243
		$donnees['editeur'] = $this->config['settings']['editeur'];
243
		$donnees['editeur'] = $this->config['settings']['editeur'];
244
		$derniere_info_en_date = reset($infos);
244
		$derniere_info_en_date = reset($infos);
245
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_creation']);
245
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_creation']);
246
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
246
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
247
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
247
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
248
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
248
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
249
		$donnees['annee_courante'] = date('Y');
249
		$donnees['annee_courante'] = date('Y');
250
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage';
250
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage';
251
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
251
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
252
		return $donnees;
252
		return $donnees;
253
	}
253
	}
254
 
254
 
255
	private function construireDonneesCommunesAuxItems($info) {
255
	private function construireDonneesCommunesAuxItems($info) {
256
		$item = array();
256
		$item = array();
257
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date_creation']);
257
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date_creation']);
258
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
258
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
259
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
259
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
260
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
260
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
261
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
261
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
262
		$item['titre'] = $this->creerTitre($info);
262
		$item['titre'] = $this->creerTitre($info);
263
		$item['guid'] = $this->creerGuidItem($info);
263
		$item['guid'] = $this->creerGuidItem($info);
264
		$item['lien'] = $this->creerLienItem($info);
264
		$item['lien'] = $this->creerLienItem($info);
265
		$item['categorie'] = $this->creerCategorie($item);
265
		$item['categorie'] = $this->creerCategorie($item);
266
		$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($info), $item);
266
		$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($info), $item);
267
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
267
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
268
		$item['modifier_par'] = $this->nettoyerTexte($this->getIntituleAuteur($info['courriel_utilisateur']));
268
		$item['modifier_par'] = $this->nettoyerTexte($this->getIntituleAuteur($info['courriel_utilisateur']));
269
		return $item;
269
		return $item;
270
	}
270
	}
271
 
271
 
272
	private function creerGuidItem($element) {
272
	private function creerGuidItem($element) {
273
		$guid = $this->getUrlImage($element['id_image']);
273
		$guid = $this->getUrlImage($element['id_image']);
274
		return $guid;
274
		return $guid;
275
	}
275
	}
276
 
276
 
277
	private function creerTitre($element) {
277
	private function creerTitre($element) {
278
		$methode = 'creerTitre'.$this->service;
278
		$methode = 'creerTitre'.$this->service;
279
		$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple';
279
		$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple';
280
		$titre = $this->$methode($element);
280
		$titre = $this->$methode($element);
281
		$titre = $this->nettoyerTexte($titre);
281
		$titre = $this->nettoyerTexte($titre);
282
		return $titre;
282
		return $titre;
283
	}
283
	}
284
 
284
 
285
	private function creerDescription($donnees, $item) {
285
	private function creerDescription($donnees, $item) {
286
		$methode = 'creerDescription'.$this->service;
286
		$methode = 'creerDescription'.$this->service;
287
		$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet';
287
		$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet';
288
		$description = $this->$methode($donnees, $item);
288
		$description = $this->$methode($donnees, $item);
289
		$description = $this->nettoyerTexte($description);
289
		$description = $this->nettoyerTexte($description);
290
		return $description;
290
		return $description;
291
	}
291
	}
292
 
292
 
293
	private function creerLienItem($element) {
293
	private function creerLienItem($element) {
294
 
294
 
295
		if ($this->etreNull($element['id_observation'])) {
295
		if ($this->etreNull($element['id_observation'])) {
296
			// Lien vers image grand format
296
			// Lien vers image grand format
297
			$lien = $this->getUrlImage($element['id_image'], $this->format_image);
297
			$lien = $this->getUrlImage($element['id_image'], $this->format_image);
298
		} else {
298
		} else {
299
			// Lien vers fiche eFlore onglet Illustration
299
			// Lien vers fiche eFlore onglet Illustration
300
			$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
300
			$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
301
		}
301
		}
302
		return $lien;
302
		return $lien;
303
	}
303
	}
304
 
304
 
305
	private function getServiceListeDesFlux() {
305
	private function getServiceListeDesFlux() {
306
		return $this->flux;
306
		return $this->flux;
307
	}
307
	}
308
 
308
 
309
	private function getServiceOpml() {
309
	private function getServiceOpml() {
310
		$donnees = array();
310
		$donnees = array();
311
		$id = 1;
311
		$id = 1;
312
		foreach ($this->flux as $flux_nom => $flux){
312
		foreach ($this->flux as $flux_nom => $flux){
313
			$info = array();
313
			$info = array();
314
			$info['type'] = 'atom';
314
			$info['type'] = 'atom';
315
			$info['titre'] = $flux['titre'];
315
			$info['titre'] = $flux['titre'];
316
			$info['texte'] = "CEL - Images - $flux_nom";
316
			$info['texte'] = "CEL - Images - $flux_nom";
317
			$info['description'] = $flux['description'];
317
			$info['description'] = $flux['description'];
318
			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
318
			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
319
			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
319
			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
320
			$donnees['liste_flux'][] = $info;
320
			$donnees['liste_flux'][] = $info;
321
		}
321
		}
322
 
322
 
323
		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
323
		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
324
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
324
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
325
		return $contenu;
325
		return $contenu;
326
	}
326
	}
327
 
327
 
328
	private function getServiceSimple() {
328
	private function getServiceSimple() {
329
		if (isset($this->parametres[0])) {
329
		if (isset($this->parametres[0])) {
330
			$this->format_image = $this->parametres[0];
330
			$this->format_image = $this->parametres[0];
331
		}
331
		}
332
 
332
 
333
		// Construction de la requête
333
		// Construction de la requête
334
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ci.*, '.
334
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ci.*, '.
335
			' cim.id_image, cim.ce_utilisateur, nom_original, cim.date_creation, cim.mots_cles_texte as mots_cles_texte_images,
335
			' cim.id_image, cim.ce_utilisateur, nom_original, cim.date_creation, cim.mots_cles_texte as mots_cles_texte_images,
336
				 ci.mots_cles_texte as mots_cles_texte_images_obs, cim.commentaire, note_qualite, nom_referentiel  '.
336
				 ci.mots_cles_texte as mots_cles_texte_images_obs, cim.commentaire, note_qualite, nom_referentiel  '.
337
			'FROM cel_obs_images AS coi '.
337
			'FROM cel_obs_images AS coi '.
338
			'LEFT JOIN cel_obs AS ci '.
338
			'LEFT JOIN cel_obs AS ci '.
339
				'ON (coi.id_observation = ci.id_observation) '.
339
				'ON (coi.id_observation = ci.id_observation) '.
340
			'LEFT JOIN cel_images AS cim '.
340
			'LEFT JOIN cel_images AS cim '.
341
				'ON (coi.id_image = cim.id_image) '.
341
				'ON (coi.id_image = cim.id_image) '.
342
			'WHERE ci.transmission = 1 '.
342
			'WHERE ci.transmission = 1 '.
343
			'	AND ci.ce_utilisateur = cim.ce_utilisateur '.
343
			'	AND ci.ce_utilisateur = cim.ce_utilisateur '.
344
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'cim.date_creation DESC').' '.
344
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'cim.date_creation DESC').' '.
345
			"LIMIT $this->start, $this->limit ";
345
			"LIMIT $this->start, $this->limit ";
346
 
346
 
347
		$elements = $this->executerRequete($requete);
347
		$elements = $this->executerRequete($requete);
348
 
348
 
349
		// Création du contenu
349
		// Création du contenu
350
		$contenu = $this->executerService($elements);
350
		$contenu = $this->executerService($elements);
351
		return $contenu;
351
		return $contenu;
352
	}
352
	}
353
 
353
 
354
	private function creerTitreSimple($element) {
354
	private function creerTitreSimple($element) {
355
		$date = $element['date_observation'];
355
		$date = $element['date_observation'];
356
		$date = date("d/m/Y", strtotime($date));
356
		$date = date("d/m/Y", strtotime($date));
357
		if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['nom_sel_nn'])) {
357
		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;;
358
			$titre = "Ajout d'une photo par ".$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;;
359
		} else {
359
		} else {
360
			$titre = $element['nom_sel'].' [nn'.$element['nom_sel_nn'].'] par '.$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;;
360
			$titre = $element['nom_sel'].' [nn'.$element['nom_sel_nn'].'] par '.$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;;
361
		}
361
		}
362
		return $titre;
362
		return $titre;
363
	}
363
	}
364
 
364
 
365
	private function creerDescriptionSimple($donnees, $item) {
365
	private function creerDescriptionSimple($donnees, $item) {
366
		$description = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
366
		$description = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
367
		return $description;
367
		return $description;
368
	}
368
	}
369
 
369
 
370
	private function getServiceComplet() {
370
	private function getServiceComplet() {
371
 
371
 
372
		// Construction de la requête
372
		// Construction de la requête
373
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ci.*, '.
373
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ci.*, '.
374
			'	cim.id_image, ci.ce_utilisateur, nom_original, cim.date_creation, cim.mots_cles_texte as mots_cles_texte_images, '.
374
			'	cim.id_image, ci.ce_utilisateur, nom_original, cim.date_creation, cim.mots_cles_texte as mots_cles_texte_images, '.
375
			'   ci.mots_cles_texte as mots_cles_texte_obs, cim.commentaire as commentaire_img, note_qualite, nom_referentiel, '.
375
			'   ci.mots_cles_texte as mots_cles_texte_obs, cim.commentaire as commentaire_img, note_qualite, nom_referentiel, '.
376
			'	ci.commentaire as commentaire_obs '.
376
			'	ci.commentaire as commentaire_obs '.
377
			'FROM cel_images AS cim '.
377
			'FROM cel_images AS cim '.
378
			'	LEFT JOIN cel_obs_images AS coi '.
378
			'	LEFT JOIN cel_obs_images AS coi '.
379
			'		ON (coi.id_image = cim.id_image) '.
379
			'		ON (coi.id_image = cim.id_image) '.
380
			'	LEFT JOIN cel_obs AS ci '.
380
			'	LEFT JOIN cel_obs AS ci '.
381
			'		ON (coi.id_observation = ci.id_observation) '.
381
			'		ON (coi.id_observation = ci.id_observation) '.
382
			(($this->etreFluxAdmin()) ? '' : 'WHERE ci.transmission = 1 ').
382
			(($this->etreFluxAdmin()) ? '' : 'WHERE ci.transmission = 1 ').
383
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'cim.date_creation DESC').' '.
383
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'cim.date_creation DESC').' '.
384
			"LIMIT $this->start, $this->limit ";
384
			"LIMIT $this->start, $this->limit ";
385
		//echo $requete;
385
		//echo $requete;
386
		$elements = $this->executerRequete($requete);
386
		$elements = $this->executerRequete($requete);
387
 
387
 
388
		// Création du contenu
388
		// Création du contenu
389
		if ($elements != false && count($elements) > 0) {
389
		if ($elements != false && count($elements) > 0) {
390
			$contenu = $this->executerService($elements);
390
			$contenu = $this->executerService($elements);
391
		} else {
391
		} else {
392
			$this->messages[] = "Aucune image disponible.";
392
			$this->messages[] = "Aucune image disponible.";
393
			$contenu = array();
393
			$contenu = array();
394
		}
394
		}
395
 
395
 
396
		return $contenu;
396
		return $contenu;
397
	}
397
	}
398
 
398
 
399
	private function getServiceMultiCriteres() {
399
	private function getServiceMultiCriteres() {
400
		$contenu = '';
400
		$contenu = '';
401
		if (isset($_GET['debut'])) $this->start = $_GET['debut'];
401
		if (isset($_GET['debut'])) $this->start = $_GET['debut'];
402
		if (isset($_GET['limite'])) $this->limit = $_GET['limite'];
402
		if (isset($_GET['limite'])) $this->limit = $_GET['limite'];
403
 
403
 
404
		$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
404
		$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
405
 
405
 
406
		if ($this->parametresSontDemandes()) {
406
		if ($this->parametresSontDemandes()) {
407
			$requete = $this->creerRequeteAvecParametres();
407
			$requete = $this->creerRequeteAvecParametres();
408
		} else {
408
		} else {
409
			$requete = $this->creerRequeteSansParametres();
409
			$requete = $this->creerRequeteSansParametres();
410
		}
410
		}
411
		$elements = $this->executerRequete($requete);
411
		$elements = $this->executerRequete($requete);
412
 
412
 
413
		// Création du contenu
413
		// Création du contenu
414
		if ($elements != false && count($elements) > 0) {
414
		if ($elements != false && count($elements) > 0) {
415
			$contenu = $this->executerService($elements);
415
			$contenu = $this->executerService($elements);
416
		} else {
416
		} else {
417
			$this->messages[] = "Aucune image disponible.";
417
			$this->messages[] = "Aucune image disponible.";
418
		}
418
		}
419
 
419
 
420
        return $contenu;
420
        return $contenu;
421
	}
421
	}
422
 
422
 
423
	private function parametresSontDemandes() {
423
	private function parametresSontDemandes() {
424
		$criteres = $this->traiterCriteresMultiples($_GET) ;
424
		$criteres = $this->traiterCriteresMultiples($_GET) ;
425
		return (isset($_GET['recherche']) && $_GET['recherche'] != '') || !empty($criteres);
425
		return (isset($_GET['recherche']) && $_GET['recherche'] != '') || !empty($criteres);
426
	}
426
	}
427
 
427
 
428
	private function creerRequeteSansParametres() {
428
	private function creerRequeteSansParametres() {
429
		// Première sous requete pour que le limite se fasse d'abord sur les images
429
		// Première sous requete pour que le limite se fasse d'abord sur les images
430
		// et pas la jointure de toutes les tables
430
		// et pas la jointure de toutes les tables
431
		$sous_requete = 'SELECT * '.
431
		$sous_requete = 'SELECT * '.
432
			'FROM cel_images c '.
432
			'FROM cel_images c '.
433
			'WHERE id_image '.
433
			'WHERE id_image '.
434
			' IN (SELECT id_image FROM cel_obs_images a '.
434
			' IN (SELECT id_image FROM cel_obs_images a '.
435
			(($this->etreFluxAdmin()) ? '' : 'INNER JOIN cel_obs b ON b.id_observation = a.id_observation AND b.transmission = 1 ').
435
			(($this->etreFluxAdmin()) ? '' : 'INNER JOIN cel_obs b ON b.id_observation = a.id_observation AND b.transmission = 1 ').
436
			') ';
436
			') ';
437
		$sous_requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'c.date_creation DESC').' '.
437
		$sous_requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'c.date_creation DESC').' '.
438
			"LIMIT $this->start,$this->limit ";
438
			"LIMIT $this->start,$this->limit ";
439
 
439
 
440
		// Construction de la requête
440
		// Construction de la requête
441
		$requete = 'SELECT *, b.mots_cles_texte as mots_cles_texte_obs, c.mots_cles_texte as mots_cles_texte_images, '.
441
		$requete = 'SELECT *, b.mots_cles_texte as mots_cles_texte_obs, c.mots_cles_texte as mots_cles_texte_images, '.
442
			' b.commentaire as commentaire_obs, c.commentaire as commentaire_img, nom_referentiel '.
442
			' b.commentaire as commentaire_obs, c.commentaire as commentaire_img, nom_referentiel '.
443
			'FROM ('.$sous_requete.') as c '.
443
			'FROM ('.$sous_requete.') as c '.
444
			'	INNER JOIN cel_obs_images AS a '.
444
			'	INNER JOIN cel_obs_images AS a '.
445
			'		ON (a.id_image = c.id_image) '.
445
			'		ON (a.id_image = c.id_image) '.
446
			'	INNER JOIN cel_obs AS b '.
446
			'	INNER JOIN cel_obs AS b '.
447
			'		ON (a.id_observation = b.id_observation) AND b.ce_utilisateur = c.ce_utilisateur ';
447
			'		ON (a.id_observation = b.id_observation) AND b.ce_utilisateur = c.ce_utilisateur ';
448
		//echo $requete;
448
		//echo $requete;
449
		return $requete;
449
		return $requete;
450
	}
450
	}
451
 
451
 
452
	private function creerRequeteAvecParametres() {
452
	private function creerRequeteAvecParametres() {
453
		// Construction de la requête
453
		// 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, '.
454
		$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 '.
455
		    ' b.commentaire as commentaire_obs, c.commentaire as commentaire_img, nom_referentiel '.
456
			'FROM cel_obs_images AS a '.
456
			'FROM cel_obs_images AS a '.
457
			'	INNER JOIN cel_obs AS b '.
457
			'	INNER JOIN cel_obs AS b '.
458
			'		ON (a.id_observation = b.id_observation) '.
458
			'		ON (a.id_observation = b.id_observation) '.
459
			'	INNER JOIN cel_images AS c '.
459
			'	INNER JOIN cel_images AS c '.
460
			'		ON (a.id_image = c.id_image) '.
460
			'		ON (a.id_image = c.id_image) '.
461
			'WHERE b.ce_utilisateur = c.ce_utilisateur '.
461
			'WHERE b.ce_utilisateur = c.ce_utilisateur '.
462
			(($this->etreFluxAdmin()) ? '' : 'AND b.transmission = 1 ').
462
			(($this->etreFluxAdmin()) ? '' : 'AND b.transmission = 1 ').
463
			'	AND ';
463
			'	AND ';
464
 
464
 
465
		if ($this->estUneRechercheGenerale()) {
465
		if ($this->estUneRechercheGenerale()) {
466
			$chaine_requete = $_GET['recherche'];
466
			$chaine_requete = $_GET['recherche'];
467
			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
467
			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
468
		} else {
468
		} else {
469
			$criteres = $this->traiterCriteresMultiples($_GET) ;
469
			$criteres = $this->traiterCriteresMultiples($_GET) ;
470
			if (!empty($criteres)) {
470
			if (!empty($criteres)) {
471
				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
471
				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
472
			}
472
			}
473
		}
473
		}
474
		$requete = str_replace(' AND ) ',' ', $requete);
474
		$requete = str_replace(' AND ) ',' ', $requete);
475
		$requete = rtrim($requete, 'AND ');
475
		$requete = rtrim($requete, 'AND ');
476
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
476
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
477
			'c.date_creation DESC').' '."LIMIT $this->start,$this->limit ";
477
			'c.date_creation DESC').' '."LIMIT $this->start,$this->limit ";
478
		//echo $requete;
478
		//echo $requete;
479
		return $requete;
479
		return $requete;
480
	}
480
	}
481
 
481
 
482
	private function creerSousRequeteRechercheParCriteres($criteres) {
482
	private function creerSousRequeteRechercheParCriteres($criteres) {
483
		$requete = '';
483
		$requete = '';
484
		foreach ($criteres as $pair) {
484
		foreach ($criteres as $pair) {
485
			$nom_valeur = explode("=",$pair);
485
			$nom_valeur = explode("=",$pair);
486
			if (sizeof($nom_valeur) != 0) {
486
			if (sizeof($nom_valeur) != 0) {
487
				switch ($nom_valeur[0]) {
487
				switch ($nom_valeur[0]) {
488
					case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
488
					case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
489
					case "c.ci_numero_page" : $this->limit*Cel::db()->quote($nom_valeur[1]); break;
489
					case "c.ci_numero_page" : $this->limit*Cel::db()->quote($nom_valeur[1]); break;
490
					case "c.commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
490
					case "c.commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
491
						foreach($mots_comment_liste as $mot_comment) {
491
						foreach($mots_comment_liste as $mot_comment) {
492
							$mot_comment = trim($mot_comment) ;
492
							$mot_comment = trim($mot_comment) ;
493
							$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
493
							$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
494
						}
494
						}
495
						break;
495
						break;
496
					case "c.date_prise_de_vue" :
496
					case "c.date_prise_de_vue" :
497
						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
497
						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
498
						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
498
						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
499
							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
499
							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
500
						}
500
						}
501
						$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote($nom_valeur[1]."%").' AND '; break;
501
						$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote($nom_valeur[1]."%").' AND '; break;
502
					case "b.ce_zone_geo" :
502
					case "b.ce_zone_geo" :
503
						$requete .= ' ('.$nom_valeur[0].' LIKE "%INSEE-C:'.$nom_valeur[1].'%") AND '; break;
503
						$requete .= ' ('.$nom_valeur[0].' LIKE "%INSEE-C:'.$nom_valeur[1].'%") AND '; break;
504
					case "b.nom_ret" :
504
					case "b.nom_ret" :
505
						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
505
						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
506
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'.
506
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'.
507
							$nom_valeur[1].'%") AND '; break;
507
							$nom_valeur[1].'%") AND '; break;
508
					case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
508
					case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
509
					case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]).' AND '; break;
509
					case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]).' AND '; break;
510
					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
510
					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
511
				}
511
				}
512
			}
512
			}
513
		}
513
		}
514
		$requete = rtrim($requete,' AND ');
514
		$requete = rtrim($requete,' AND ');
515
		return $requete;
515
		return $requete;
516
	}
516
	}
517
 
517
 
518
	private function creerSousRequeteMotsCles($mot_cle) {
518
	private function creerSousRequeteMotsCles($mot_cle) {
519
	$requete = '';
519
	$requete = '';
520
		if (preg_match('/.*OU.*/', $mot_cle)) {
520
		if (preg_match('/.*OU.*/', $mot_cle)) {
521
			$mots_cles_tab = explode('OU',$mot_cle);
521
			$mots_cles_tab = explode('OU',$mot_cle);
522
			foreach($mots_cles_tab as $mot_cle_item) {
522
			foreach($mots_cles_tab as $mot_cle_item) {
523
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
523
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
524
			}
524
			}
525
			$requete = '('.rtrim($requete,'OR ').')';
525
			$requete = '('.rtrim($requete,'OR ').')';
526
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
526
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
527
			$mots_cles_tab = explode('ET',$mot_cle);
527
			$mots_cles_tab = explode('ET',$mot_cle);
528
			foreach($mots_cles_tab as $mot_cle_item) {
528
			foreach($mots_cles_tab as $mot_cle_item) {
529
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
529
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
530
			}
530
			}
531
			$requete = '('.rtrim($requete, 'AND ').') ';
531
			$requete = '('.rtrim($requete, 'AND ').') ';
532
		} else {
532
		} else {
533
			$requete = "(c.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
533
			$requete = "(c.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
534
		}
534
		}
535
		return $requete;
535
		return $requete;
536
	}
536
	}
537
 
537
 
538
	private function creerSousRequeteProjet($mot_cle) {
538
	private function creerSousRequeteProjet($mot_cle) {
539
		$requete = '';
539
		$requete = '';
540
		if (preg_match('/.*OU.*/', $mot_cle)) {
540
		if (preg_match('/.*OU.*/', $mot_cle)) {
541
			$mots_cles_tab = explode('OU',$mot_cle);
541
			$mots_cles_tab = explode('OU',$mot_cle);
542
			foreach($mots_cles_tab as $mot_cle_item) {
542
			foreach($mots_cles_tab as $mot_cle_item) {
543
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
543
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
544
			}
544
			}
545
			$requete = '('.rtrim($requete,'OR ').')';
545
			$requete = '('.rtrim($requete,'OR ').')';
546
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
546
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
547
			$mots_cles_tab = explode('ET',$mot_cle);
547
			$mots_cles_tab = explode('ET',$mot_cle);
548
			foreach($mots_cles_tab as $mot_cle_item) {
548
			foreach($mots_cles_tab as $mot_cle_item) {
549
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
549
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
550
			}
550
			}
551
			$requete = '('.rtrim($requete, 'AND ').') ';
551
			$requete = '('.rtrim($requete, 'AND ').') ';
552
		} else {
552
		} else {
553
			$requete = "(b.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
553
			$requete = "(b.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
554
		}
554
		}
555
		return $requete;
555
		return $requete;
556
	}
556
	}
557
 
557
 
558
	private function creerSousRequeteRechercheGenerale($chaine_requete) {
558
	private function creerSousRequeteRechercheGenerale($chaine_requete) {
559
		$requete = '';
559
		$requete = '';
560
		if (trim($chaine_requete) != '') {
560
		if (trim($chaine_requete) != '') {
561
			$chaine_requete = strtolower($chaine_requete);
561
			$chaine_requete = strtolower($chaine_requete);
562
			$chaine_requete = str_replace(' ', '_', $chaine_requete);
562
			$chaine_requete = str_replace(' ', '_', $chaine_requete);
563
			$requete = ' ('.
563
			$requete = ' ('.
564
				'b.nom_ret LIKE "'.$chaine_requete.'%"'.
564
				'b.nom_ret LIKE "'.$chaine_requete.'%"'.
565
				' OR '.
565
				' OR '.
566
				'b.nom_sel LIKE "'.$chaine_requete.'%"'.
566
				'b.nom_sel LIKE "'.$chaine_requete.'%"'.
567
				' OR '.
567
				' OR '.
568
				'b.zone_geo LIKE "'.$chaine_requete.'%" '.
568
				'b.zone_geo LIKE "'.$chaine_requete.'%" '.
569
				' OR '.
569
				' OR '.
570
				'b.ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '.
570
				'b.ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '.
571
				' OR '.
571
				' OR '.
572
				'b.ce_zone_geo LIKE "'.$chaine_requete.'%" '.
572
				'b.ce_zone_geo LIKE "'.$chaine_requete.'%" '.
573
				' OR '.
573
				' OR '.
574
				'c.ce_utilisateur LIKE "'.$chaine_requete.'%" '.
574
				'c.ce_utilisateur LIKE "'.$chaine_requete.'%" '.
575
				' OR '.
575
				' OR '.
576
				'c.courriel_utilisateur LIKE "'.$chaine_requete.'%" '.
576
				'c.courriel_utilisateur LIKE "'.$chaine_requete.'%" '.
577
				' OR '.
577
				' OR '.
578
				'b.mots_cles_texte LIKE "'.$chaine_requete.'%" '.
578
				'b.mots_cles_texte LIKE "'.$chaine_requete.'%" '.
579
				' OR '.
579
				' OR '.
580
				'c.mots_cles_texte LIKE "'.$chaine_requete.'%" '.
580
				'c.mots_cles_texte LIKE "'.$chaine_requete.'%" '.
581
				') ';
581
				') ';
582
		}
582
		}
583
		return $requete;
583
		return $requete;
584
	}
584
	}
585
 
585
 
586
	private function estUneRechercheGenerale() {
586
	private function estUneRechercheGenerale() {
587
		return isset($_GET['recherche']);
587
		return isset($_GET['recherche']);
588
	}
588
	}
589
 
589
 
590
	private function traiterCriteresMultiples($tableau_criteres) {
590
	private function traiterCriteresMultiples($tableau_criteres) {
591
		$tableau_criteres_pour_bdd = array();
591
		$tableau_criteres_pour_bdd = array();
592
 
592
 
593
		foreach($tableau_criteres as $nom_critere => $valeur_critere) {
593
		foreach($tableau_criteres as $nom_critere => $valeur_critere) {
594
			if (isset($this->criteres[$nom_critere])) {
594
			if (isset($this->criteres[$nom_critere])) {
595
				$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
595
				$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
596
			}
596
			}
597
		}
597
		}
598
		return $tableau_criteres_pour_bdd;
598
		return $tableau_criteres_pour_bdd;
599
	}
599
	}
600
 
600
 
601
	private function creerDescriptionComplet($donnees, $item) {
601
	private function creerDescriptionComplet($donnees, $item) {
602
		$auteur = $this->getIntituleAuteur($donnees['courriel_utilisateur']);
602
		$auteur = $this->getIntituleAuteur($donnees['courriel_utilisateur']);
603
		$auteur_mail = $donnees['courriel_utilisateur'];
603
		$auteur_mail = $donnees['courriel_utilisateur'];
604
 
604
 
605
		$id_img = $donnees['id_image'];
605
		$id_img = $donnees['id_image'];
606
		$nom_fichier = $donnees['nom_original'];
606
		$nom_fichier = $donnees['nom_original'];
607
		$url_img = $this->getUrlImage($donnees['id_image'], 'CS');
607
		$url_img = $this->getUrlImage($donnees['id_image'], 'CS');
608
		$url_img_normale = $this->getUrlImage($donnees['id_image'], 'XL');
608
		$url_img_normale = $this->getUrlImage($donnees['id_image'], 'XL');
609
		//
609
		//
610
		$mots_cles_image = $donnees['mots_cles_texte_images'];
610
		$mots_cles_image = $donnees['mots_cles_texte_images'];
611
		$note = ($donnees['note_qualite'] +1).'/5';
611
		$note = ($donnees['note_qualite'] +1).'/5';
612
		$commentaire_img = $donnees['commentaire_img'];
612
		$commentaire_img = $donnees['commentaire_img'];
613
 
613
 
614
		$id_obs = $donnees['id_observation'];
614
		$id_obs = $donnees['id_observation'];
615
		$famille = $donnees['famille'];
615
		$famille = $donnees['famille'];
616
		$nom_saisi = $donnees['nom_sel'];
616
		$nom_saisi = $donnees['nom_sel'];
617
		$nom_retenu = $donnees['nom_ret'];
617
		$nom_retenu = $donnees['nom_ret'];
618
		//
618
		//
619
		$mots_cles_obs = $donnees['mots_cles_texte_obs'];
619
		$mots_cles_obs = $donnees['mots_cles_texte_obs'];
620
		$lieu =  $donnees['zone_geo'].' ('.$this->convertirCodeZoneGeoVersCodeInsee($donnees['ce_zone_geo']).') > '.$donnees['lieudit'].' > '.$donnees['station'];
620
		$lieu =  $donnees['zone_geo'].' ('.$this->convertirCodeZoneGeoVersCodeInsee($donnees['ce_zone_geo']).') > '.$donnees['lieudit'].' > '.$donnees['station'];
621
		$milieu = $donnees['milieu'];
621
		$milieu = $donnees['milieu'];
622
		$coordonnees = ($this->etreNull($donnees['latitude']) && $this->etreNull($donnees['longitude'])) ? '' : $donnees['latitude'].'/'.$donnees['longitude'];
622
		$coordonnees = ($this->etreNull($donnees['latitude']) && $this->etreNull($donnees['longitude'])) ? '' : $donnees['latitude'].'/'.$donnees['longitude'];
623
		$commentaire_obs = $donnees['commentaire_obs'];
623
		$commentaire_obs = $donnees['commentaire_obs'];
624
		$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y');
624
		$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y');
625
		$date_transmission = $this->formaterDate($donnees['date_transmission']);
625
		$date_transmission = $this->formaterDate($donnees['date_transmission']);
626
		$date_modification = $this->formaterDate($donnees['date_modification']);
626
		$date_modification = $this->formaterDate($donnees['date_modification']);
627
		$date_creation = $this->formaterDate($donnees['date_creation']);
627
		$date_creation = $this->formaterDate($donnees['date_creation']);
628
		$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
628
		$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
629
 
629
 
630
		$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
630
		$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
631
			'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'.
631
			'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'.
632
			'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'.
632
			'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'.
633
			'<div class="gauche">'.
633
			'<div class="gauche">'.
634
			'<h3>'.'Image'.'</h3>'.
634
			'<h3>'.'Image'.'</h3>'.
635
			'<ul>'.
635
			'<ul>'.
636
			'<li>'.'<span class="champ">URL :</span> <a href="'.$url_img_normale.'" onclick="javascript:window.open(this.href);return false;">'.$url_img_normale.'</a></li>'.
636
			'<li>'.'<span class="champ">URL :</span> <a href="'.$url_img_normale.'" onclick="javascript:window.open(this.href);return false;">'.$url_img_normale.'</a></li>'.
637
			'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'.
637
			'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'.
638
			'<li>'.'<span class="champ">Par :</span> '.
638
			'<li>'.'<span class="champ">Par :</span> '.
639
				(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
639
				(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
640
			'</li>'.
640
			'</li>'.
641
			'<li>'.'<span class="champ">Nom du fichier :</span> '.$this->nePasInterpreterXml($nom_fichier).'</li>'.
641
			'<li>'.'<span class="champ">Nom du fichier :</span> '.$this->nePasInterpreterXml($nom_fichier).'</li>'.
642
			'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'.
642
			'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'.
643
			'<li>'.'<span class="champ">Commentaires :</span> '.$this->nePasInterpreterXml($commentaire_img).'</li>'.
643
			'<li>'.'<span class="champ">Commentaires :</span> '.$this->nePasInterpreterXml($commentaire_img).'</li>'.
644
			'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_image).'</li>'.
644
			'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_image).'</li>'.
645
			'</ul>'.
645
			'</ul>'.
646
			'</div>';
646
			'</div>';
647
			// TODO : ajouter le champ commentaire EXIF.
647
			// TODO : ajouter le champ commentaire EXIF.
648
		if (! $this->etreNull($id_obs)) {
648
		if (! $this->etreNull($id_obs)) {
649
			$description .=
649
			$description .=
650
				'<div class="gauche">'.
650
				'<div class="gauche">'.
651
				'<h3>'.'Observation'.'</h3>'.
651
				'<h3>'.'Observation'.'</h3>'.
652
				'<ul>'.
652
				'<ul>'.
653
				'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'.
653
				'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'.
654
				'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'.
654
				'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'.
655
				'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'.
655
				'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'.
656
				'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'.
656
				'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'.
657
				'<li>'.'<span class="champ">Lieu :</span> '.$this->nePasInterpreterXml($this->nettoyerTexte($lieu)).'</li>'.
657
				'<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'.
658
				'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'.
658
				'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'.
659
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : '').
659
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : '').
660
				'<li>'.'<span class="champ">Commentaire :</span> '.$this->nePasInterpreterXml($commentaire_obs).'</li>'.
660
				'<li>'.'<span class="champ">Commentaire :</span> '.$this->nePasInterpreterXml($commentaire_obs).'</li>'.
661
				'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'.
661
				'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'.
662
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : '').
662
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : '').
663
				'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'.
663
				'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'.
664
				'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'.
664
				'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'.
665
				'</ul>'.
665
				'</ul>'.
666
				'</div>';
666
				'</div>';
667
		}
667
		}
668
		$description = $this->nettoyerTexte($description);
668
		$description = $this->nettoyerTexte($description);
669
		return $description;
669
		return $description;
670
	}
670
	}
671
 
671
 
672
	private function getServiceParMotsCles() {
672
	private function getServiceParMotsCles() {
673
		$infos=array();
673
		$infos=array();
674
		$infos[0]['nom_sel_nn'] = '';
674
		$infos[0]['nom_sel_nn'] = '';
675
		$infos[0]['date_creation'] = '2011-06-28';
675
		$infos[0]['date_creation'] = '2011-06-28';
676
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
676
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
677
		$donnees['items'][0]['guid'] = 0;
677
		$donnees['items'][0]['guid'] = 0;
678
		$donnees['items'][0]['description'] =  'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
678
		$donnees['items'][0]['description'] =  'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
679
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag=';
679
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag=';
680
		if (isset($this->parametres[0])) {
680
		if (isset($this->parametres[0])) {
681
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
681
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
682
		} else {
682
		} else {
683
			$donnees['items'][0]['description'] .= '</b>';
683
			$donnees['items'][0]['description'] .= '</b>';
684
		}
684
		}
685
		$donnees['items'][0]['titre'] = '';
685
		$donnees['items'][0]['titre'] = '';
686
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
686
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
687
		return $contenu;
687
		return $contenu;
688
	}
688
	}
689
 
689
 
690
	private function getServiceParCommune() {
690
	private function getServiceParCommune() {
691
		$infos=array();
691
		$infos=array();
692
		$infos[0]['nom_sel_nn'] = '';
692
		$infos[0]['nom_sel_nn'] = '';
693
		$infos[0]['date_creation'] = '2011-06-28';
693
		$infos[0]['date_creation'] = '2011-06-28';
694
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
694
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
695
		$donnees['items'][0]['guid'] = 0;
695
		$donnees['items'][0]['guid'] = 0;
696
		$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
696
		$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
697
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune=';
697
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune=';
698
		if (isset($this->parametres[0])) {
698
		if (isset($this->parametres[0])) {
699
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
699
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
700
		} else {
700
		} else {
701
			$donnees['items'][0]['description'] .= '</b>';
701
			$donnees['items'][0]['description'] .= '</b>';
702
		}
702
		}
703
		$donnees['items'][0]['titre'] = '';
703
		$donnees['items'][0]['titre'] = '';
704
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
704
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
705
		return $contenu;
705
		return $contenu;
706
	}
706
	}
707
 
707
 
708
	private function getIntituleAuteur($courriel) {
708
	private function getIntituleAuteur($courriel) {
709
		$courriel = strtolower($courriel);
709
		$courriel = strtolower($courriel);
710
		$intitule = $this->auteurs[$courriel];
710
		$intitule = $this->auteurs[$courriel];
711
		return $intitule;
711
		return $intitule;
712
	}
712
	}
713
}
713
}