Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2190 Rev 2250
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();
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() {
131
	private function calculerNbLignesMaxParFichier($colonnes) {
-
 
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);
132
		$limite = $this->limite_decoupage_defaut;
136
		
133
		switch($this->format) {
137
		switch($this->format) {
134
			case 'csv':
138
			case 'csv':
135
				$limite = 20000;
139
				$limite = 20000;
136
				break;
140
				break;
137
			case 'xls':
141
			case 'xls':
138
				$limite = 8000;
142
				$limite = 8000;
139
				break;
143
				break;
140
			case 'pdf':
144
			case 'pdf':
141
				$limite = 300;
145
				$limite = 300;
142
				break;
146
				break;
143
		}
147
		}
-
 
148
 
144
		return $limite;
149
		return $limite * $facteur_reduction;
145
	}
150
	}
146
	
151
	
147
	private function getExport() {
152
	private function getExport() {
148
		$criteres = $this->traiterParametresAutorises($_GET);
153
		$criteres = $this->traiterParametresAutorises($_GET);
149
		// ne pas faire de super-requête en cas d'absence de paramètres
154
		// ne pas faire de super-requête en cas d'absence de paramètres
150
		// par exemple "format", au minimum, devrait être défini
155
		// par exemple "format", au minimum, devrait être défini
151
		if(!$criteres) die('erreur: pas de paramètre reçu');
156
		if(!$criteres) die('erreur: pas de paramètre reçu');
152
		if(!in_array($this->format, array('pdf','csv','xls'))) die('erreur: format invalide');
157
		if(!in_array($this->format, array('pdf','csv','xls'))) die('erreur: format invalide');
153
 
158
 
154
		$criteres['transmission'] = 1;
159
		$criteres['transmission'] = 1;
155
		if($this->doitEtPeutExporterObsPrivees($criteres)) {
160
		if($this->doitEtPeutExporterObsPrivees($criteres)) {
156
			unset($criteres['transmission']);
161
			unset($criteres['transmission']);
157
			$this->id_utilisateur = $criteres['ce_utilisateur'];
162
			$this->id_utilisateur = $criteres['ce_utilisateur'];
158
		}
163
		}
159
		$chercheur_observations = new RechercheObservation($this->config);
164
		$chercheur_observations = new RechercheObservation($this->config);
160
		
165
		
161
		$debut = isset($criteres['debut']) ? intval($criteres['debut']) : 0;
166
		$debut = isset($criteres['debut']) ? intval($criteres['debut']) : 0;
162
		$limite = isset($criteres['limite']) ? intval($criteres['limite']) : 0;
167
		$limite = isset($criteres['limite']) ? intval($criteres['limite']) : 0;
163
		$groupes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
168
		$groupes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
164
		$groupes .= ',auteur';
169
		$groupes .= ',auteur';
165
 
170
 
166
		if(!$groupes) die('erreur: Ne peut identifier les groupes de champs demandés.');
171
		if(!$groupes) die('erreur: Ne peut identifier les groupes de champs demandés.');
167
 
172
 
168
 
173
 
169
		if($criteres['obsids']) $criteres['sql_brut'] = sprintf('id_observation IN (%s)',
174
		if($criteres['obsids']) $criteres['sql_brut'] = sprintf('id_observation IN (%s)',
170
																implode(',', $criteres['obsids']));
175
																implode(',', $criteres['obsids']));
171
		
176
		
172
		unset($criteres['limite']);
177
		unset($criteres['limite']);
173
		unset($criteres['debut']);
178
		unset($criteres['debut']);
174
		unset($criteres['format']);
179
		unset($criteres['format']);
175
		unset($criteres['colonnes']);
180
		unset($criteres['colonnes']);
176
		unset($criteres['obsids']);
181
		unset($criteres['obsids']);
177
 
182
 
178
		$observations = $chercheur_observations->rechercherObservations(null, $criteres, $debut, $limite, TRUE)->get();
183
		$observations = $chercheur_observations->rechercherObservations(null, $criteres, $debut, $limite, TRUE)->get();
179
		$ids = array();
184
		$ids = array();
180
		foreach($observations as &$obs) {
185
		foreach($observations as &$obs) {
181
			$ids[] = $obs['id_observation'];
186
			$ids[] = $obs['id_observation'];
182
		}
187
		}
183
 
188
 
184
		if($this->format == 'pdf') {
189
		if($this->format == 'pdf') {
185
			$pdf = $this->convertirEnPdf($observations);
190
			$pdf = $this->convertirEnPdf($observations);
186
			$pdf->pdf->Output('etiquettes.pdf', 'I');
191
			$pdf->pdf->Output('etiquettes.pdf', 'I');
187
			exit;
192
			exit;
188
		}
193
		}
189
 
194
 
190
		// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
195
		// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
191
 
196
 
192
		// Obtention des colonnes correspondantes aux groupes de champs
197
		// Obtention des colonnes correspondantes aux groupes de champs
193
		$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
198
		$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
194
 
199
 
195
		/*
200
		/*
196
		  Champs étendus et noms communs, si demandés.
201
		  Champs étendus et noms communs, si demandés.
197
		  * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
202
		  * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
198
		  qu'il initialise et utilise en interne sans qu'un passage par paramètre dans le contexte de CelWidgetExport
203
		  qu'il initialise et utilise en interne sans qu'un passage par paramètre dans le contexte de CelWidgetExport
199
		  ne soit nécessaire.
204
		  ne soit nécessaire.
200
		  * Pour les champs étendus, c'est CelWidgetExport::$cache qui est utilisé, aussi bien pour les en-têtes que
205
		  * Pour les champs étendus, c'est CelWidgetExport::$cache qui est utilisé, aussi bien pour les en-têtes que
201
		  pour les données préchargées, cf self::traiterLigneEtendue()
206
		  pour les données préchargées, cf self::traiterLigneEtendue()
202
		*/
207
		*/
203
		self::$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
208
		self::$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
204
 
209
 
205
    	// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
210
    	// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
206
    	// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
211
    	// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
207
		switch($this->format) {
212
		switch($this->format) {
208
		case 'csv':
213
		case 'csv':
209
			$csv = $this->convertirEnCsv($observations, $colonnes);
214
			$csv = $this->convertirEnCsv($observations, $colonnes);
210
			$this->envoyerCsv($csv);
215
			$this->envoyerCsv($csv);
211
			break;
216
			break;
212
		case 'xls':
217
		case 'xls':
213
			$xls = $this->convertirEnXls($observations, $colonnes);
218
			$xls = $this->convertirEnXls($observations, $colonnes);
214
			$this->envoyerXls($xls);
219
			$this->envoyerXls($xls);
215
			break;
220
			break;
216
		default:
221
		default:
217
		}
222
		}
218
	}
223
	}
219
	
224
	
220
	protected function traiterParametresAutorises(Array $parametres) {
225
	protected function traiterParametresAutorises(Array $parametres) {
221
		$parametres_traites = array();
226
		$parametres_traites = array();
222
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
227
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
223
		foreach($parametres as $cle => $valeur) {
228
		foreach($parametres as $cle => $valeur) {
224
			if(is_string($valeur) && !trim($valeur)) continue;
229
			if(is_string($valeur) && !trim($valeur)) continue;
225
			if(isset($this->parametres_autorises[$cle])) {
230
			if(isset($this->parametres_autorises[$cle])) {
226
				$parametres_traites[$this->parametres_autorises[$cle]] = $valeur;
231
				$parametres_traites[$this->parametres_autorises[$cle]] = $valeur;
227
			}
232
			}
228
		}
233
		}
229
		$parametres_traites['obsids'] = @self::traiterObsIds($parametres['obsids']);
234
		$parametres_traites['obsids'] = @self::traiterObsIds($parametres['obsids']);
230
		return $parametres_traites;
235
		return $parametres_traites;
231
	}
236
	}
232
	
237
	
233
	private function envoyerCsv($csv) {
238
	private function envoyerCsv($csv) {
234
		header('Content-Type: text/csv; charset=UTF-8');
239
		header('Content-Type: text/csv; charset=UTF-8');
235
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
240
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
236
		echo $csv;
241
		echo $csv;
237
		exit;
242
		exit;
238
	}
243
	}
239
	
244
	
240
	private function envoyerXls($workbook) {
245
	private function envoyerXls($workbook) {
241
		$workbook->close();
246
		$workbook->close();
242
		exit;
247
		exit;
243
	}
248
	}
244
	
249
	
245
	private function convertirEnCsv(&$data, $colonnes) {
250
	private function convertirEnCsv(&$data, $colonnes) {
246
		$chemin_temp = "php://temp";
251
		$chemin_temp = "php://temp";
247
		$outstream = fopen($chemin_temp, 'r+');
252
		$outstream = fopen($chemin_temp, 'r+');
248
 
253
 
249
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
254
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
250
		// en premier car utilisé génériquement dans getLigneObservation()
255
		// en premier car utilisé génériquement dans getLigneObservation()
251
		if(isset($colonnes['baseflor'])) {
256
		if(isset($colonnes['baseflor'])) {
252
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
257
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
253
		}
258
		}
254
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
259
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
255
		if(isset($colonnes['etendu'])) {
260
		if(isset($colonnes['etendu'])) {
256
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
261
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
257
		}
262
		}
258
 
263
 
259
		// header
264
		// header
260
		fputcsv($outstream, $intitule_champs, ',', '"');			
265
		fputcsv($outstream, $intitule_champs, ',', '"');			
261
		// lignes
266
		// lignes
262
		foreach($data as &$ligne) {
267
		foreach($data as &$ligne) {
263
			$ligne = self::filtrerDonneesSensibles($ligne);
268
			$ligne = self::filtrerDonneesSensibles($ligne);
264
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
269
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
265
			fputcsv($outstream, $ligne, ',', '"');
270
			fputcsv($outstream, $ligne, ',', '"');
266
		}
271
		}
267
		rewind($outstream);
272
		rewind($outstream);
268
		$csv = stream_get_contents($outstream);
273
		$csv = stream_get_contents($outstream);
269
		fclose($outstream);
274
		fclose($outstream);
270
		return $csv;
275
		return $csv;
271
	}
276
	}
272
	
277
	
273
	private function convertirEnXls(&$data, $colonnes) {
278
	private function convertirEnXls(&$data, $colonnes) {
274
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
279
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
275
		$this->extendSpreadsheetProductor->initSpreadsheet();
280
		$this->extendSpreadsheetProductor->initSpreadsheet();
276
		
281
		
277
		$workbook = new Spreadsheet_Excel_Writer();
282
		$workbook = new Spreadsheet_Excel_Writer();
278
		// avant la définition du titre de la worksheet !
283
		// avant la définition du titre de la worksheet !
279
		$workbook->setVersion(8);
284
		$workbook->setVersion(8);
280
 
285
 
281
		$worksheet = $workbook->addWorksheet('Liste');
286
		$worksheet = $workbook->addWorksheet('Liste');
282
		$workbook->setTempDir($this->config['cel']['chemin_stockage_temp']);
287
		$workbook->setTempDir($this->config['cel']['chemin_stockage_temp']);
283
		$worksheet->setInputEncoding('utf-8');
288
		$worksheet->setInputEncoding('utf-8');
284
		$workbook->send($this->nom_fichier_export.'.xls');
289
		$workbook->send($this->nom_fichier_export.'.xls');
285
		
290
		
286
		$nb_lignes = 1;
291
		$nb_lignes = 1;
287
 
292
 
288
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
293
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
289
		// en premier car utilisé génériquement dans getLigneObservation()
294
		// en premier car utilisé génériquement dans getLigneObservation()
290
		if(isset($colonnes['baseflor'])) {
295
		if(isset($colonnes['baseflor'])) {
291
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
296
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
292
		}
297
		}
293
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
298
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
294
		if(isset($colonnes['etendu'])) {
299
		if(isset($colonnes['etendu'])) {
295
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
300
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
296
		}
301
		}
297
 
302
 
298
		// header
303
		// header
299
		$indice = 0;
304
		$indice = 0;
300
		foreach ($intitule_champs as &$intitule) {	
305
		foreach ($intitule_champs as &$intitule) {	
301
			$worksheet->write(0,$indice++,$intitule);
306
			$worksheet->write(0,$indice++,$intitule);
302
		}
307
		}
303
 
308
 
304
		foreach($data as &$ligne) {
309
		foreach($data as &$ligne) {
305
			$ligne = self::filtrerDonneesSensibles($ligne);
310
			$ligne = self::filtrerDonneesSensibles($ligne);
306
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
311
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
307
			$indice = 0;
312
			$indice = 0;
308
			foreach($ligne as &$champ) {
313
			foreach($ligne as &$champ) {
309
				$worksheet->write($nb_lignes,$indice++,$champ);
314
				$worksheet->write($nb_lignes,$indice++,$champ);
310
			}
315
			}
311
			$nb_lignes++;
316
			$nb_lignes++;
312
		}
317
		}
313
		return $workbook;
318
		return $workbook;
314
	}
319
	}
315
	
320
	
316
	private function convertirEnPdf(&$observations) {
321
	private function convertirEnPdf(&$observations) {
317
		if(count($observations) > 300) die('erreur: trop de données');
322
		if(count($observations) > 300) die('erreur: trop de données');
318
		//require_once('GenerateurPDF.php');
323
		//require_once('GenerateurPDF.php');
319
		$pdf = new GenerateurPDF();
324
		$pdf = new GenerateurPDF();
320
		$pdf->export($observations);
325
		$pdf->export($observations);
321
		return $pdf;
326
		return $pdf;
322
	}
327
	}
323
	
328
	
324
	static function filtrerDonneesSensibles($ligne) {
329
	static function filtrerDonneesSensibles($ligne) {
325
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
330
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
326
			$ligne['latitude'] = '';
331
			$ligne['latitude'] = '';
327
			$ligne['longitude'] = '';
332
			$ligne['longitude'] = '';
328
		}
333
		}
329
		return $ligne;
334
		return $ligne;
330
	}
335
	}
331
	
336
	
332
	private function doitEtPeutExporterObsPrivees($criteres) {
337
	private function doitEtPeutExporterObsPrivees($criteres) {
333
		return isset($criteres['ce_utilisateur']) && 
338
		return isset($criteres['ce_utilisateur']) && 
334
					$this->peutExporterObsPrivees($criteres['ce_utilisateur']);
339
					$this->peutExporterObsPrivees($criteres['ce_utilisateur']);
335
	}
340
	}
336
	
341
	
337
	private function peutExporterObsPrivees($id_utilisateur) {
342
	private function peutExporterObsPrivees($id_utilisateur) {
338
		$gestion_utilisateur = new User($this->config);
343
		$gestion_utilisateur = new User($this->config);
339
		$utilisateur = $gestion_utilisateur->obtenirIdentiteConnectee();
344
		$utilisateur = $gestion_utilisateur->obtenirIdentiteConnectee();
340
		return ! empty($utilisateur['id_utilisateur']) && $id_utilisateur == $utilisateur['id_utilisateur'];
345
		return ! empty($utilisateur['id_utilisateur']) && $id_utilisateur == $utilisateur['id_utilisateur'];
341
	}
346
	}
342
 
347
 
343
	static function traiterObsIds($range_param) {
348
	static function traiterObsIds($range_param) {
344
		if (!isset($range_param)) return NULL;
349
		if (!isset($range_param)) return NULL;
345
		// trim() car: `POST http://url<<<"range=*"`
350
		// trim() car: `POST http://url<<<"range=*"`
346
		if (trim($range_param) == '*') return NULL;
351
		if (trim($range_param) == '*') return NULL;
347
		return self::rangeToList(trim($range_param));
352
		return self::rangeToList(trim($range_param));
348
	}
353
	}
349
 
354
 
350
	/*
355
	/*
351
	 * @param $fieldSets: un range, eg: 1-5,8,32,58-101
356
	 * @param $fieldSets: un range, eg: 1-5,8,32,58-101
352
	 * @return un tableau trié, eg: 1,2,3,4,5,8,32,58,...,101
357
	 * @return un tableau trié, eg: 1,2,3,4,5,8,32,58,...,101
353
	 * http://stackoverflow.com/questions/7698664/converting-a-range-or-partial-array-in-the-form-3-6-or-3-6-12-into-an-arra
358
	 * http://stackoverflow.com/questions/7698664/converting-a-range-or-partial-array-in-the-form-3-6-or-3-6-12-into-an-arra
354
	 */
359
	 */
355
	static function rangeToList($in = '') {
360
	static function rangeToList($in = '') {
356
		$inSets = explode(',', trim($in, ','));
361
		$inSets = explode(',', trim($in, ','));
357
		$outSets = array();
362
		$outSets = array();
358
 
363
 
359
		foreach($inSets as $inSet) {
364
		foreach($inSets as $inSet) {
360
			list($start,$end) = explode('-', $inSet . '-' . $inSet);
365
			list($start,$end) = explode('-', $inSet . '-' . $inSet);
361
			// ignore les ranges trop importants
366
			// ignore les ranges trop importants
362
			if($start > 10000000 || $end > 10000000 || abs($start-$end) > 10000) continue;
367
			if($start > 10000000 || $end > 10000000 || abs($start-$end) > 10000) continue;
363
			$outSets = array_merge($outSets,range($start,$end));
368
			$outSets = array_merge($outSets,range($start,$end));
364
		}
369
		}
365
		$outSets = array_unique($outSets);
370
		$outSets = array_unique($outSets);
366
		$outSets = array_filter($outSets, 'is_numeric');
371
		$outSets = array_filter($outSets, 'is_numeric');
367
		sort($outSets);
372
		sort($outSets);
368
		return $outSets;
373
		return $outSets;
369
	}
374
	}
370
}
375
}
371
?>
376
?>