Subversion Repositories eFlore/Applications.cel

Rev

Rev 1714 | Rev 1716 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1714 Rev 1715
Line 60... Line 60...
60
	private $limite_decoupage_defaut = 9000; 
60
	private $limite_decoupage_defaut = 9000; 
Line 61... Line 61...
61
	
61
	
Line 62... Line 62...
62
	private $format = 'csv';
62
	private $format = 'csv';
-
 
63
	
-
 
64
	public $id_utilisateur = null;
-
 
65
 
-
 
66
	// un cache, initialisé par certaines fonctions de préchargement, à la manière
Line 63... Line 67...
63
	
67
	// de ce qui est fait par FormateurGroupeColonne
64
	public $id_utilisateur = null;
68
	static $cache = Array();
65
	
69
	
Line 142... Line 146...
142
	
146
	
143
	private function getExport() {
147
	private function getExport() {
144
		$criteres = $this->traiterParametresAutorises($_GET);
148
		$criteres = $this->traiterParametresAutorises($_GET);
145
		// ne pas faire de super-requête en cas d'absence de paramètres
149
		// ne pas faire de super-requête en cas d'absence de paramètres
146
		// par exemple "format", au minimum, devrait être défini
150
		// par exemple "format", au minimum, devrait être défini
-
 
151
		if(!$criteres) die('erreur: pas de paramètre reçu');
Line 147... Line 152...
147
		if(!$criteres) die('pas de paramètre reçu');
152
		if(!in_array($this->format, array('pdf','csv','xls'))) die('erreur: format invalide');
148
 
153
 
149
		$criteres['transmission'] = 1;
154
		$criteres['transmission'] = 1;
150
		if($this->doitEtPeutExporterObsPrivees($criteres)) {
155
		if($this->doitEtPeutExporterObsPrivees($criteres)) {
Line 178... Line 183...
178
			$pdf->pdf->Output('etiquettes.pdf', 'I');
183
			$pdf->pdf->Output('etiquettes.pdf', 'I');
179
			exit;
184
			exit;
180
		}
185
		}
Line 181... Line 186...
181
 
186
 
-
 
187
		// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
182
		// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
188
 
183
		// 0) obtention des colonnes correspondantes aux groupes de champs
189
		// Obtention des colonnes correspondantes aux groupes de champs
Line -... Line 190...
-
 
190
		$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
184
		$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
191
 
185
 
192
		/*
-
 
193
		  Champs étendus et noms communs, si demandés.
186
		// 1) champs étendus, si demandés
194
		  * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
187
		$colonnes_champs_supp_par_obs = $champs_supp_par_obs = array();
195
		  qu'il initialise et utilise en interne sans qu'un passage par paramètre dans le contexte de CelWidgetExport
188
		if(isset($colonnes['etendu'])) {
196
		  ne soit nécessaire.
189
			$gestion_champs_etendus = new GestionChampsEtendus($this->config, 'obs');
-
 
190
			$champs_supp_par_obs = $gestion_champs_etendus->consulterParLots($ids);
197
		  * Pour les champs étendus, c'est CelWidgetExport::$cache qui est utilisé, aussi bien pour les en-têtes que
-
 
198
		  pour les données préchargées, cf self::traiterLigneEtendue()
Line 191... Line -...
191
			$colonnes_champs_supp_par_obs = $gestion_champs_etendus->consulterClesParLots($ids);
-
 
192
		}
-
 
193
 
-
 
194
		// 2) nom communs
-
 
195
		// $cache pourrait être utilisé par les fonctions de colonnes
-
 
196
		// * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
-
 
197
		// qu'il initialise et utilise en interne sans qu'un passage par paramètre ne soit nécessaire
199
		*/
198
		$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
200
		self::$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
199
 
201
 
200
    	// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
202
    	// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
201
    	// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
203
    	// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
202
		switch($this->format) {
204
		switch($this->format) {
203
		case 'csv':
205
		case 'csv':
204
			$csv = $this->convertirEnCsv($observations, $colonnes, $colonnes_champs_supp_par_obs, $champs_supp_par_obs);
206
			$csv = $this->convertirEnCsv($observations, $colonnes);
205
			$this->envoyerCsv($csv);
207
			$this->envoyerCsv($csv);
206
			break;
208
			break;
207
		case 'xls':
209
		case 'xls':
208
			$xls = $this->convertirEnXls($observations, $colonnes, $colonnes_champs_supp_par_obs, $champs_supp_par_obs);
210
			$xls = $this->convertirEnXls($observations, $colonnes);
209
			$this->envoyerXls($xls);
211
			$this->envoyerXls($xls);
210
			break;
212
			break;
Line 235... Line 237...
235
	private function envoyerXls($workbook) {
237
	private function envoyerXls($workbook) {
236
		$workbook->close();
238
		$workbook->close();
237
		exit;
239
		exit;
238
	}
240
	}
Line 239... Line 241...
239
	
241
	
240
	private function convertirEnCsv(&$data, $colonnes, &$colonnes_supplementaires, &$champs_supplementaires = array()) {
242
	private function convertirEnCsv(&$data, $colonnes) {
241
		$chemin_temp = "php://temp";
243
		$chemin_temp = "php://temp";
Line 242... Line 244...
242
		$outstream = fopen($chemin_temp, 'r+');
244
		$outstream = fopen($chemin_temp, 'r+');
243
 
245
 
244
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
246
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
245
		// en premier car utilisé génériquement dans getLigneObservation()
247
		// en premier car utilisé génériquement dans getLigneObservation()
246
		if(isset($colonnes['baseflor'])) {
248
		if(isset($colonnes['baseflor'])) {
247
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
249
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
-
 
250
		}
248
		}
251
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
-
 
252
		if(isset($colonnes['etendu'])) {
Line 249... Line 253...
249
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
253
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
250
		$intitule_champs = array_merge($intitule_champs, array_values($colonnes_supplementaires));
254
		}
251
 
255
 
252
		// header
256
		// header
253
		fputcsv($outstream, $intitule_champs, ',', '"');			
257
		fputcsv($outstream, $intitule_champs, ',', '"');			
254
		// lignes
258
		// lignes
255
		foreach($data as &$ligne) {
259
		foreach($data as &$ligne) {
256
			$id_obs = $ligne['id_observation'];
-
 
257
			$ligne = self::filtrerDonneesSensibles($ligne);
260
			$id_obs = $ligne['id_observation'];
258
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
261
			$ligne = self::filtrerDonneesSensibles($ligne);
259
			$ligne_etendue_aplatie = self::aplatirChampsEtendus($champs_supplementaires[$id_obs]);
262
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
260
			self::traiterLigneEtendue($ligne, $colonnes_supplementaires, $ligne_etendue_aplatie);
263
			self::traiterLigneEtendue($ligne, @self::$cache['etendu']['data'][$id_obs]);
261
			fputcsv($outstream, $ligne, ',', '"');
264
			fputcsv($outstream, $ligne, ',', '"');
262
		}
265
		}
263
		rewind($outstream);
266
		rewind($outstream);
264
		$csv = stream_get_contents($outstream);
267
		$csv = stream_get_contents($outstream);
Line 265... Line 268...
265
		fclose($outstream);
268
		fclose($outstream);
266
		return $csv;
269
		return $csv;
267
	}
270
	}
Line 268... Line 271...
268
	
271
	
269
	private function convertirEnXls(&$data, $colonnes, &$colonnes_supplementaires, &$champs_supplementaires = array()) {		
272
	private function convertirEnXls(&$data, $colonnes) {
Line 284... Line 287...
284
		// en premier car utilisé génériquement dans getLigneObservation()
287
		// en premier car utilisé génériquement dans getLigneObservation()
285
		if(isset($colonnes['baseflor'])) {
288
		if(isset($colonnes['baseflor'])) {
286
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
289
			$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
287
		}
290
		}
288
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
291
		// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
-
 
292
		if(isset($colonnes['etendu'])) {
289
		$intitule_champs = array_merge($intitule_champs, array_values($colonnes_supplementaires));
293
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
-
 
294
		}
Line 290... Line 295...
290
 
295
 
291
		// header
296
		// header
292
		$indice = 0;
297
		$indice = 0;
293
		foreach ($intitule_champs as &$intitule) {	
298
		foreach ($intitule_champs as &$intitule) {	
Line 296... Line 301...
296
 
301
 
297
		foreach($data as &$ligne) {
302
		foreach($data as &$ligne) {
298
			$id_obs = $ligne['id_observation'];
303
			$id_obs = $ligne['id_observation'];
299
			$ligne = self::filtrerDonneesSensibles($ligne);
304
			$ligne = self::filtrerDonneesSensibles($ligne);
300
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
-
 
301
 
-
 
302
			$ligne_etendue_aplatie = self::aplatirChampsEtendus($champs_supplementaires[$id_obs]);
305
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
303
			$ligne_supp = self::traiterLigneEtendue($ligne, $colonnes_supplementaires, $ligne_etendue_aplatie);
306
			self::traiterLigneEtendue($ligne, @self::$cache['etendu']['data'][$id_obs]);
304
			$indice = 0;
307
			$indice = 0;
305
			foreach($ligne as &$champ) {
308
			foreach($ligne as &$champ) {
306
				$worksheet->write($nb_lignes,$indice++,$champ);
309
				$worksheet->write($nb_lignes,$indice++,$champ);
307
			}
310
			}
308
			$nb_lignes++;
311
			$nb_lignes++;
309
		}
312
		}
310
		return $workbook;
313
		return $workbook;
Line 311... Line 314...
311
	}
314
	}
312
	
315
	
313
	private function convertirEnPdf(&$observations) {
316
	private function convertirEnPdf(&$observations) {
314
		if(count($observations) > 300) die('trop de données');
317
		if(count($observations) > 300) die('erreur: trop de données');
315
		//require_once('GenerateurPDF.php');
318
		//require_once('GenerateurPDF.php');
316
		$pdf = new GenerateurPDF();
319
		$pdf = new GenerateurPDF();
317
		$pdf->export($observations);
320
		$pdf->export($observations);
Line 318... Line 321...
318
		return $pdf;
321
		return $pdf;
319
	}
322
	}
320
	
323
	
321
	static function traiterLigneEtendue(&$ligne, &$colonnes_etendues, $ligne_etendue_aplatie) {
324
	static function traiterLigneEtendue(&$ligne, $ligne_etendue_aplatie) {
Line 322... Line 325...
322
		if(! $colonnes_etendues) return;
325
		// si header n'est pas défini, aucune observation ne possède de champ étendu
323
		if(! $ligne_etendue_aplatie) return;
326
		// et nous n'ajoutons ni colonnes, ni valeurs.
Line -... Line 327...
-
 
327
		if(! isset(self::$cache['etendu']['header'])) return;
-
 
328
 
-
 
329
		$ligne_supp = array_fill(0, count(self::$cache['etendu']['header']), '');
-
 
330
		$ligne_etendue_fmt = array();
-
 
331
 
-
 
332
		// si, cependant cette seule observation n'a pas de champs étendus,
-
 
333
		// nous devons rajouter des blancs (notamment dans le cas ou d'autres
-
 
334
		// champs viennent à être ajoutés en aval à l'avenir
-
 
335
		// cf: $fonction_dynamique dans FormateurGroupeColonne::GenColInfo()
324
		$nb_colonnes_supp = count($colonnes_etendues);
336
		if(! $ligne_etendue_aplatie) {
325
 
337
			$ligne = array_merge($ligne, $ligne_supp);
326
		$ligne_supp = array_fill(0, $nb_colonnes_supp, '');
338
			return;
327
		$ligne_etendue_fmt = array();
339
		}
328
 
340
 
329
		foreach($colonnes_etendues as $colonne) {
341
		foreach(self::$cache['etendu']['header'] as $colonne) {
330
			if(!isset($ligne_etendue_aplatie[$colonne])) {
342
			if(!isset($ligne_etendue_aplatie[$colonne])) {
Line -... Line 343...
-
 
343
				$ligne_etendue_fmt[$colonne] = ''; 
331
				$ligne_etendue_fmt[$colonne] = ''; 
344
			} else {
332
			} else {
345
				$ligne_etendue_fmt[$colonne] = $ligne_etendue_aplatie[$colonne];
Line 333... Line -...
333
				$ligne_etendue_fmt[$colonne] = $ligne_etendue_aplatie[$colonne];
-
 
334
			}
-
 
335
		}
-
 
336
 
-
 
337
		$ligne += $ligne_etendue_fmt;
-
 
338
	}
-
 
339
 
-
 
340
	static function aplatirChampsEtendus(&$ligne_champs_etendus) {
-
 
341
		$champs_etendus_fmt = array();
-
 
342
		if(!$ligne_champs_etendus) return $champs_etendus_fmt;
346
			}
343
		foreach($ligne_champs_etendus as $champ) {
347
		}
344
			$champs_etendus_fmt[$champ->cle] = $champ->valeur;
348
 
345
		}
349
		// XXX/ array_merge() ?
346
		return $champs_etendus_fmt;
350
		$ligne += $ligne_etendue_fmt;