Subversion Repositories eFlore/Applications.cel

Rev

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

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