Subversion Repositories eFlore/Applications.cel

Rev

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

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