Subversion Repositories eFlore/Applications.cel

Rev

Rev 2172 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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