Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 3131 Rev 3134
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service fournissant des exports des données publiques du CEL pour le widget.
4
 * Service fournissant des exports des données publiques du CEL pour le widget.
5
 *
5
 *
6
 * Format du service :
6
 * Format du service :
7
 * /CelWidgetExport/format
7
 * /CelWidgetExport/format
8
 * /CelWidgetExport/csv
8
 * /CelWidgetExport/csv
9
 *
9
 *
10
 * Les paramêtres :
10
 * Les paramêtres :
11
 *  - "start" indique le numéro du premier item à afficher
11
 *  - "start" indique le numéro du premier item à afficher
12
 *  - "limit" nombre d'items à afficher
12
 *  - "limit" nombre d'items à afficher
13
 *
13
 *
14
 * @internal   Mininum PHP version : 5.2
14
 * @internal   Mininum PHP version : 5.2
15
 * @category   CEL
15
 * @category   CEL
16
 * @package    Services
16
 * @package    Services
17
 * @subpackage Widget
17
 * @subpackage Widget
18
 * @version    0.1
18
 * @version    0.1
19
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
19
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
20
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
20
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
21
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
21
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
22
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
22
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
23
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
23
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
24
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
24
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
25
 */
25
 */
26
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
26
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
27
// la sortie est binaire (xls), mais OLE n'est pas compatible E_ALL en PHP-5.4
27
// la sortie est binaire (xls), mais OLE n'est pas compatible E_ALL en PHP-5.4
28
error_reporting(error_reporting() & ~E_STRICT);
28
error_reporting(error_reporting() & ~E_STRICT);
29
require_once 'lib/OLE.php';
29
require_once 'lib/OLE.php';
30
require_once 'lib/Spreadsheet/Excel/Writer.php';
30
require_once 'lib/Spreadsheet/Excel/Writer.php';
31
 
31
 
32
class CelWidgetExport extends Cel {
32
class CelWidgetExport extends Cel {
33
	
33
	
34
	private $nom_fichier_export = 'cel_export';
34
	private $nom_fichier_export = 'cel_export';
35
	// certains paramètres apparaissent plusieurs fois car ils ont des alias
35
	// certains paramètres apparaissent plusieurs fois car ils ont des alias
36
	// dans certains widgets
36
	// dans certains widgets
37
	private $parametres_autorises = array(
37
	private $parametres_autorises = array(
38
			'id_utilisateur' => 'ce_utilisateur',
38
			'id_utilisateur' => 'ce_utilisateur',
39
			'utilisateur' => 'courriel_utilisateur',
39
			'utilisateur' => 'courriel_utilisateur',
40
			'courriel_utilisateur' => 'courriel_utilisateur',
40
			'courriel_utilisateur' => 'courriel_utilisateur',
41
			'pays' => 'pays',
41
			'pays' => 'pays',
42
			'commune' => 'zone_geo',
42
			'commune' => 'zone_geo',
43
			'zone_geo' => 'zone_geo',
43
			'zone_geo' => 'zone_geo',
44
			'dept' => 'departement',
44
			'dept' => 'departement',
45
			'departement' => 'departement',
45
			'departement' => 'departement',
46
			'lieudit' => 'lieudit',
46
			'lieudit' => 'lieudit',
47
			'station' => 'station',
47
			'station' => 'station',
48
			'projet' => 'mots_cles',
48
			'projet' => 'mots_cles',
49
			'programme' => 'programme',
49
			'programme' => 'programme',
50
			'num_taxon' => 'nt',
50
			'num_taxon' => 'nt',
51
			'date_debut' => 'date_debut',
51
			'date_debut' => 'date_debut',
52
			'date_fin' => 'date_fin',
52
			'date_fin' => 'date_fin',
53
			'taxon' => 'taxon',
53
			'taxon' => 'taxon',
54
			'identiplante' => 'validation_identiplante',
54
			'identiplante' => 'validation_identiplante',
55
			'validation_identiplante' => 'validation_identiplante',
55
			'validation_identiplante' => 'validation_identiplante',
56
			'annee' => 'annee',
56
			'annee' => 'annee',
57
			'mois' => 'mois',
57
			'mois' => 'mois',
58
			'jour' => 'jour',
58
			'jour' => 'jour',
59
			'recherche' => 'recherche',
59
			'recherche' => 'recherche',
60
			'id_mots_cles' => 'id_mots_cles',
60
			'id_mots_cles' => 'id_mots_cles',
61
			'mots_cles' => 'mots_cles',
61
			'mots_cles' => 'mots_cles',
62
			'debut' => 'debut',
62
			'debut' => 'debut',
63
			'limite' => 'limite',
63
			'limite' => 'limite',
64
			'format' => 'format',
64
			'format' => 'format',
65
			'colonnes' => 'colonnes',
65
			'colonnes' => 'colonnes',
66
			'transmission' => 'transmission',
66
			'transmission' => 'transmission',
67
			'obsids' => 'obsids',
67
			'obsids' => 'obsids',
-
 
68
			'standard' => 'standard',
68
	);
69
	);
69
	
70
	
70
	private $limite_decoupage_defaut = 9000;
71
	private $limite_decoupage_defaut = 9000;
71
	
72
	
72
	private $format = 'csv';
73
	private $format = 'csv';
73
	
74
	
74
	public $id_utilisateur = null;
75
	public $id_utilisateur = null;
75
	
76
	
76
	public $export_prive = false;
77
	public $export_prive = false;
77
	
78
	
78
	// un cache, initialisé par certaines fonctions de préchargement, à la manière
79
	// un cache, initialisé par certaines fonctions de préchargement, à la manière
79
	// de ce qui est fait par FormateurGroupeColonne
80
	// de ce qui est fait par FormateurGroupeColonne
80
	static $cache = Array();
81
	static $cache = Array();
81
	
82
	
82
	public function getRessource() {
83
	public function getRessource() {
83
		return $this->getElement(array());
84
		return $this->getElement(array());
84
	}
85
	}
85
	
86
	
86
	/**
87
	/**
87
	 * Méthode appelée avec une requête de type GET.
88
	 * Méthode appelée avec une requête de type GET.
88
	 */
89
	 */
89
	public function getElement($params = array()) {
90
	public function getElement($params = array()) {
90
		switch(@strtolower($params[0])) {
91
		switch(@strtolower($params[0])) {
91
			case 'calcul':
92
			case 'calcul':
92
				$this->getCalcul();
93
				$this->getCalcul();
93
				break;
94
				break;
94
				
95
				
95
			case 'export':
96
			case 'export':
96
				$this->getExport();
97
				$this->getExport();
97
				break;
98
				break;
98
			default:
99
			default:
99
				$this->getExport();
100
				$this->getExport();
100
		}
101
		}
101
	}
102
	}
102
	
103
	
103
	private function getCalcul() {
104
	private function getCalcul() {
104
		$criteres = $this->traiterParametresAutorises($_GET);
105
		$criteres = $this->traiterParametresAutorises($_GET);
-
 
106
		if (!isset($criteres['standard'])) { 
105
		$criteres['transmission'] = 1;
107
				$criteres['transmission'] = 1;
-
 
108
		} else {
-
 
109
			unset($criteres['transmission']);
106
		
110
		}
107
		// Définit si l'on exporte les obs privées ainsi que les champs étendus privés
111
		// Définit si l'on exporte les obs privées ainsi que les champs étendus privés
108
		$this->export_prive = $this->doitEtPeutExporterObsPrivees($criteres);
112
		$this->export_prive = $this->doitEtPeutExporterObsPrivees($criteres);
109
		if($this->export_prive) {
113
		if($this->export_prive) {
110
			unset($criteres['transmission']);
114
			unset($criteres['transmission']);
111
			$this->id_utilisateur = $criteres['id_utilisateur'];
115
			$this->id_utilisateur = $criteres['id_utilisateur'];
112
		}
116
		}
-
 
117
		if (isset($criteres['standard']) && $criteres['standard'] == 1) {
113
		$chercheur_observations = new RechercheObservationExport($this->config);
118
			$chercheur_observations = new RechercheObservationExport($this->config);
-
 
119
		} else {
-
 
120
			$chercheur_observations = new RechercheObservation($this->config);
-
 
121
		}
114
		$numero_page = isset($criteres['debut']) ? $criteres['debut'] : 0;
122
		$numero_page = isset($criteres['debut']) ? $criteres['debut'] : 0;
115
		$limite = isset($criteres['limite']) ? $criteres['limite'] : 0;
123
		$limite = isset($criteres['limite']) ? $criteres['limite'] : 0;
116
		$colonnes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
124
		$colonnes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes'], $criteres['programme']);
117
		
125
		
118
		unset($criteres['limite']);
126
		unset($criteres['limite']);
119
		unset($criteres['debut']);
127
		unset($criteres['debut']);
120
		unset($criteres['format']);
128
		unset($criteres['format']);
121
		unset($criteres['colonnes']);
129
		unset($criteres['colonnes']);
122
		
130
		
123
		$nb_observations = $chercheur_observations->compterObservations(null, $criteres);
131
		$nb_observations = $chercheur_observations->compterObservations(null, $criteres);
124
		$limite_decoupage = $this->calculerNbLignesMaxParFichier(explode(',', $colonnes));
132
		$limite_decoupage = $this->calculerNbLignesMaxParFichier(explode(',', $colonnes));
125
		
133
		
126
		$url_telechargements = array();
134
		$url_telechargements = array();
127
		$intervalle = 0;
135
		$intervalle = 0;
128
		
136
		
129
		$params_url = $criteres;
137
		$params_url = $criteres;
130
		unset($params_url['transmission']);
138
		unset($params_url['transmission']);
131
		do {
139
		do {
132
			$base_url = $this->config['settings']['baseURLAbsolu'].'CelWidgetExport/export';
140
			$base_url = $this->config['settings']['baseURLAbsolu'].'CelWidgetExport/export';
133
			$params_url['debut'] = $intervalle;
141
			$params_url['debut'] = $intervalle;
134
			$params_url['limite'] = $limite_decoupage;
142
			$params_url['limite'] = $limite_decoupage;
135
			$url_telechargement_fichier = $base_url;
143
			$url_telechargement_fichier = $base_url;
136
			$url_telechargements[] = $base_url.'?'.http_build_query($params_url).'&format='.$this->format.'&colonnes='.$colonnes;
144
			$url_telechargements[] = $base_url.'?'.http_build_query($params_url).'&format='.$this->format.'&colonnes='.$colonnes;
137
			$intervalle += $limite_decoupage;
145
			$intervalle += $limite_decoupage;
138
			$nb_observations -= $limite_decoupage;
146
			$nb_observations -= $limite_decoupage;
139
		} while($nb_observations > 0);
147
		} while($nb_observations > 0);
140
		
148
		
141
		$this->envoyerJson($url_telechargements);
149
		$this->envoyerJson($url_telechargements);
142
	}
150
	}
143
	
151
	
144
	private function calculerNbLignesMaxParFichier($colonnes) {
152
	private function calculerNbLignesMaxParFichier($colonnes) {
145
		$limite = $this->limite_decoupage_defaut;
153
		$limite = $this->limite_decoupage_defaut;
146
		
154
		
147
		switch($this->format) {
155
		switch($this->format) {
148
			case 'csv':
156
			case 'csv':
149
				$limite = 20000;
157
				$limite = 20000;
150
				break;
158
				break;
151
			case 'xls':
159
			case 'xls':
152
				$limite = 8000;
160
				$limite = 8000;
153
				break;
161
				break;
154
			case 'pdf':
162
			case 'pdf':
155
				$limite = 300;
163
				$limite = 300;
156
				break;
164
				break;
157
		}
165
		}
158
		
166
		
159
		return $limite;
167
		return $limite;
160
	}
168
	}
161
	
169
	
162
	private function getExport() {
170
	private function getExport() {
163
		$criteres = $this->traiterParametresAutorises($_GET);
171
		$criteres = $this->traiterParametresAutorises($_GET);
164
		// ne pas faire de super-requête en cas d'absence de paramètres
172
		// ne pas faire de super-requête en cas d'absence de paramètres
165
		// par exemple "format", au minimum, devrait être défini
173
		// par exemple "format", au minimum, devrait être défini
166
		if(!$criteres) die('erreur: pas de paramètre reçu');
174
		if(!$criteres) die('erreur: pas de paramètre reçu');
167
		if(!in_array($this->format, array('pdf','csv','xls'))) die('erreur: format invalide');
175
		if(!in_array($this->format, array('pdf','csv','xls'))) die('erreur: format invalide');
-
 
176
		
168
		
177
		if (!isset($criteres['standard'])) {
-
 
178
			$criteres['transmission'] = 1;
-
 
179
		} else {
-
 
180
			unset($criteres['transmission']);
169
		//$criteres['transmission'] = 1;
181
		}
170
		// Définit si l'on exporte les obs privées ainsi que les champs étendus privés
182
		// Définit si l'on exporte les obs privées ainsi que les champs étendus privés
171
		$this->export_prive = $this->doitEtPeutExporterObsPrivees($criteres);
183
		$this->export_prive = $this->doitEtPeutExporterObsPrivees($criteres);
172
		if($this->export_prive) {
184
		if($this->export_prive) {
173
			//unset($criteres['transmission']);
185
			//unset($criteres['transmission']);
174
			$this->id_utilisateur = $criteres['ce_utilisateur'];
186
			$this->id_utilisateur = $criteres['ce_utilisateur'];
175
		}
187
		}
-
 
188
		if (isset($criteres['standard']) && $criteres['standard'] == 1) {
176
		$chercheur_observations = new RechercheObservationExport($this->config);
189
			$chercheur_observations = new RechercheObservationExport($this->config);
-
 
190
		} else {
-
 
191
			$chercheur_observations = new RechercheObservation($this->config);
177
		
192
		}
178
		$debut = isset($criteres['debut']) ? intval($criteres['debut']) : 0;
193
		$debut = isset($criteres['debut']) ? intval($criteres['debut']) : 0;
179
		$limite = isset($criteres['limite']) ? intval($criteres['limite']) : 0;
194
		$limite = isset($criteres['limite']) ? intval($criteres['limite']) : 0;
180
		$groupes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
195
		$groupes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
181
		$groupes .= ',auteur';
196
		$groupes .= ',auteur';
182
		
197
		
183
		if(!$groupes) die('erreur: Ne peut identifier les groupes de champs demandés.');
198
		if(!$groupes) die('erreur: Ne peut identifier les groupes de champs demandés.');
184
		
199
		
185
		
200
		
186
		if($criteres['obsids']) $criteres['sql_brut'] = sprintf('id_observation IN (%s)',
201
		if($criteres['obsids']) $criteres['sql_brut'] = sprintf('id_observation IN (%s)',
187
				implode(',', $criteres['obsids']));
202
				implode(',', $criteres['obsids']));
188
		
203
		
189
		unset($criteres['limite']);
204
		unset($criteres['limite']);
190
		unset($criteres['debut']);
205
		unset($criteres['debut']);
191
		unset($criteres['format']);
206
		unset($criteres['format']);
192
		unset($criteres['colonnes']);
207
		unset($criteres['colonnes']);
193
		unset($criteres['obsids']);
208
		unset($criteres['obsids']);
194
		
209
		
195
		$observations = $chercheur_observations->rechercherObservations(null, $criteres, $debut, $limite, TRUE)->get();
210
		$observations = $chercheur_observations->rechercherObservations(null, $criteres, $debut, $limite, TRUE)->get();
196
		$ids = array();
211
		$ids = array();
197
		foreach($observations as &$obs) {
212
		foreach($observations as &$obs) {
198
			$ids[] = $obs['id_observation'];
213
			$ids[] = $obs['id_observation'];
199
		}
214
		}
200
		
215
		
201
		if($this->format == 'pdf') {
216
		if($this->format == 'pdf') {
202
			$pdf = $this->convertirEnPdf($observations);
217
			$pdf = $this->convertirEnPdf($observations);
203
			$pdf->pdf->Output('etiquettes.pdf', 'I');
218
			$pdf->pdf->Output('etiquettes.pdf', 'I');
204
			exit;
219
			exit;
205
		}
220
		}
206
		
221
		
207
		// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
222
		// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
208
		
223
		
209
		// Obtention des colonnes correspondantes aux groupes de champs
224
		// Obtention des colonnes correspondantes aux groupes de champs
210
		$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
225
		$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
211
		
226
		
212
		/*
227
		/*
213
		 Champs étendus et noms communs, si demandés.
228
		 Champs étendus et noms communs, si demandés.
214
		 * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
229
		 * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
215
		 qu'il initialise et utilise en interne sans qu'un passage par paramètre dans le contexte de CelWidgetExport
230
		 qu'il initialise et utilise en interne sans qu'un passage par paramètre dans le contexte de CelWidgetExport
216
		 ne soit nécessaire.
231
		 ne soit nécessaire.
217
		 * Pour les champs étendus, c'est CelWidgetExport::$cache qui est utilisé, aussi bien pour les en-têtes que
232
		 * Pour les champs étendus, c'est CelWidgetExport::$cache qui est utilisé, aussi bien pour les en-têtes que
218
		 pour les données préchargées, cf self::traiterLigneEtendue()
233
		 pour les données préchargées, cf self::traiterLigneEtendue()
219
		 */
234
		 */
220
		self::$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
235
		self::$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
221
		
236
		
222
		// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
237
		// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
223
		// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
238
		// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
224
		switch($this->format) {
239
		switch($this->format) {
225
			case 'csv':
240
			case 'csv':
226
				$csv = $this->convertirEnCsv($observations, $colonnes);
241
				$csv = $this->convertirEnCsv($observations, $colonnes);
227
				$this->envoyerCsv($csv);
242
				$this->envoyerCsv($csv);
228
				break;
243
				break;
229
			case 'xls':
244
			case 'xls':
230
				$xls = $this->convertirEnXls($observations, $colonnes);
245
				$xls = $this->convertirEnXls($observations, $colonnes);
231
				$this->envoyerXls($xls);
246
				$this->envoyerXls($xls);
232
				break;
247
				break;
233
			default:
248
			default:
234
		}
249
		}
235
	}
250
	}
236
	
251
	
237
	protected function traiterParametresAutorises(Array $parametres) {
252
	protected function traiterParametresAutorises(Array $parametres) {
238
		$parametres_traites = array();
253
		$parametres_traites = array();
239
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
254
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
240
		foreach($parametres as $cle => $valeur) {
255
		foreach($parametres as $cle => $valeur) {
241
			if(is_string($valeur) && !trim($valeur)) continue;
256
			if(is_string($valeur) && !trim($valeur)) continue;
242
			if(isset($this->parametres_autorises[$cle])) {
257
			if(isset($this->parametres_autorises[$cle])) {
243
				$parametres_traites[$this->parametres_autorises[$cle]] = $valeur;
258
				$parametres_traites[$this->parametres_autorises[$cle]] = $valeur;
244
			}
259
			}
245
		}
260
		}
246
		$parametres_traites['obsids'] = @self::traiterObsIds($parametres['obsids']);
-
 
247
		return $parametres_traites;
261
		return $parametres_traites;
248
	}
262
	}
249
	
263
	
250
	private function envoyerCsv($csv) {
264
	private function envoyerCsv($csv) {
251
		header('Content-Type: text/csv; charset=UTF-8');
265
		header('Content-Type: text/csv; charset=UTF-8');
252
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
266
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
253
		echo $csv;
267
		echo $csv;
254
		exit;
268
		exit;
255
	}
269
	}
256
	
270
	
257
	private function envoyerXls($workbook) {
271
	private function envoyerXls($workbook) {
258
		$workbook->close();
272
		$workbook->close();
259
		exit;
273
		exit;
260
	}
274
	}
261
	
275
	
262
	private function convertirEnCsv(&$data, $colonnes) {
276
	private function convertirEnCsv(&$data, $colonnes) {
263
		$chemin_temp = "php://temp";
277
		$chemin_temp = "php://temp";
264
		$outstream = fopen($chemin_temp, 'r+');
278
		$outstream = fopen($chemin_temp, 'r+');
265
		
279
		
266
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
280
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
267
		// en premier car utilisé génériquement dans getLigneObservation()
281
		// en premier car utilisé génériquement dans getLigneObservation()
268
		if(isset($colonnes['baseflor'])) {
282
		if(isset($colonnes['baseflor'])) {
269
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
283
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
270
		}
284
		}
271
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
285
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
272
		if(isset($colonnes['etendu'])) {
286
		if(isset($colonnes['etendu'])) {
273
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
287
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
274
		}
288
		}
275
		
289
		
276
		// header
290
		// header
277
		fputcsv($outstream, $intitule_champs, ',', '"');
291
		fputcsv($outstream, $intitule_champs, ',', '"');
278
		// lignes
292
		// lignes
279
		foreach($data as &$ligne) {
293
		foreach($data as &$ligne) {
280
			$ligne = self::filtrerDonneesSensibles($ligne);
294
			$ligne = self::filtrerDonneesSensibles($ligne);
281
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
295
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
282
			fputcsv($outstream, $ligne, ',', '"');
296
			fputcsv($outstream, $ligne, ',', '"');
283
		}
297
		}
284
		rewind($outstream);
298
		rewind($outstream);
285
		$csv = stream_get_contents($outstream);
299
		$csv = stream_get_contents($outstream);
286
		fclose($outstream);
300
		fclose($outstream);
287
		return $csv;
301
		return $csv;
288
	}
302
	}
289
	
303
	
290
	private function convertirEnXls(&$data, $colonnes) {
304
	private function convertirEnXls(&$data, $colonnes) {
291
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
305
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
292
		$this->extendSpreadsheetProductor->initSpreadsheet();
306
		$this->extendSpreadsheetProductor->initSpreadsheet();
293
		
307
		
294
		$workbook = new Spreadsheet_Excel_Writer();
308
		$workbook = new Spreadsheet_Excel_Writer();
295
		// avant la définition du titre de la worksheet !
309
		// avant la définition du titre de la worksheet !
296
		$workbook->setVersion(8);
310
		$workbook->setVersion(8);
297
		
311
		
298
		$worksheet = $workbook->addWorksheet('Liste');
312
		$worksheet = $workbook->addWorksheet('Liste');
299
		$workbook->setTempDir($this->config['cel']['chemin_stockage_temp']);
313
		$workbook->setTempDir($this->config['cel']['chemin_stockage_temp']);
300
		$worksheet->setInputEncoding('utf-8');
314
		$worksheet->setInputEncoding('utf-8');
301
		$workbook->send($this->nom_fichier_export.'.xls');
315
		$workbook->send($this->nom_fichier_export.'.xls');
302
		
316
		
303
		$nb_lignes = 1;
317
		$nb_lignes = 1;
304
		
318
		
305
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
319
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
306
		// en premier car utilisé génériquement dans getLigneObservation()
320
		// en premier car utilisé génériquement dans getLigneObservation()
307
		if(isset($colonnes['baseflor'])) {
321
		if(isset($colonnes['baseflor'])) {
308
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
322
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
309
		}
323
		}
310
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
324
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
311
		if(isset($colonnes['etendu'])) {
325
		if(isset($colonnes['etendu'])) {
312
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
326
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
313
		}
327
		}
314
		
328
		
315
		// header
329
		// header
316
		$indice = 0;
330
		$indice = 0;
317
		foreach ($intitule_champs as &$intitule) {
331
		foreach ($intitule_champs as &$intitule) {
318
			$worksheet->write(0,$indice++,$intitule);
332
			$worksheet->write(0,$indice++,$intitule);
319
		}
333
		}
320
		
334
		
321
		foreach($data as &$ligne) {
335
		foreach($data as &$ligne) {
322
			$ligne = self::filtrerDonneesSensibles($ligne);
336
			$ligne = self::filtrerDonneesSensibles($ligne);
323
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
337
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
324
			$indice = 0;
338
			$indice = 0;
325
			foreach($ligne as &$champ) {
339
			foreach($ligne as &$champ) {
326
				$worksheet->write($nb_lignes,$indice++,$champ);
340
				$worksheet->write($nb_lignes,$indice++,$champ);
327
			}
341
			}
328
			$nb_lignes++;
342
			$nb_lignes++;
329
		}
343
		}
330
		return $workbook;
344
		return $workbook;
331
	}
345
	}
332
	
346
	
333
	private function convertirEnPdf(&$observations) {
347
	private function convertirEnPdf(&$observations) {
334
		if(count($observations) > 300) die('erreur: trop de données');
348
		if(count($observations) > 300) die('erreur: trop de données');
335
		//require_once('GenerateurPDF.php');
349
		//require_once('GenerateurPDF.php');
336
		$pdf = new GenerateurPDF();
350
		$pdf = new GenerateurPDF();
337
		$pdf->export($observations);
351
		$pdf->export($observations);
338
		return $pdf;
352
		return $pdf;
339
	}
353
	}
340
	
354
	
341
	static function filtrerDonneesSensibles($ligne) {
355
	static function filtrerDonneesSensibles($ligne) {
342
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
356
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
343
			$ligne['latitude'] = '';
357
			$ligne['latitude'] = '';
344
			$ligne['longitude'] = '';
358
			$ligne['longitude'] = '';
345
		}
359
		}
346
		return $ligne;
360
		return $ligne;
347
	}
361
	}
348
	
362
	
349
	private function doitEtPeutExporterObsPrivees($criteres) {
363
	private function doitEtPeutExporterObsPrivees($criteres) {
350
		return isset($criteres['ce_utilisateur']) &&
364
		return isset($criteres['ce_utilisateur']) &&
351
		$this->peutExporterObsPrivees($criteres['ce_utilisateur']);
365
		$this->peutExporterObsPrivees($criteres['ce_utilisateur']);
352
	}
366
	}
353
	
367
	
354
	private function peutExporterObsPrivees($id_utilisateur) {
368
	private function peutExporterObsPrivees($id_utilisateur) {
355
		$gestion_utilisateur = new GestionUtilisateur($this->config);
369
		$gestion_utilisateur = new GestionUtilisateur($this->config);
356
		$utilisateur = $gestion_utilisateur->obtenirIdentiteConnectee();
370
		$utilisateur = $gestion_utilisateur->obtenirIdentiteConnectee();
357
		return ! empty($utilisateur['id_utilisateur']) && $id_utilisateur == $utilisateur['id_utilisateur'];
371
		return ! empty($utilisateur['id_utilisateur']) && $id_utilisateur == $utilisateur['id_utilisateur'];
358
	}
372
	}
359
	
-
 
360
	static function traiterObsIds($range_param) {
-
 
361
		if (!isset($range_param)) return NULL;
-
 
362
		// trim() car: `POST http://url<<<"range=*"`
-
 
363
		if (trim($range_param) == '*') return NULL;
-
 
364
		return self::rangeToList(trim($range_param));
-
 
365
	}
373
	
366
	
-
 
367
	/*
-
 
368
	 * @param $fieldSets: un range, eg: 1-5,8,32,58-101
-
 
369
	 * @return un tableau trié, eg: 1,2,3,4,5,8,32,58,...,101
-
 
370
	 * http://stackoverflow.com/questions/7698664/converting-a-range-or-partial-array-in-the-form-3-6-or-3-6-12-into-an-arra
-
 
371
	 */
-
 
372
	static function rangeToList($in = '') {
-
 
373
		$inSets = explode(',', trim($in, ','));
-
 
374
		$outSets = array();
-
 
375
		
-
 
376
		foreach($inSets as $inSet) {
-
 
377
			list($start,$end) = explode('-', $inSet . '-' . $inSet);
-
 
378
			// ignore les ranges trop importants
-
 
379
			if($start > 10000000 || $end > 10000000 || abs($start-$end) > 10000) continue;
-
 
380
			$outSets = array_merge($outSets,range($start,$end));
-
 
381
		}
-
 
382
		$outSets = array_unique($outSets);
-
 
383
		$outSets = array_filter($outSets, 'is_numeric');
-
 
384
		sort($outSets);
-
 
385
		return $outSets;
-
 
386
	}
374
 
387
}
375
}
388
?>
376
?>