Subversion Repositories eFlore/Applications.cel

Rev

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

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