Subversion Repositories eFlore/Applications.cel

Rev

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

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