Subversion Repositories eFlore/Applications.cel

Rev

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

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