Subversion Repositories eFlore/Applications.cel

Rev

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

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