Subversion Repositories eFlore/Applications.cel

Rev

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

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