Subversion Repositories eFlore/Applications.cel

Rev

Rev 3603 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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