Subversion Repositories eFlore/Applications.cel

Rev

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

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