Subversion Repositories eFlore/Applications.cel

Rev

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

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