Subversion Repositories eFlore/Applications.cel

Rev

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

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