Subversion Repositories eFlore/Applications.cel

Rev

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

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