Subversion Repositories eFlore/Applications.cel

Rev

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

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