Subversion Repositories eFlore/Applications.cel

Rev

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

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