Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1612 Rev 1617
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
	private $champs_a_exclure = array('ce_utilisateur' => 'ce_utilisateur', 
30
	private $champs_a_exclure = array(
-
 
31
		'ce_utilisateur' => true, 
31
		'courriel_utilisateur' => 'courriel_utilisateur',
32
		'courriel_utilisateur' => true,
32
		'transmission' => 'transmission');
33
		'transmission' => true,
-
 
34
		'code_insee_calcule' => true);
33
	private $correspondance_champs = array(
35
	private $correspondance_champs = array(
34
		'id_observation' => 'Identifiant Observation',
36
		'id_observation' => 'Identifiant Observation',
35
		'ordre' => 'Ordre Observation',
37
		'ordre' => 'Ordre Observation',
36
		'prenom_utilisateur' => 'Prénom',
38
		'prenom_utilisateur' => 'Prénom',
37
		'nom_utilisateur' => 'Nom',
39
		'nom_utilisateur' => 'Nom',
38
		'nom_sel' => 'Nom Sélectionné',
40
		'nom_sel' => 'Nom Sélectionné',
39
		'nom_sel_nn' => 'Numéro Nomenclatural Nom Selectionné',
41
		'nom_sel_nn' => 'Numéro Nomenclatural Nom Selectionné',
40
		'nom_ret' => 'Nom Retenu',
42
		'nom_ret' => 'Nom Retenu',
41
		'nom_ret_nn' => 'Numéro Nomenclatural Nom Retenu',
43
		'nom_ret_nn' => 'Numéro Nomenclatural Nom Retenu',
42
		'nt' => 'Numéro Taxonomique',
44
		'nt' => 'Numéro Taxonomique',
43
		'famille' => 'Famille',
45
		'famille' => 'Famille',
44
		'nom_referentiel' => 'Référentiel Taxonomique',
46
		'nom_referentiel' => 'Référentiel Taxonomique',
45
		'ce_zone_geo' => 'Code Insee',
47
		'ce_zone_geo' => 'Code Insee',
46
		'zone_geo' => 'Commune',
48
		'zone_geo' => 'Commune',
47
		'lieudit' => 'Lieu-Dit',
49
		'lieudit' => 'Lieu-Dit',
48
		'station' => 'Station',
50
		'station' => 'Station',
49
		'milieu' => 'Milieu',
51
		'milieu' => 'Milieu',
50
		'latitude' => 'Latitude',
52
		'latitude' => 'Latitude',
51
		'longitude' => 'Longitude',
53
		'longitude' => 'Longitude',
-
 
54
		'altitude' => 'Altitude',
52
		'geodatum' => 'Référentiel Géographique',
55
		'geodatum' => 'Référentiel Géographique',
53
		'date_observation' => 'Date Observation',
56
		'date_observation' => 'Date Observation',
54
		'mots_cles_texte' => 'Mots Clés',
57
		'mots_cles_texte' => 'Mots Clés',
55
		'commentaire' => 'Commentaires',
58
		'commentaire' => 'Commentaires',
56
		'date_creation' => 'Date Création',
59
		'date_creation' => 'Date Création',
57
		'date_modification' => 'Date Modification',
60
		'date_modification' => 'Date Modification',
58
		'date_transmission' => 'Date Transmission'
61
		'date_transmission' => 'Date Transmission',
-
 
62
		'abondance' => 'Abondance',
-
 
63
		'certitude' => 'Certitude',
-
 
64
		'phenologie' => 'Phénologie'
59
		);
65
		);
60
	private $parametres_autorises = array(
66
	private $parametres_autorises = array(
61
		'utilisateur' => 'courriel_utilisateur',
67
		'utilisateur' => 'courriel_utilisateur',
62
		'commune' => 'zone_geo',
68
		'commune' => 'zone_geo',
63
		'dept' => 'departement',
69
		'dept' => 'departement',
64
		'projet' => 'mots_cles',
70
		'projet' => 'mots_cles',
65
		'num_taxon' => 'nt',
71
		'num_taxon' => 'nt',
66
		'date_debut' => 'date_debut',
72
		'date_debut' => 'date_debut',
67
		'date_fin' => 'date_fin',
73
		'date_fin' => 'date_fin',
68
		'taxon' => 'taxon'
74
		'taxon' => 'taxon'
69
	);
75
	);
70
	
76
	
71
	private $format = 'csv';
77
	private $format = 'csv';
72
	
78
	
73
	public function getRessource() {
79
	public function getRessource() {
74
		return $this->getElement(array());
80
		return $this->getElement(array());
75
	}
81
	}
76
		
82
		
77
	/**
83
	/**
78
	 * Méthode appelée avec une requête de type GET.
84
	 * Méthode appelée avec une requête de type GET.
79
	 */
85
	 */
80
	public function getElement($params = array()) {
86
	public function getElement($params = array()) {
81
		
87
		
82
		$criteres = $this->traiterParametresAutorises($_GET);
88
		$criteres = $this->traiterParametresAutorises($_GET);
83
		
89
		
84
		// Seulement les observation publiques
90
		// Seulement les observation publiques
85
		$criteres['transmission'] = 1;
91
		$criteres['transmission'] = 1;
86
		$chercheur_observations = new RechercheObservation($this->config);
92
		$chercheur_observations = new RechercheObservation($this->config);
87
		
93
		
88
		$numero_page = isset($criteres['debut']) ? $criteres['debut'] : 0;
94
		$numero_page = isset($criteres['debut']) ? $criteres['debut'] : 0;
89
		$limite = isset($criteres['limite']) ? $criteres['limite'] : 0;
95
		$limite = isset($criteres['limite']) ? $criteres['limite'] : 0;
90
		
96
		
91
		unset($criteres['limite']);
97
		unset($criteres['limite']);
92
		unset($criteres['debut']);
98
		unset($criteres['debut']);
93
	
99
	
94
		$observations = $chercheur_observations->rechercherObservations(null, $criteres, $numero_page, $limite);
100
		$observations = $chercheur_observations->rechercherObservations(null, $criteres, $numero_page, $limite);
95
 
-
 
96
		switch($this->format) {
101
		switch($this->format) {
97
			case 'csv':
102
			case 'csv':
98
				$csv = $this->convertirEnCsv($observations);
103
				$csv = $this->convertirEnCsv($observations);
99
				$this->envoyerCsv($csv);
104
				$this->envoyerCsv($csv);
100
			break;
105
			break;
101
			case 'xls':
106
			case 'xls':
102
				$xls = $this->convertirEnXls($observations);
107
				$xls = $this->convertirEnXls($observations);
103
				$this->envoyerXls($xls);
108
				$this->envoyerXls($xls);
104
			break;
109
			break;
105
			default:
110
			default:
106
		}
111
		}
107
	}
112
	}
108
	
113
	
109
	protected function traiterParametresAutorises(Array $parametres) {
114
	protected function traiterParametresAutorises(Array $parametres) {
110
		$parametres_traites = array();
115
		$parametres_traites = array();
111
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
116
		$this->format = (isset($parametres['format']) && $parametres['format'] != '') ? $parametres['format'] : $this->format;
112
		foreach($parametres as $cle => $valeur) {
117
		foreach($parametres as $cle => $valeur) {
113
			if(trim($valeur) != '' && isset($this->parametres_autorises[$cle])) {
118
			if(trim($valeur) != '' && isset($this->parametres_autorises[$cle])) {
114
				$parametres_traites[$this->parametres_autorises[$cle]] = $valeur;
119
				$parametres_traites[$this->parametres_autorises[$cle]] = $valeur;
115
			}
120
			}
116
		}
121
		}
117
		return $parametres_traites;
122
		return $parametres_traites;
118
	}
123
	}
119
	
124
	
120
	private function envoyerCsv($csv) {
125
	private function envoyerCsv($csv) {
121
		header('Content-Type: text/csv; charset=UTF-8');
126
		header('Content-Type: text/csv; charset=UTF-8');
122
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
127
		header('Content-Disposition: attachment;filename='.$this->nom_fichier_export.'.csv');
123
		echo $csv;
128
		echo $csv;
124
		exit;
129
		exit;
125
	}
130
	}
126
	
131
	
127
	private function envoyerXls($workbook) {
132
	private function envoyerXls($workbook) {
128
		$workbook->close();
133
		$workbook->close();
129
		exit;
134
		exit;
130
	}
135
	}
131
	
136
	
132
	private function convertirEnCsv($data)
137
	private function convertirEnCsv($data)
133
	{
138
	{
134
		$chemin_temp = "php://temp";
139
		$chemin_temp = "php://temp";
135
		$outstream = fopen($chemin_temp, 'r+');
140
		$outstream = fopen($chemin_temp, 'r+');
136
		$intitule_champs = array();
141
		$intitule_champs = array();
137
		foreach($data as $ligne) {
142
		foreach($data as &$ligne) {
138
			$ligne = $this->filtrerDonneesSensibles($ligne);
143
			$ligne = $this->filtrerDonneesSensibles($ligne);
139
			$ligne = array_diff_key($ligne, $this->champs_a_exclure);
144
			$ligne = array_diff_key($ligne, $this->champs_a_exclure);
140
			if(empty($intitule_champs)) {
145
			if(empty($intitule_champs)) {
141
				$intitule_champs = $this->creerEntetesChamps($ligne);
146
				$intitule_champs = $this->creerEntetesChamps($ligne);
142
				fputcsv($outstream, $intitule_champs, ',', '"');			
147
				fputcsv($outstream, $intitule_champs, ',', '"');			
143
			}
148
			}
144
			fputcsv($outstream, $ligne, ',', '"');
149
			fputcsv($outstream, $ligne, ',', '"');
145
		}
150
		}
146
		rewind($outstream);
151
		rewind($outstream);
147
		$csv = stream_get_contents($outstream);
152
		$csv = stream_get_contents($outstream);
148
		fclose($outstream);
153
		fclose($outstream);
149
		return $csv;
154
		return $csv;
150
	}
155
	}
151
	
156
	
152
	private function convertirEnXls($data) {		
157
	private function convertirEnXls($data) {		
153
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
158
		$this->extendSpreadsheetProductor = new SpreadsheetProductor();
154
		$this->extendSpreadsheetProductor->initSpreadsheet();
159
		$this->extendSpreadsheetProductor->initSpreadsheet();
155
		
160
		
156
		$workbook = new Spreadsheet_Excel_Writer();
161
		$workbook = new Spreadsheet_Excel_Writer();
157
		$workbook->setVersion(8);
162
		$workbook->setVersion(8);
158
 
163
 
159
		$worksheet = $workbook->addWorksheet('Liste');
164
		$worksheet = $workbook->addWorksheet('Liste');
160
		$worksheet->setInputEncoding('utf-8');
165
		$worksheet->setInputEncoding('utf-8');
161
		$workbook->send($this->nom_fichier_export.'.xls');
166
		$workbook->send($this->nom_fichier_export.'.xls');
162
		
167
		
163
		$nb_lignes = 1;
168
		$nb_lignes = 1;
164
		
169
				
165
		foreach($data as $ligne) {
170
		foreach($data as &$ligne) {
166
			$ligne = $this->filtrerDonneesSensibles($ligne);
171
			$ligne = $this->filtrerDonneesSensibles($ligne);
167
			$ligne = array_diff_key($ligne, $this->champs_a_exclure);
172
			$ligne = array_diff_key($ligne, $this->champs_a_exclure);
168
			if(empty($intitule_champs)) {
173
			if(empty($intitule_champs)) {
169
				$intitule_champs = $this->creerEntetesChamps($ligne);
174
				$intitule_champs = $this->creerEntetesChamps($ligne);
170
				$indice = 0;
175
				$indice = 0;
171
				foreach ($intitule_champs as $intitule) {	
176
				foreach ($intitule_champs as &$intitule) {	
172
					$colonne = $intitule_champs[$indice];
177
					$colonne = $intitule_champs[$indice];
173
					$worksheet->write(0,$indice,$colonne);
178
					$worksheet->write(0,$indice,$colonne);
174
					$indice++;
179
					$indice++;
175
				}
180
				}
176
			}
181
			}
177
			$indice = 0;
182
			$indice = 0;
178
			foreach($ligne as $champ) {
183
			foreach($ligne as &$champ) {
179
				$worksheet->write($nb_lignes,$indice,$champ);
184
				$worksheet->write($nb_lignes,$indice,$champ);
180
				$indice++;
185
				$indice++;
181
			}
186
			}
182
			$nb_lignes++;
187
			$nb_lignes++;
183
		}
188
		}
184
		return $workbook;
189
		return $workbook;
185
	}
190
	}
186
	
191
	
187
	private function creerEntetesChamps($noms_colonnes) {
192
	private function creerEntetesChamps($noms_colonnes) {
188
		$champs_presents = array_intersect_key($this->correspondance_champs, $noms_colonnes);
193
		$champs_presents = array_intersect_key($this->correspondance_champs, $noms_colonnes);
189
		return array_values($champs_presents);
194
		return array_values($champs_presents);
190
	}
195
	}
191
	
196
	
192
	private function filtrerDonneesSensibles($ligne) {
197
	private function filtrerDonneesSensibles($ligne) {
193
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
198
		if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
194
			$ligne['latitude'] = '';
199
			$ligne['latitude'] = '';
195
			$ligne['longitude'] = '';
200
			$ligne['longitude'] = '';
196
		}
201
		}
197
		return $ligne;
202
		return $ligne;
198
	}
203
	}
199
	
204
	
200
	private function nettoyerChaine($chaine) {
205
	private function nettoyerChaine($chaine) {
201
		$chaine = str_replace("\n",' ',$chaine);
206
		$chaine = str_replace("\n",' ',$chaine);
202
		$chaine = str_replace("\t",'',$chaine);
207
		$chaine = str_replace("\t",'',$chaine);
203
		return $chaine;
208
		return $chaine;
204
	}
209
	}
205
}
210
}
206
?>
211
?>