Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1642 Rev 1644
Line 47... Line 47...
47
 
47
 
Line 48... Line 48...
48
class ExportXLS extends Cel  {
48
class ExportXLS extends Cel  {
49
 
49
 
-
 
50
	private $cache = Array();
-
 
51
	private $id_utilisateur = NULL;
Line 50... Line 52...
50
	private $cache = Array();
52
	private $parametres_defaut = array("range" => "*",
51
	private $id_utilisateur = NULL;
53
								"format" => "CSV");
52
 
54
 
53
	function ExportXLS($config) {
55
	function ExportXLS($config) {
-
 
56
		parent::__construct($config);
-
 
57
	}
54
		parent::__construct($config);
58
	
-
 
59
	function getRessource() {
55
	}
60
		return $this->getElement(array());
56
 
61
	}
-
 
62
	
-
 
63
	function getElement($uid) {
57
	/*
64
		$parametres_format = $this->traiterParametresFormat($uid, $_GET);	
58
	 * Process $_POST et $_GET
65
		$filtres = $this->traiterFiltres($_GET);
-
 
66
		$this->export($parametres_format, $filtres);
59
	 * TODO: changer JRest pour pouvoir disposer d'un nom de méthode plus représentatif que "updateXXX"
67
		exit;
60
	 * en POST
68
	}
-
 
69
			
-
 
70
	function traiterParametresFormat($uid, $params) {
-
 
71
		$parametres = $this->parametres_defaut;
-
 
72
		if(isset($params['format'])) {
-
 
73
			if($params['format'] == 'csv') $parametres['format'] = 'CSV';
61
	 */
74
			if($params['format'] == 'xls') $parametres['format'] = 'Excel5';
-
 
75
			if($params['format'] == 'xlsx') $parametres['format'] = 'Excel2007';
-
 
76
		}
-
 
77
		// TODO: $params['part'] pour le multi-part
-
 
78
		$parametres['widget'] = isset($params['widget']) ? $params['widget'] : 'CEL';	
-
 
79
		$parametres['debut'] = isset($params['debut']) ? intval($params['debut']) : 0;
-
 
80
		$parametres['limite'] = isset($params['limite']) ? intval($params['limite']) : 0;
-
 
81
		$parametres['id_utilisateur'] = $this->traiterIdUtilisateur($uid);
-
 
82
		$parametres['groupe_champs'] = null;
-
 
83
		
62
	function updateElement($uid, $pairs) {
84
		return $parametres;
-
 
85
	}
63
		$params = Array('uid' => $uid[0]);
86
	
64
		// TODO: pas de range mais un utilisateur: possible
87
	function traiterIdUtilisateur($uid) {
-
 
88
		$id_utilisateur = null;
65
		if(!isset($_POST['range'])) {
89
		// TODO: controleUtilisateur()
-
 
90
		if(isset($uid[0])) {
-
 
91
			$id_utilisateur = intval($uid[0]);
-
 
92
		}
66
			header('HTTP/1.0 204 No Content');
93
		return $id_utilisateur;
67
			exit;
94
	}
68
		}
95
	
-
 
96
	function traiterFiltres($params) {
-
 
97
		$obs_ids = $this->traiterObsIds($params);
69
		// trim() car: `POST http://url<<<"range=*"`
98
		$filtres = array();
70
		elseif(trim($_POST['range']) == '*') {
99
		if(!$obs_ids || count($obs_ids) == 1 && $obs_ids[0] == '*') {
-
 
100
			unset($filtres['sql_brut']);
71
			$obs_ids = Array('*');
101
		}
72
		}
102
		else {
-
 
103
			$filtres = Array('sql_brut' =>
-
 
104
			sprintf('id_observation IN (%s)', implode(',', $obs_ids)));
-
 
105
		}
73
		else {
106
		return $filtres;
-
 
107
	}
74
			$obs_ids = self::rangeToList(trim($_POST['range']));
108
	
75
		}
109
	
76
 
110
	function traiterObsIds($params) {
77
		$params['format'] = 'CSV';
-
 
78
		if($_POST['format'] == 'xls') $params['format'] = 'Excel5';
111
		$obs_ids = Array('*');
79
		if($_POST['format'] == 'xlsx') $params['format'] = 'Excel2007';
112
		if (isset($params['range']) && trim($params['range']) != '*') {
-
 
113
			// trim() car: `POST http://url<<<"range=*"`
80
 
114
			$obs_ids = self::rangeToList(trim($params['range']));
Line 81... Line 115...
81
		$this->export($obs_ids, NULL, $params);
115
		}
82
		exit;
116
		return $obs_ids;
83
	}
117
	}
84
 
118
 
85
	/*
119
	/*
86
	 * $param: Tableau associatif, indexes supportés:
120
	 * $param: Tableau associatif, indexes supportés:
87
	 * 		   - widget: le nom du widget d'origine (utilisé pour les méta-données du tableur)
-
 
88
	 *
-
 
89
	 */
121
	 * 		   - widget: le nom du widget d'origine (utilisé pour les méta-données du tableur)
Line 90... Line -...
90
	function export(Array $obs_ids, String $fieldSets = NULL, Array $params = Array()) {
-
 
91
		$colonnes = self::nom_d_ensemble_vers_liste_de_colonnes($fieldSets);
-
 
92
		// $colonne_abbrev = array_keys($colonnes);
-
 
93
		$chercheur_observations = new RechercheObservation($this->config);
-
 
94
 
-
 
95
		$objPHPExcel = new PHPExcel();
-
 
96
 
-
 
97
		// TODO: $params['part'] pour le multi-part
-
 
98
		$params['widget'] = isset($params['widget']) ? $params['widget'] : 'CEL';
-
 
99
		// TODO: controleUtilisateur()
-
 
100
		if(! $params['uid']) { // || ! $this->controleUtilisateur($params['uid'])) {
-
 
101
			$params['uid'] = NULL;
-
 
102
		}
-
 
103
		if($params['uid']) $this->id_utilisateur = intval($params['uid']);
-
 
104
 
-
 
105
		$criteres = Array();
-
 
106
		if(! $obs_ids || count($obs_ids) == 1 && $obs_ids[0] == '*') {
-
 
107
			unset($criteres['raw']);
-
 
108
		}
-
 
109
		else {
-
 
110
			$criteres = Array('raw' =>
-
 
111
							  sprintf('id_observation IN (%s)', implode(',', $obs_ids)));
122
	 *
112
		}
123
	 */
113
 
124
	function export(Array $parametres_format = Array(),Array $filtres = array()) {
114
		$criteres['debut'] = isset($_GET['debut']) ? intval($_GET['debut']) : 0;
-
 
115
		$criteres['limite'] = isset($_GET['limite']) ? intval($_GET['limite']) : 0;
125
		$chercheur_observations = new RechercheObservation($this->config);
116
		$observations = $chercheur_observations
126
 
117
			->rechercherObservations($params['uid'], $criteres, $criteres['debut'], $criteres['limite'], TRUE)
127
		$observations = $chercheur_observations
118
			->get();
128
			->rechercherObservations($parametres_format['id_utilisateur'], $filtres, $parametres_format['debut'], $parametres_format['limite'], TRUE)
119
			
129
			->get();
120
		// debug //echo ($chercheur_observations->requete_selection_observations);
130
		// debug //echo ($chercheur_observations->requete_selection_observations);
-
 
131
		// XXX: malheureusement l'instance de JRest n'est pas accessible ici
-
 
132
		if(!$observations) {
-
 
133
			header('HTTP/1.0 204 No Content');
-
 
134
			exit;
-
 
135
		}
-
 
136
		
-
 
137
		$colonnes = self::nomEnsembleVersListeColonnes($parametres_format['groupe_champs']);
-
 
138
		// $colonne_abbrev = array_keys($colonnes);
Line 121... Line -...
121
		// XXX: malheureusement l'instance de JRest n'est pas accessible ici
-
 
122
		if(!$observations) {
-
 
123
			header('HTTP/1.0 204 No Content');
139
		$objPHPExcel = $this->gerenerFeuilleImportFormatee($parametres_format);
124
			exit;
140
		$feuille = $objPHPExcel->setActiveSheetIndex(0);
125
		}
141
		// attention formaterColonnesFeuille prend ses 2 premiers paramètres par référence
126
 
142
		$this->formaterColonnesFeuille($feuille, $colonnes, $parametres_format);
127
		$objPHPExcel->getProperties()->setCreator($params['widget']) // ou $uid ?
143
		$objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(12);
-
 
144
 
Line -... Line 145...
-
 
145
		$no_ligne = 2;
-
 
146
		foreach ($observations as $obs) {
-
 
147
			// attention traiterLigneObservation prend ses 3 premiers paramètres par référence
-
 
148
			$this->traiterLigneObservation($obs, $colonnes, $feuille, $no_ligne);
-
 
149
			$no_ligne++;
-
 
150
		}
-
 
151
 
-
 
152
		$this->envoyerFeuille($objPHPExcel, $parametres_format);
-
 
153
	}
-
 
154
	
-
 
155
	private function envoyerFeuille($objPHPExcel, $parametres_format) {
-
 
156
		header("Content-Type: application/vnd.ms-excel");
-
 
157
		header("Content-Disposition: attachment; filename=\"liste.xls\"; charset=utf-8");
-
 
158
		header("Cache-Control: max-age=0");
-
 
159
		
-
 
160
		// csv|xls|xlsx => CSV|Excel5|Excel2007
-
 
161
		// Note: le format Excel2007 utilise un fichier temporaire
-
 
162
		$generateur = PHPExcel_IOFactory::createWriter($objPHPExcel, $parametres_format['format']);
-
 
163
		$generateur->save('php://output');
-
 
164
		exit;
-
 
165
	}
-
 
166
	
-
 
167
	private function traiterLigneObservation(&$obs, &$colonnes, &$feuille, $no_ligne) {
-
 
168
		$no_colonne = 0;
-
 
169
		foreach($colonnes as $abbrev => $colonne) {
-
 
170
			$valeur = null;
-
 
171
			if($colonne['extra'] == 2) continue;
-
 
172
		
-
 
173
			// valeur direct depuis cel_obs ?
-
 
174
			if(isset($obs[$abbrev])) $valeur = $obs[$abbrev];
-
 
175
		
-
 
176
			// pré-processeur de la champs
-
 
177
			if(function_exists($colonne['fonction'])) {
-
 
178
				$valeur = $colonne['fonction']($valeur);
-
 
179
			} elseif(method_exists(__CLASS__, $colonne['fonction'])) {
-
 
180
				$valeur = call_user_func(array(__CLASS__, $colonne['fonction']), $valeur);
-
 
181
			} elseif($colonne['fonction']) {
-
 
182
				die("méthode {$colonne['fonction']} introuvable");
-
 
183
			}
-
 
184
			// fonction pour obtenir des champs (étendus)
-
 
185
			elseif(function_exists($colonne['fonction_data'])) {
-
 
186
				$valeur = $colonne['fonction_data']($obs);
-
 
187
			}
-
 
188
			elseif(method_exists(__CLASS__, $colonne['fonction_data'])) {
-
 
189
				$valeur = call_user_func(array(__CLASS__, $colonne['fonction_data']), $obs);
-
 
190
			}
-
 
191
		
-
 
192
			// // cette section devrait être vide:
-
 
193
			// // cas particuliers ingérable avec l'architecture actuelle:
-
 
194
			if(false && $abbrev == 'date_observation' && $valeur == "0000-00-00") {
-
 
195
				/* blah */ 
-
 
196
			}
-
 
197
			// // fin de section "cas particuliers"
-
 
198
			$feuille->setCellValueByColumnAndRow($no_colonne, $no_ligne, $valeur);
-
 
199
			$no_colonne++;
-
 
200
		}
-
 
201
	}
-
 
202
	
-
 
203
	private function gerenerFeuilleImportFormatee($parametres_format) {
-
 
204
		$objPHPExcel = new PHPExcel();
-
 
205
		
-
 
206
		$objPHPExcel->getProperties()->setCreator($parametres_format['widget']) // ou $uid ?
128
			->setLastModifiedBy("XX") // TODO: $uid
207
		->setLastModifiedBy("XX") // TODO: $uid
129
			->setTitle("YY") // TODO
208
		->setTitle("Export des observation du carnet en ligne") // TODO
-
 
209
		->setSubject("Export") // TODO
-
 
210
		->setDescription("Export");
-
 
211
		//->setKeywords("office PHPExcel php")
130
			->setSubject("ZZ") // TODO
212
		//->setCategory("Test result file")
131
			->setDescription("Export blah");
213
		
132
			//->setKeywords("office PHPExcel php")
214
		$objPHPExcel->getActiveSheet()->setTitle("Observations");
133
			//->setCategory("Test result file")
215
		return $objPHPExcel;
134
 
216
	}
135
		$objPHPExcel->getActiveSheet()->setTitle("Observations");
217
	
136
		$feuille = $objPHPExcel->setActiveSheetIndex(0);
218
	private function formaterColonnesFeuille(&$feuille, &$colonnes, $parametres_format) {
137
		$colid = 0;
219
		$colid = 0;
138
		foreach($colonnes as $colonne) {
220
		foreach($colonnes as $colonne) {
Line 155... Line 237...
155
						'type' => PHPExcel_Style_Fill::FILL_SOLID,
237
						'type' => PHPExcel_Style_Fill::FILL_SOLID,
156
						'color' => array('rgb' => PHPExcel_Style_Color::COLOR_YELLOW)
238
						'color' => array('rgb' => PHPExcel_Style_Color::COLOR_YELLOW)
157
					)
239
					)
158
				);
240
				);
159
			}
241
			}
160
 
242
		
161
			$colid++;
243
			$colid++;
162
		}
244
		}
163
 
-
 
164
		$objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(12);
-
 
165
 
-
 
166
		$ligne = 2;
-
 
167
		foreach ($observations as $obs) {
-
 
168
			$colid = 0;
-
 
169
			foreach($colonnes as $abbrev => $colonne) {
-
 
170
				if($colonne['extra'] == 2) continue;
-
 
171
 
-
 
172
				// valeur direct depuis cel_obs ?
-
 
173
				if(isset($obs[$abbrev])) $valeur = $obs[$abbrev];
-
 
174
 
-
 
175
				// pré-processeur de la champs
-
 
176
				if(function_exists($colonne['fonction'])) {
-
 
177
					$valeur = $colonne['fonction']($valeur);
-
 
178
				} elseif(method_exists(__CLASS__, $colonne['fonction'])) {
-
 
179
					$valeur = call_user_func(array(__CLASS__, $colonne['fonction']), $valeur);
-
 
180
				} elseif($colonne['fonction']) {
-
 
181
					die("méthode {$colonne['fonction']} introuvable");
-
 
182
				}
-
 
183
				// fonction pour obtenir des champs (étendus)
-
 
184
				elseif(function_exists($colonne['fonction_data'])) {
-
 
185
					$valeur = $colonne['fonction_data']($obs);
-
 
186
				}
-
 
187
				elseif(method_exists(__CLASS__, $colonne['fonction_data'])) {
-
 
188
					$valeur = call_user_func(array(__CLASS__, $colonne['fonction_data']), $obs);
-
 
189
				}
-
 
190
 
-
 
191
 
-
 
192
				// // cette section devrait être vide:
-
 
193
				// // cas particuliers ingérable avec l'architecture actuelle:
-
 
194
				if(false && $abbrev == 'date_observation' && $valeur == "0000-00-00") { /* blah */ }
-
 
195
				// // fin de section "cas particuliers"
-
 
196
 
-
 
197
				$feuille->setCellValueByColumnAndRow($colid, $ligne, $valeur);
-
 
198
				$colid++;
-
 
199
			}
-
 
200
			$ligne++;
-
 
201
		}
-
 
202
 
-
 
203
		header("Content-Type: application/vnd.ms-excel");
-
 
204
		header("Content-Disposition: attachment; filename=\"liste.xls\"; charset=utf-8");
-
 
205
		header("Cache-Control: max-age=0");
-
 
206
 
-
 
207
		// csv|xls|xlsx => CSV|Excel5|Excel2007
-
 
208
		// Note: le format Excel2007 utilise un fichier temporaire
-
 
209
		$generateur = PHPExcel_IOFactory::createWriter($objPHPExcel, $params['format']);
-
 
210
		$generateur->save('php://output');
-
 
211
		exit;
-
 
212
	}
245
	}
Line 213... Line 246...
213
 
246
 
214
	/*
247
	/*
215
	 * @param $fieldSets: un range, eg: 1-5,8,32,58-101
248
	 * @param $fieldSets: un range, eg: 1-5,8,32,58-101
Line 242... Line 275...
242
	 * 		valeur: des données relative à cette colonne, cf GenColInfo
275
	 * 		valeur: des données relative à cette colonne, cf GenColInfo
243
	 *
276
	 *
244
	 * @TODO: fonction commune à la génération en CSV
277
	 * @TODO: fonction commune à la génération en CSV
245
	 *
278
	 *
246
	 */
279
	 */
247
	static function nom_d_ensemble_vers_liste_de_colonnes($groupe_de_champs = 'standard') {
280
	static function nomEnsembleVersListeColonnes($groupe_de_champs = 'standard') {
248
		if(! $groupe_de_champs) $groupe_de_champs = 'standard';
281
		if(! $groupe_de_champs) $groupe_de_champs = 'standard';
249
		$groupe_de_champs = array_flip(explode(',', $groupe_de_champs));
282
		$groupe_de_champs = array_flip(explode(',', $groupe_de_champs));
250
		$colonnes = Array();
283
		$colonnes = Array();
Line 251... Line 284...
251
 
284
 
Line 336... Line 369...
336
		);
369
		);
337
	}
370
	}
Line 338... Line 371...
338
 
371
 
339
	protected function formaterDate($date_heure_mysql, $format = NULL) {
372
	protected function formaterDate($date_heure_mysql, $format = NULL) {
340
		if (!$date_heure_mysql || $date_heure_mysql == "0000-00-00 00:00:00") return "00/00/0000";
373
		if (!$date_heure_mysql || $date_heure_mysql == "0000-00-00 00:00:00") return "00/00/0000";
-
 
374
		$date_format = DateTime::createFromFormat("Y-m-d H:i:s", $date_heure_mysql);
341
		$timestamp = DateTime::createFromFormat("Y-m-d H:i:s", $date_heure_mysql)->getTimestamp();
375
		$timestamp = @$date_format->getTimestamp();
342
		if(!$timestamp) return "00/00/0000";
376
		if(!$timestamp) return "00/00/0000";
343
		// TODO: les widget ne font malheureusement pas usage de l'heure dans le CEL
377
		// TODO: les widgets ne font malheureusement pas usage de l'heure dans le CEL
344
		// TODO: si modification, ne pas oublier de modifier le format d'import correspondant
378
		// TODO: si modification, ne pas oublier de modifier le format d'import correspondant
345
		//		 dans ImportXLS (actuellement: "d/m/Y")
379
		//		 dans ImportXLS (actuellement: "d/m/Y")
346
		$date_formatee = strftime('%d/%m/%Y', $timestamp);
380
		$date_formatee = strftime('%d/%m/%Y', $timestamp);
347
		if(!$date_formatee) return "00/00/0000";
381
		if(!$date_formatee) return "00/00/0000";
Line 461... Line 495...
461
		try {
495
		try {
462
			$noms = $this->service->traiterRessources();
496
			$noms = $this->service->traiterRessources();
463
		} catch(Exception $e) { return ''; }
497
		} catch(Exception $e) { return ''; }
464
		if(! $noms) return '';
498
		if(! $noms) return '';
465
		$noms = array_filter($noms['resultat'], function($item) { return ($item['num_statut'] == 1); });
499
		$noms = array_filter($noms['resultat'], function($item) { return ($item['num_statut'] == 1); });
-
 
500
		$premier_nom = array_pop($noms);
466
		$nom = array_pop($noms)['nom_vernaculaire'];
501
		$nom = $premier_nom['nom_vernaculaire'];
Line 467... Line 502...
467
 
502
 
468
		// cache
503
		// cache
469
		$this->cache['getNomCommun'][$cache_id] = $nom;
504
		$this->cache['getNomCommun'][$cache_id] = $nom;
470
		return $nom;
505
		return $nom;