Subversion Repositories eFlore/Applications.cel

Rev

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

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