Subversion Repositories eFlore/Applications.cel

Rev

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

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