Subversion Repositories eFlore/Applications.cel

Rev

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

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