Subversion Repositories eFlore/Applications.cel

Rev

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

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