Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2280 Rev 2403
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
		'courriel_utilisateur' => 'courriel_utilisateur',
35
		'courriel_utilisateur' => 'courriel_utilisateur',
36
		'commune' => 'zone_geo',
36
		'commune' => 'zone_geo',
37
		'zone_geo' => 'zone_geo',
37
		'zone_geo' => 'zone_geo',
38
		'dept' => 'departement',
38
		'dept' => 'departement',
39
		'departement' => 'departement',
39
		'departement' => 'departement',
40
		'lieudit' => 'lieudit',
40
		'lieudit' => 'lieudit',
41
		'station' => 'station',
41
		'station' => 'station',
42
		'projet' => 'mots_cles',
42
		'projet' => 'mots_cles',
43
		'num_taxon' => 'nt',
43
		'num_taxon' => 'nt',
44
		'date_debut' => 'date_debut',
44
		'date_debut' => 'date_debut',
45
		'date_fin' => 'date_fin',
45
		'date_fin' => 'date_fin',
46
		'taxon' => 'taxon',
46
		'taxon' => 'taxon',
47
		'annee' => 'annee',
47
		'annee' => 'annee',
48
		'mois' => 'mois',
48
		'mois' => 'mois',
49
		'jour' => 'jour',
49
		'jour' => 'jour',
50
		'recherche' => 'recherche',
50
		'recherche' => 'recherche',
51
		'id_mots_cles' => 'id_mots_cles',
51
		'id_mots_cles' => 'id_mots_cles',
52
		'mots_cles' => 'mots_cles',
52
		'mots_cles' => 'mots_cles',
53
		'debut' => 'debut',
53
		'debut' => 'debut',
54
		'limite' => 'limite',
54
		'limite' => 'limite',
55
		'format' => 'format',
55
		'format' => 'format',
56
		'colonnes' => 'colonnes',
56
		'colonnes' => 'colonnes',
57
		'transmission' => 'transmission',
57
		'transmission' => 'transmission',
58
		'obsids' => 'obsids',
58
		'obsids' => 'obsids',
59
	);
59
	);
60
	
60
	
61
	private $limite_decoupage_defaut = 9000; 
61
	private $limite_decoupage_defaut = 9000; 
62
	
62
	
63
	private $format = 'csv';
63
	private $format = 'csv';
64
	
64
	
65
	public $id_utilisateur = null;
65
	public $id_utilisateur = null;
-
 
66
	
-
 
67
	public $export_prive = false;
66
 
68
 
67
	// un cache, initialisé par certaines fonctions de préchargement, à la manière
69
	// un cache, initialisé par certaines fonctions de préchargement, à la manière
68
	// de ce qui est fait par FormateurGroupeColonne
70
	// de ce qui est fait par FormateurGroupeColonne
69
	static $cache = Array();
71
	static $cache = Array();
70
	
72
	
71
	public function getRessource() {
73
	public function getRessource() {
72
		return $this->getElement(array());
74
		return $this->getElement(array());
73
	}
75
	}
74
		
76
		
75
	/**
77
	/**
76
	 * Méthode appelée avec une requête de type GET.
78
	 * Méthode appelée avec une requête de type GET.
77
	 */
79
	 */
78
	public function getElement($params = array()) {
80
	public function getElement($params = array()) {
79
		switch(@strtolower($params[0])) {
81
		switch(@strtolower($params[0])) {
80
		case 'calcul':
82
		case 'calcul':
81
			$this->getCalcul();
83
			$this->getCalcul();
82
			break;
84
			break;
83
				
85
				
84
		case 'export':
86
		case 'export':
85
			$this->getExport();
87
			$this->getExport();
86
			break;
88
			break;
87
		default:
89
		default:
88
			$this->getExport();
90
			$this->getExport();
89
		}
91
		}
90
	}
92
	}
91
	
93
	
92
	private function getCalcul() {
94
	private function getCalcul() {
93
		$criteres = $this->traiterParametresAutorises($_GET);
95
		$criteres = $this->traiterParametresAutorises($_GET);
94
 
-
 
95
		$criteres['transmission'] = 1;
96
		$criteres['transmission'] = 1;
-
 
97
		
-
 
98
		// Définit si l'on exporte les obs privées ainsi que les champs étendus privés
96
		if($this->doitEtPeutExporterObsPrivees($criteres)) {
99
		$this->export_prive = $this->doitEtPeutExporterObsPrivees($criteres);
-
 
100
		if($this->export_prive) {
97
			unset($criteres['transmission']);
101
			unset($criteres['transmission']);
98
			$this->id_utilisateur = $criteres['id_utilisateur'];
102
			$this->id_utilisateur = $criteres['id_utilisateur'];
99
		}
103
		}
100
		$chercheur_observations = new RechercheObservation($this->config);
104
		$chercheur_observations = new RechercheObservation($this->config);
101
		
105
		
102
		$numero_page = isset($criteres['debut']) ? $criteres['debut'] : 0;
106
		$numero_page = isset($criteres['debut']) ? $criteres['debut'] : 0;
103
		$limite = isset($criteres['limite']) ? $criteres['limite'] : 0;
107
		$limite = isset($criteres['limite']) ? $criteres['limite'] : 0;
104
		$colonnes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
108
		$colonnes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
105
		
109
		
106
		unset($criteres['limite']);
110
		unset($criteres['limite']);
107
		unset($criteres['debut']);
111
		unset($criteres['debut']);
108
		unset($criteres['format']);
112
		unset($criteres['format']);
109
		unset($criteres['colonnes']);
113
		unset($criteres['colonnes']);
110
		
114
		
111
		$nb_observations = $chercheur_observations->compterObservations(null, $criteres);
115
		$nb_observations = $chercheur_observations->compterObservations(null, $criteres);
112
		$limite_decoupage = $this->calculerNbLignesMaxParFichier(explode(',', $colonnes));
116
		$limite_decoupage = $this->calculerNbLignesMaxParFichier(explode(',', $colonnes));
113
		
117
		
114
		$url_telechargements = array();
118
		$url_telechargements = array();
115
		$intervalle = 0;
119
		$intervalle = 0;
116
		
120
		
117
		$params_url = $criteres;
121
		$params_url = $criteres;
118
		unset($params_url['transmission']);
122
		unset($params_url['transmission']);
119
		do {
123
		do {
120
			$base_url = $this->config['settings']['baseURLAbsolu'].'CelWidgetExport/export';
124
			$base_url = $this->config['settings']['baseURLAbsolu'].'CelWidgetExport/export';
121
			$params_url['debut'] = $intervalle;
125
			$params_url['debut'] = $intervalle;
122
			$params_url['limite'] = $limite_decoupage;
126
			$params_url['limite'] = $limite_decoupage;
123
			$url_telechargement_fichier = $base_url;
127
			$url_telechargement_fichier = $base_url;
124
			$url_telechargements[] = $base_url.'?'.http_build_query($params_url).'&format='.$this->format.'&colonnes='.$colonnes;
128
			$url_telechargements[] = $base_url.'?'.http_build_query($params_url).'&format='.$this->format.'&colonnes='.$colonnes;
125
			$intervalle += $limite_decoupage;
129
			$intervalle += $limite_decoupage;
126
			$nb_observations -= $limite_decoupage;
130
			$nb_observations -= $limite_decoupage;
127
		} while($nb_observations > 0);
131
		} while($nb_observations > 0);
128
		
132
		
129
		$this->envoyerJson($url_telechargements);
133
		$this->envoyerJson($url_telechargements);
130
	}
134
	}
131
	
135
	
132
	private function calculerNbLignesMaxParFichier($colonnes) {
136
	private function calculerNbLignesMaxParFichier($colonnes) {
133
		$limite = $this->limite_decoupage_defaut;		
137
		$limite = $this->limite_decoupage_defaut;		
134
				
138
				
135
		switch($this->format) {
139
		switch($this->format) {
136
			case 'csv':
140
			case 'csv':
137
				$limite = 20000;
141
				$limite = 20000;
138
				break;
142
				break;
139
			case 'xls':
143
			case 'xls':
140
				$limite = 8000;
144
				$limite = 8000;
141
				break;
145
				break;
142
			case 'pdf':
146
			case 'pdf':
143
				$limite = 300;
147
				$limite = 300;
144
				break;
148
				break;
145
		}
149
		}
146
 
150
 
147
		return $limite;
151
		return $limite;
148
	}
152
	}
149
	
153
	
150
	private function getExport() {
154
	private function getExport() {
151
		$criteres = $this->traiterParametresAutorises($_GET);
155
		$criteres = $this->traiterParametresAutorises($_GET);
152
		// ne pas faire de super-requête en cas d'absence de paramètres
156
		// ne pas faire de super-requête en cas d'absence de paramètres
153
		// par exemple "format", au minimum, devrait être défini
157
		// par exemple "format", au minimum, devrait être défini
154
		if(!$criteres) die('erreur: pas de paramètre reçu');
158
		if(!$criteres) die('erreur: pas de paramètre reçu');
155
		if(!in_array($this->format, array('pdf','csv','xls'))) die('erreur: format invalide');
159
		if(!in_array($this->format, array('pdf','csv','xls'))) die('erreur: format invalide');
156
 
160
 
157
		$criteres['transmission'] = 1;
161
		$criteres['transmission'] = 1;
-
 
162
		// Définit si l'on exporte les obs privées ainsi que les champs étendus privés
158
		if($this->doitEtPeutExporterObsPrivees($criteres)) {
163
		$this->export_prive = $this->doitEtPeutExporterObsPrivees($criteres);
-
 
164
		if($this->export_prive) {
159
			unset($criteres['transmission']);
165
			unset($criteres['transmission']);
160
			$this->id_utilisateur = $criteres['ce_utilisateur'];
166
			$this->id_utilisateur = $criteres['ce_utilisateur'];
161
		}
167
		}
162
		$chercheur_observations = new RechercheObservation($this->config);
168
		$chercheur_observations = new RechercheObservation($this->config);
163
		
169
		
164
		$debut = isset($criteres['debut']) ? intval($criteres['debut']) : 0;
170
		$debut = isset($criteres['debut']) ? intval($criteres['debut']) : 0;
165
		$limite = isset($criteres['limite']) ? intval($criteres['limite']) : 0;
171
		$limite = isset($criteres['limite']) ? intval($criteres['limite']) : 0;
166
		$groupes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
172
		$groupes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
167
		$groupes .= ',auteur';
173
		$groupes .= ',auteur';
168
 
174
 
169
		if(!$groupes) die('erreur: Ne peut identifier les groupes de champs demandés.');
175
		if(!$groupes) die('erreur: Ne peut identifier les groupes de champs demandés.');
170
 
176
 
171
 
177
 
172
		if($criteres['obsids']) $criteres['sql_brut'] = sprintf('id_observation IN (%s)',
178
		if($criteres['obsids']) $criteres['sql_brut'] = sprintf('id_observation IN (%s)',
173
																implode(',', $criteres['obsids']));
179
																implode(',', $criteres['obsids']));
174
		
180
		
175
		unset($criteres['limite']);
181
		unset($criteres['limite']);
176
		unset($criteres['debut']);
182
		unset($criteres['debut']);
177
		unset($criteres['format']);
183
		unset($criteres['format']);
178
		unset($criteres['colonnes']);
184
		unset($criteres['colonnes']);
179
		unset($criteres['obsids']);
185
		unset($criteres['obsids']);
180
 
186
 
181
		$observations = $chercheur_observations->rechercherObservations(null, $criteres, $debut, $limite, TRUE)->get();
187
		$observations = $chercheur_observations->rechercherObservations(null, $criteres, $debut, $limite, TRUE)->get();
182
		$ids = array();
188
		$ids = array();
183
		foreach($observations as &$obs) {
189
		foreach($observations as &$obs) {
184
			$ids[] = $obs['id_observation'];
190
			$ids[] = $obs['id_observation'];
185
		}
191
		}
186
 
192
 
187
		if($this->format == 'pdf') {
193
		if($this->format == 'pdf') {
188
			$pdf = $this->convertirEnPdf($observations);
194
			$pdf = $this->convertirEnPdf($observations);
189
			$pdf->pdf->Output('etiquettes.pdf', 'I');
195
			$pdf->pdf->Output('etiquettes.pdf', 'I');
190
			exit;
196
			exit;
191
		}
197
		}
192
 
198
 
193
		// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
199
		// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
194
 
200
 
195
		// Obtention des colonnes correspondantes aux groupes de champs
201
		// Obtention des colonnes correspondantes aux groupes de champs
196
		$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
202
		$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
197
 
203
 
198
		/*
204
		/*
199
		  Champs étendus et noms communs, si demandés.
205
		  Champs étendus et noms communs, si demandés.
200
		  * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
206
		  * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
201
		  qu'il initialise et utilise en interne sans qu'un passage par paramètre dans le contexte de CelWidgetExport
207
		  qu'il initialise et utilise en interne sans qu'un passage par paramètre dans le contexte de CelWidgetExport
202
		  ne soit nécessaire.
208
		  ne soit nécessaire.
203
		  * Pour les champs étendus, c'est CelWidgetExport::$cache qui est utilisé, aussi bien pour les en-têtes que
209
		  * Pour les champs étendus, c'est CelWidgetExport::$cache qui est utilisé, aussi bien pour les en-têtes que
204
		  pour les données préchargées, cf self::traiterLigneEtendue()
210
		  pour les données préchargées, cf self::traiterLigneEtendue()
205
		*/
211
		*/
206
		self::$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
212
		self::$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
207
 
213
 
208
    	// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
214
    	// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
209
    	// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
215
    	// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
210
		switch($this->format) {
216
		switch($this->format) {
211
		case 'csv':
217
		case 'csv':
212
			$csv = $this->convertirEnCsv($observations, $colonnes);
218
			$csv = $this->convertirEnCsv($observations, $colonnes);
213
			$this->envoyerCsv($csv);
219
			$this->envoyerCsv($csv);
214
			break;
220
			break;
215
		case 'xls':
221
		case 'xls':
216
			$xls = $this->convertirEnXls($observations, $colonnes);
222
			$xls = $this->convertirEnXls($observations, $colonnes);
217
			$this->envoyerXls($xls);
223
			$this->envoyerXls($xls);
218
			break;
224
			break;
219
		default:
225
		default:
220
		}
226
		}
221
	}
227
	}
222
	
228
	
223
	protected function traiterParametresAutorises(Array $parametres) {
229
	protected function traiterParametresAutorises(Array $parametres) {
224
		$parametres_traites = array();
230
		$parametres_traites = array();
225
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
231
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
226
		foreach($parametres as $cle => $valeur) {
232
		foreach($parametres as $cle => $valeur) {
227
			if(is_string($valeur) && !trim($valeur)) continue;
233
			if(is_string($valeur) && !trim($valeur)) continue;
228
			if(isset($this->parametres_autorises[$cle])) {
234
			if(isset($this->parametres_autorises[$cle])) {
229
				$parametres_traites[$this->parametres_autorises[$cle]] = $valeur;
235
				$parametres_traites[$this->parametres_autorises[$cle]] = $valeur;
230
			}
236
			}
231
		}
237
		}
232
		$parametres_traites['obsids'] = @self::traiterObsIds($parametres['obsids']);
238
		$parametres_traites['obsids'] = @self::traiterObsIds($parametres['obsids']);
233
		return $parametres_traites;
239
		return $parametres_traites;
234
	}
240
	}
235
	
241
	
236
	private function envoyerCsv($csv) {
242
	private function envoyerCsv($csv) {
237
		header('Content-Type: text/csv; charset=UTF-8');
243
		header('Content-Type: text/csv; charset=UTF-8');
238
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
244
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
239
		echo $csv;
245
		echo $csv;
240
		exit;
246
		exit;
241
	}
247
	}
242
	
248
	
243
	private function envoyerXls($workbook) {
249
	private function envoyerXls($workbook) {
244
		$workbook->close();
250
		$workbook->close();
245
		exit;
251
		exit;
246
	}
252
	}
247
	
253
	
248
	private function convertirEnCsv(&$data, $colonnes) {
254
	private function convertirEnCsv(&$data, $colonnes) {
249
		$chemin_temp = "php://temp";
255
		$chemin_temp = "php://temp";
250
		$outstream = fopen($chemin_temp, 'r+');
256
		$outstream = fopen($chemin_temp, 'r+');
251
 
257
 
252
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
258
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
253
		// en premier car utilisé génériquement dans getLigneObservation()
259
		// en premier car utilisé génériquement dans getLigneObservation()
254
		if(isset($colonnes['baseflor'])) {
260
		if(isset($colonnes['baseflor'])) {
255
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
261
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
256
		}
262
		}
257
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
263
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
258
		if(isset($colonnes['etendu'])) {
264
		if(isset($colonnes['etendu'])) {
259
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
265
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
260
		}
266
		}
261
 
267
 
262
		// header
268
		// header
263
		fputcsv($outstream, $intitule_champs, ',', '"');			
269
		fputcsv($outstream, $intitule_champs, ',', '"');			
264
		// lignes
270
		// lignes
265
		foreach($data as &$ligne) {
271
		foreach($data as &$ligne) {
266
			$ligne = self::filtrerDonneesSensibles($ligne);
272
			$ligne = self::filtrerDonneesSensibles($ligne);
267
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
273
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
268
			fputcsv($outstream, $ligne, ',', '"');
274
			fputcsv($outstream, $ligne, ',', '"');
269
		}
275
		}
270
		rewind($outstream);
276
		rewind($outstream);
271
		$csv = stream_get_contents($outstream);
277
		$csv = stream_get_contents($outstream);
272
		fclose($outstream);
278
		fclose($outstream);
273
		return $csv;
279
		return $csv;
274
	}
280
	}
275
	
281
	
276
	private function convertirEnXls(&$data, $colonnes) {
282
	private function convertirEnXls(&$data, $colonnes) {
277
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
283
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
278
		$this->extendSpreadsheetProductor->initSpreadsheet();
284
		$this->extendSpreadsheetProductor->initSpreadsheet();
279
		
285
		
280
		$workbook = new Spreadsheet_Excel_Writer();
286
		$workbook = new Spreadsheet_Excel_Writer();
281
		// avant la définition du titre de la worksheet !
287
		// avant la définition du titre de la worksheet !
282
		$workbook->setVersion(8);
288
		$workbook->setVersion(8);
283
 
289
 
284
		$worksheet = $workbook->addWorksheet('Liste');
290
		$worksheet = $workbook->addWorksheet('Liste');
285
		$workbook->setTempDir($this->config['cel']['chemin_stockage_temp']);
291
		$workbook->setTempDir($this->config['cel']['chemin_stockage_temp']);
286
		$worksheet->setInputEncoding('utf-8');
292
		$worksheet->setInputEncoding('utf-8');
287
		$workbook->send($this->nom_fichier_export.'.xls');
293
		$workbook->send($this->nom_fichier_export.'.xls');
288
		
294
		
289
		$nb_lignes = 1;
295
		$nb_lignes = 1;
290
 
296
 
291
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
297
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
292
		// en premier car utilisé génériquement dans getLigneObservation()
298
		// en premier car utilisé génériquement dans getLigneObservation()
293
		if(isset($colonnes['baseflor'])) {
299
		if(isset($colonnes['baseflor'])) {
294
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
300
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
295
		}
301
		}
296
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
302
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
297
		if(isset($colonnes['etendu'])) {
303
		if(isset($colonnes['etendu'])) {
298
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
304
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
299
		}
305
		}
300
 
306
 
301
		// header
307
		// header
302
		$indice = 0;
308
		$indice = 0;
303
		foreach ($intitule_champs as &$intitule) {	
309
		foreach ($intitule_champs as &$intitule) {	
304
			$worksheet->write(0,$indice++,$intitule);
310
			$worksheet->write(0,$indice++,$intitule);
305
		}
311
		}
306
 
312
 
307
		foreach($data as &$ligne) {
313
		foreach($data as &$ligne) {
308
			$ligne = self::filtrerDonneesSensibles($ligne);
314
			$ligne = self::filtrerDonneesSensibles($ligne);
309
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
315
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
310
			$indice = 0;
316
			$indice = 0;
311
			foreach($ligne as &$champ) {
317
			foreach($ligne as &$champ) {
312
				$worksheet->write($nb_lignes,$indice++,$champ);
318
				$worksheet->write($nb_lignes,$indice++,$champ);
313
			}
319
			}
314
			$nb_lignes++;
320
			$nb_lignes++;
315
		}
321
		}
316
		return $workbook;
322
		return $workbook;
317
	}
323
	}
318
	
324
	
319
	private function convertirEnPdf(&$observations) {
325
	private function convertirEnPdf(&$observations) {
320
		if(count($observations) > 300) die('erreur: trop de données');
326
		if(count($observations) > 300) die('erreur: trop de données');
321
		//require_once('GenerateurPDF.php');
327
		//require_once('GenerateurPDF.php');
322
		$pdf = new GenerateurPDF();
328
		$pdf = new GenerateurPDF();
323
		$pdf->export($observations);
329
		$pdf->export($observations);
324
		return $pdf;
330
		return $pdf;
325
	}
331
	}
326
	
332
	
327
	static function filtrerDonneesSensibles($ligne) {
333
	static function filtrerDonneesSensibles($ligne) {
328
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
334
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
329
			$ligne['latitude'] = '';
335
			$ligne['latitude'] = '';
330
			$ligne['longitude'] = '';
336
			$ligne['longitude'] = '';
331
		}
337
		}
332
		return $ligne;
338
		return $ligne;
333
	}
339
	}
334
	
340
	
335
	private function doitEtPeutExporterObsPrivees($criteres) {
341
	private function doitEtPeutExporterObsPrivees($criteres) {
336
		return isset($criteres['ce_utilisateur']) && 
342
		return isset($criteres['ce_utilisateur']) && 
337
					$this->peutExporterObsPrivees($criteres['ce_utilisateur']);
343
					$this->peutExporterObsPrivees($criteres['ce_utilisateur']);
338
	}
344
	}
339
	
345
	
340
	private function peutExporterObsPrivees($id_utilisateur) {
346
	private function peutExporterObsPrivees($id_utilisateur) {
341
		$gestion_utilisateur = new User($this->config);
347
		$gestion_utilisateur = new User($this->config);
342
		$utilisateur = $gestion_utilisateur->obtenirIdentiteConnectee();
348
		$utilisateur = $gestion_utilisateur->obtenirIdentiteConnectee();
343
		return ! empty($utilisateur['id_utilisateur']) && $id_utilisateur == $utilisateur['id_utilisateur'];
349
		return ! empty($utilisateur['id_utilisateur']) && $id_utilisateur == $utilisateur['id_utilisateur'];
344
	}
350
	}
345
 
351
 
346
	static function traiterObsIds($range_param) {
352
	static function traiterObsIds($range_param) {
347
		if (!isset($range_param)) return NULL;
353
		if (!isset($range_param)) return NULL;
348
		// trim() car: `POST http://url<<<"range=*"`
354
		// trim() car: `POST http://url<<<"range=*"`
349
		if (trim($range_param) == '*') return NULL;
355
		if (trim($range_param) == '*') return NULL;
350
		return self::rangeToList(trim($range_param));
356
		return self::rangeToList(trim($range_param));
351
	}
357
	}
352
 
358
 
353
	/*
359
	/*
354
	 * @param $fieldSets: un range, eg: 1-5,8,32,58-101
360
	 * @param $fieldSets: un range, eg: 1-5,8,32,58-101
355
	 * @return un tableau trié, eg: 1,2,3,4,5,8,32,58,...,101
361
	 * @return un tableau trié, eg: 1,2,3,4,5,8,32,58,...,101
356
	 * http://stackoverflow.com/questions/7698664/converting-a-range-or-partial-array-in-the-form-3-6-or-3-6-12-into-an-arra
362
	 * http://stackoverflow.com/questions/7698664/converting-a-range-or-partial-array-in-the-form-3-6-or-3-6-12-into-an-arra
357
	 */
363
	 */
358
	static function rangeToList($in = '') {
364
	static function rangeToList($in = '') {
359
		$inSets = explode(',', trim($in, ','));
365
		$inSets = explode(',', trim($in, ','));
360
		$outSets = array();
366
		$outSets = array();
361
 
367
 
362
		foreach($inSets as $inSet) {
368
		foreach($inSets as $inSet) {
363
			list($start,$end) = explode('-', $inSet . '-' . $inSet);
369
			list($start,$end) = explode('-', $inSet . '-' . $inSet);
364
			// ignore les ranges trop importants
370
			// ignore les ranges trop importants
365
			if($start > 10000000 || $end > 10000000 || abs($start-$end) > 10000) continue;
371
			if($start > 10000000 || $end > 10000000 || abs($start-$end) > 10000) continue;
366
			$outSets = array_merge($outSets,range($start,$end));
372
			$outSets = array_merge($outSets,range($start,$end));
367
		}
373
		}
368
		$outSets = array_unique($outSets);
374
		$outSets = array_unique($outSets);
369
		$outSets = array_filter($outSets, 'is_numeric');
375
		$outSets = array_filter($outSets, 'is_numeric');
370
		sort($outSets);
376
		sort($outSets);
371
		return $outSets;
377
		return $outSets;
372
	}
378
	}
373
}
379
}
374
?>
380
?>