Subversion Repositories eFlore/Applications.cel

Rev

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

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