Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2403 Rev 2459
Line 19... Line 19...
19
*/
19
*/
Line 20... Line 20...
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';
Line 25... Line 25...
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
Line 55... Line 55...
55
		'format' => 'format',
55
		'format' => 'format',
56
		'colonnes' => 'colonnes',
56
		'colonnes' => 'colonnes',
57
		'transmission' => 'transmission',
57
		'transmission' => 'transmission',
58
		'obsids' => 'obsids',
58
		'obsids' => 'obsids',
59
	);
59
	);
60
	
60
 
61
	private $limite_decoupage_defaut = 9000; 
61
	private $limite_decoupage_defaut = 9000;
62
	
62
 
63
	private $format = 'csv';
63
	private $format = 'csv';
64
	
64
 
65
	public $id_utilisateur = null;
65
	public $id_utilisateur = null;
66
	
66
 
67
	public $export_prive = false;
67
	public $export_prive = false;
Line 68... Line 68...
68
 
68
 
69
	// un cache, initialisé par certaines fonctions de préchargement, à la manière
69
	// un cache, initialisé par certaines fonctions de préchargement, à la manière
70
	// de ce qui est fait par FormateurGroupeColonne
70
	// de ce qui est fait par FormateurGroupeColonne
71
	static $cache = Array();
71
	static $cache = Array();
72
	
72
 
73
	public function getRessource() {
73
	public function getRessource() {
74
		return $this->getElement(array());
74
		return $this->getElement(array());
75
	}
75
	}
76
		
76
 
77
	/**
77
	/**
78
	 * Méthode appelée avec une requête de type GET.
78
	 * Méthode appelée avec une requête de type GET.
79
	 */
79
	 */
80
	public function getElement($params = array()) {
80
	public function getElement($params = array()) {
81
		switch(@strtolower($params[0])) {
81
		switch(@strtolower($params[0])) {
82
		case 'calcul':
82
		case 'calcul':
83
			$this->getCalcul();
83
			$this->getCalcul();
84
			break;
84
			break;
85
				
85
 
86
		case 'export':
86
		case 'export':
87
			$this->getExport();
87
			$this->getExport();
88
			break;
88
			break;
89
		default:
89
		default:
90
			$this->getExport();
90
			$this->getExport();
91
		}
91
		}
92
	}
92
	}
93
	
93
 
94
	private function getCalcul() {
94
	private function getCalcul() {
95
		$criteres = $this->traiterParametresAutorises($_GET);
95
		$criteres = $this->traiterParametresAutorises($_GET);
96
		$criteres['transmission'] = 1;
96
		$criteres['transmission'] = 1;
97
		
97
 
98
		// Définit si l'on exporte les obs privées ainsi que les champs étendus privés
98
		// Définit si l'on exporte les obs privées ainsi que les champs étendus privés
99
		$this->export_prive = $this->doitEtPeutExporterObsPrivees($criteres);
99
		$this->export_prive = $this->doitEtPeutExporterObsPrivees($criteres);
100
		if($this->export_prive) {
100
		if($this->export_prive) {
101
			unset($criteres['transmission']);
101
			unset($criteres['transmission']);
102
			$this->id_utilisateur = $criteres['id_utilisateur'];
102
			$this->id_utilisateur = $criteres['id_utilisateur'];
103
		}
103
		}
104
		$chercheur_observations = new RechercheObservation($this->config);
104
		$chercheur_observations = new RechercheObservation($this->config);
105
		
105
 
106
		$numero_page = isset($criteres['debut']) ? $criteres['debut'] : 0;
106
		$numero_page = isset($criteres['debut']) ? $criteres['debut'] : 0;
107
		$limite = isset($criteres['limite']) ? $criteres['limite'] : 0;
107
		$limite = isset($criteres['limite']) ? $criteres['limite'] : 0;
108
		$colonnes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
108
		$colonnes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
109
		
109
 
110
		unset($criteres['limite']);
110
		unset($criteres['limite']);
111
		unset($criteres['debut']);
111
		unset($criteres['debut']);
112
		unset($criteres['format']);
112
		unset($criteres['format']);
113
		unset($criteres['colonnes']);
113
		unset($criteres['colonnes']);
114
		
114
 
115
		$nb_observations = $chercheur_observations->compterObservations(null, $criteres);
115
		$nb_observations = $chercheur_observations->compterObservations(null, $criteres);
116
		$limite_decoupage = $this->calculerNbLignesMaxParFichier(explode(',', $colonnes));
116
		$limite_decoupage = $this->calculerNbLignesMaxParFichier(explode(',', $colonnes));
117
		
117
 
118
		$url_telechargements = array();
118
		$url_telechargements = array();
119
		$intervalle = 0;
119
		$intervalle = 0;
120
		
120
 
121
		$params_url = $criteres;
121
		$params_url = $criteres;
122
		unset($params_url['transmission']);
122
		unset($params_url['transmission']);
123
		do {
123
		do {
124
			$base_url = $this->config['settings']['baseURLAbsolu'].'CelWidgetExport/export';
124
			$base_url = $this->config['settings']['baseURLAbsolu'].'CelWidgetExport/export';
Line 127... Line 127...
127
			$url_telechargement_fichier = $base_url;
127
			$url_telechargement_fichier = $base_url;
128
			$url_telechargements[] = $base_url.'?'.http_build_query($params_url).'&format='.$this->format.'&colonnes='.$colonnes;
128
			$url_telechargements[] = $base_url.'?'.http_build_query($params_url).'&format='.$this->format.'&colonnes='.$colonnes;
129
			$intervalle += $limite_decoupage;
129
			$intervalle += $limite_decoupage;
130
			$nb_observations -= $limite_decoupage;
130
			$nb_observations -= $limite_decoupage;
131
		} while($nb_observations > 0);
131
		} while($nb_observations > 0);
132
		
132
 
133
		$this->envoyerJson($url_telechargements);
133
		$this->envoyerJson($url_telechargements);
134
	}
134
	}
135
	
135
 
136
	private function calculerNbLignesMaxParFichier($colonnes) {
136
	private function calculerNbLignesMaxParFichier($colonnes) {
137
		$limite = $this->limite_decoupage_defaut;		
137
		$limite = $this->limite_decoupage_defaut;
138
				
138
 
139
		switch($this->format) {
139
		switch($this->format) {
140
			case 'csv':
140
			case 'csv':
141
				$limite = 20000;
141
				$limite = 20000;
142
				break;
142
				break;
143
			case 'xls':
143
			case 'xls':
Line 148... Line 148...
148
				break;
148
				break;
149
		}
149
		}
Line 150... Line 150...
150
 
150
 
151
		return $limite;
151
		return $limite;
152
	}
152
	}
153
	
153
 
154
	private function getExport() {
154
	private function getExport() {
155
		$criteres = $this->traiterParametresAutorises($_GET);
155
		$criteres = $this->traiterParametresAutorises($_GET);
156
		// ne pas faire de super-requête en cas d'absence de paramètres
156
		// ne pas faire de super-requête en cas d'absence de paramètres
157
		// par exemple "format", au minimum, devrait être défini
157
		// par exemple "format", au minimum, devrait être défini
Line 164... Line 164...
164
		if($this->export_prive) {
164
		if($this->export_prive) {
165
			unset($criteres['transmission']);
165
			unset($criteres['transmission']);
166
			$this->id_utilisateur = $criteres['ce_utilisateur'];
166
			$this->id_utilisateur = $criteres['ce_utilisateur'];
167
		}
167
		}
168
		$chercheur_observations = new RechercheObservation($this->config);
168
		$chercheur_observations = new RechercheObservation($this->config);
169
		
169
 
170
		$debut = isset($criteres['debut']) ? intval($criteres['debut']) : 0;
170
		$debut = isset($criteres['debut']) ? intval($criteres['debut']) : 0;
171
		$limite = isset($criteres['limite']) ? intval($criteres['limite']) : 0;
171
		$limite = isset($criteres['limite']) ? intval($criteres['limite']) : 0;
172
		$groupes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
172
		$groupes = @FormateurGroupeColonne::colGroupsValidation($criteres['colonnes']);
173
		$groupes .= ',auteur';
173
		$groupes .= ',auteur';
Line 174... Line 174...
174
 
174
 
Line 175... Line 175...
175
		if(!$groupes) die('erreur: Ne peut identifier les groupes de champs demandés.');
175
		if(!$groupes) die('erreur: Ne peut identifier les groupes de champs demandés.');
176
 
176
 
177
 
177
 
178
		if($criteres['obsids']) $criteres['sql_brut'] = sprintf('id_observation IN (%s)',
178
		if($criteres['obsids']) $criteres['sql_brut'] = sprintf('id_observation IN (%s)',
179
																implode(',', $criteres['obsids']));
179
																implode(',', $criteres['obsids']));
180
		
180
 
181
		unset($criteres['limite']);
181
		unset($criteres['limite']);
182
		unset($criteres['debut']);
182
		unset($criteres['debut']);
Line 223... Line 223...
223
			$this->envoyerXls($xls);
223
			$this->envoyerXls($xls);
224
			break;
224
			break;
225
		default:
225
		default:
226
		}
226
		}
227
	}
227
	}
228
	
228
 
229
	protected function traiterParametresAutorises(Array $parametres) {
229
	protected function traiterParametresAutorises(Array $parametres) {
230
		$parametres_traites = array();
230
		$parametres_traites = array();
231
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
231
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
232
		foreach($parametres as $cle => $valeur) {
232
		foreach($parametres as $cle => $valeur) {
233
			if(is_string($valeur) && !trim($valeur)) continue;
233
			if(is_string($valeur) && !trim($valeur)) continue;
Line 236... Line 236...
236
			}
236
			}
237
		}
237
		}
238
		$parametres_traites['obsids'] = @self::traiterObsIds($parametres['obsids']);
238
		$parametres_traites['obsids'] = @self::traiterObsIds($parametres['obsids']);
239
		return $parametres_traites;
239
		return $parametres_traites;
240
	}
240
	}
241
	
241
 
242
	private function envoyerCsv($csv) {
242
	private function envoyerCsv($csv) {
243
		header('Content-Type: text/csv; charset=UTF-8');
243
		header('Content-Type: text/csv; charset=UTF-8');
244
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
244
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
245
		echo $csv;
245
		echo $csv;
246
		exit;
246
		exit;
247
	}
247
	}
248
	
248
 
249
	private function envoyerXls($workbook) {
249
	private function envoyerXls($workbook) {
250
		$workbook->close();
250
		$workbook->close();
251
		exit;
251
		exit;
252
	}
252
	}
253
	
253
 
254
	private function convertirEnCsv(&$data, $colonnes) {
254
	private function convertirEnCsv(&$data, $colonnes) {
255
		$chemin_temp = "php://temp";
255
		$chemin_temp = "php://temp";
256
		$outstream = fopen($chemin_temp, 'r+');
256
		$outstream = fopen($chemin_temp, 'r+');
Line 257... Line 257...
257
 
257
 
Line 264... Line 264...
264
		if(isset($colonnes['etendu'])) {
264
		if(isset($colonnes['etendu'])) {
265
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
265
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
266
		}
266
		}
Line 267... Line 267...
267
 
267
 
268
		// header
268
		// header
269
		fputcsv($outstream, $intitule_champs, ',', '"');			
269
		fputcsv($outstream, $intitule_champs, ',', '"');
270
		// lignes
270
		// lignes
271
		foreach($data as &$ligne) {
271
		foreach($data as &$ligne) {
272
			$ligne = self::filtrerDonneesSensibles($ligne);
272
			$ligne = self::filtrerDonneesSensibles($ligne);
273
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
273
			$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
Line 276... Line 276...
276
		rewind($outstream);
276
		rewind($outstream);
277
		$csv = stream_get_contents($outstream);
277
		$csv = stream_get_contents($outstream);
278
		fclose($outstream);
278
		fclose($outstream);
279
		return $csv;
279
		return $csv;
280
	}
280
	}
281
	
281
 
282
	private function convertirEnXls(&$data, $colonnes) {
282
	private function convertirEnXls(&$data, $colonnes) {
283
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
283
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
284
		$this->extendSpreadsheetProductor->initSpreadsheet();
284
		$this->extendSpreadsheetProductor->initSpreadsheet();
285
		
285
 
286
		$workbook = new Spreadsheet_Excel_Writer();
286
		$workbook = new Spreadsheet_Excel_Writer();
287
		// avant la définition du titre de la worksheet !
287
		// avant la définition du titre de la worksheet !
288
		$workbook->setVersion(8);
288
		$workbook->setVersion(8);
Line 289... Line 289...
289
 
289
 
290
		$worksheet = $workbook->addWorksheet('Liste');
290
		$worksheet = $workbook->addWorksheet('Liste');
291
		$workbook->setTempDir($this->config['cel']['chemin_stockage_temp']);
291
		$workbook->setTempDir($this->config['cel']['chemin_stockage_temp']);
292
		$worksheet->setInputEncoding('utf-8');
292
		$worksheet->setInputEncoding('utf-8');
293
		$workbook->send($this->nom_fichier_export.'.xls');
293
		$workbook->send($this->nom_fichier_export.'.xls');
294
		
294
 
Line 295... Line 295...
295
		$nb_lignes = 1;
295
		$nb_lignes = 1;
296
 
296
 
297
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
297
		$intitule_champs = array_merge(FormateurGroupeColonne::getIntitulesColonnes($colonnes));
Line 304... Line 304...
304
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
304
			$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
305
		}
305
		}
Line 306... Line 306...
306
 
306
 
307
		// header
307
		// header
308
		$indice = 0;
308
		$indice = 0;
309
		foreach ($intitule_champs as &$intitule) {	
309
		foreach ($intitule_champs as &$intitule) {
310
			$worksheet->write(0,$indice++,$intitule);
310
			$worksheet->write(0,$indice++,$intitule);
Line 311... Line 311...
311
		}
311
		}
312
 
312
 
Line 319... Line 319...
319
			}
319
			}
320
			$nb_lignes++;
320
			$nb_lignes++;
321
		}
321
		}
322
		return $workbook;
322
		return $workbook;
323
	}
323
	}
324
	
324
 
325
	private function convertirEnPdf(&$observations) {
325
	private function convertirEnPdf(&$observations) {
326
		if(count($observations) > 300) die('erreur: trop de données');
326
		if(count($observations) > 300) die('erreur: trop de données');
327
		//require_once('GenerateurPDF.php');
327
		//require_once('GenerateurPDF.php');
328
		$pdf = new GenerateurPDF();
328
		$pdf = new GenerateurPDF();
329
		$pdf->export($observations);
329
		$pdf->export($observations);
330
		return $pdf;
330
		return $pdf;
331
	}
331
	}
332
	
332
 
333
	static function filtrerDonneesSensibles($ligne) {
333
	static function filtrerDonneesSensibles($ligne) {
334
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
334
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
335
			$ligne['latitude'] = '';
335
			$ligne['latitude'] = '';
336
			$ligne['longitude'] = '';
336
			$ligne['longitude'] = '';
337
		}
337
		}
338
		return $ligne;
338
		return $ligne;
339
	}
339
	}
340
	
340
 
341
	private function doitEtPeutExporterObsPrivees($criteres) {
341
	private function doitEtPeutExporterObsPrivees($criteres) {
342
		return isset($criteres['ce_utilisateur']) && 
342
		return isset($criteres['ce_utilisateur']) &&
343
					$this->peutExporterObsPrivees($criteres['ce_utilisateur']);
343
					$this->peutExporterObsPrivees($criteres['ce_utilisateur']);
344
	}
344
	}
345
	
345
 
346
	private function peutExporterObsPrivees($id_utilisateur) {
346
	private function peutExporterObsPrivees($id_utilisateur) {
347
		$gestion_utilisateur = new User($this->config);
347
		$gestion_utilisateur = new User($this->config);
348
		$utilisateur = $gestion_utilisateur->obtenirIdentiteConnectee();
348
		$utilisateur = $gestion_utilisateur->obtenirIdentiteConnectee();
349
		return ! empty($utilisateur['id_utilisateur']) && $id_utilisateur == $utilisateur['id_utilisateur'];
349
		return ! empty($utilisateur['id_utilisateur']) && $id_utilisateur == $utilisateur['id_utilisateur'];
350
	}
350
	}