Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
417 aurelien 1
<?php
2
 
3
// In : utf8
4
// Out : utf8
5
 
6
// Import depuis une feuille de calcul
7
 
8
// Test fonction d'import
9
// Import de base
10
// TODO : soigner les controles ...
11
// Scenario avance
12
 
445 david 13
 
14
// Nom des colonnes
15
 
16
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
17
define('LIEUDIT','lieu-dit'); // Texte libre
18
define('STATION','station'); // Texte libre
19
define('MILIEU','milieu'); // Texte libre
20
define('LATITUDE','latitude'); // En decimal systeme WGS84
21
define('LONGITUDE','longitude'); // En decimal systeme WGS84
22
define('NOTES','notes'); // Texte libre
23
define('DATEOBS','date'); // date au format jj/mm/aaaa
24
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
25
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
26
 
27
// Resultat analyse ligne // TODO : Classe ?
28
define('LIGNE_VIDE',1); //
29
define('LIGNE_NORMALE',2); //
30
define('LIGNE_IMAGE_SEULEMENT',3); //
31
 
32
 
33
// Element constituant une observation
34
 
417 aurelien 35
Class InventoryImportExcel extends DBAccessor  {
36
 
445 david 37
// Element constituant une observation
417 aurelien 38
 
445 david 39
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION ,MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,IMAGE );
417 aurelien 40
	var $config;
41
	var $extendExcelReader;
42
 
43
	function InventoryImportExcel($config) {
44
 
45
		$this->config=$config;
46
		// Pas d'heritage multiple en php :(
47
 
48
		$this->extendExcelReader = new ExcelReader();
49
		$this->extendExcelReader->initExcelReader();
50
	}
51
 
52
 
445 david 53
	function createElement($pairs) {
417 aurelien 54
 
445 david 55
		// uid[0] : utilisateur obligatoire
417 aurelien 56
 
57
 
445 david 58
		session_start();
59
                $this->controleUtilisateur($pairs['identifiant']);
417 aurelien 60
 
445 david 61
                foreach($_FILES as $file) { // FIXME : est necessaire
417 aurelien 62
 
445 david 63
                        $infos_fichier = $file ;
64
                }
417 aurelien 65
 
66
 
445 david 67
// Chargement tableau en memoire FIXME : limiter le nombre de ligne ?
68
 
69
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
70
 
71
		$arr = array();
72
		$rowcount=$data->rowcount(0);
73
		$colcount=$data->colcount(0);
74
 
75
		if ($rowcount<=1) { // TODO : retour erreur
76
			print "Tableau vide";
77
			exit;
78
		}
79
 
80
	        for($row=1;$row<=$rowcount;$row++)
81
        	        for($col=1;$col<=$colcount;$col++)
82
                	        $arr[$col][$row] = $data->val($row,$col,0);
83
 
84
 
85
		//print_r($arr);
417 aurelien 86
 
445 david 87
// 1 : Traitement colonnes
417 aurelien 88
 
445 david 89
		$line = array();
417 aurelien 90
 
445 david 91
/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */
92
 
93
                for($col=1;$col<=$colcount;$col++) {
94
			$colonne=strtolower($arr[$col][1]);
95
			switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
96
				case COMMUNE:
97
				case LIEUDIT:
98
				case STATION:
99
				case MILIEU:
100
				case LATITUDE:
101
				case LONGITUDE:
102
				case NOTES:
103
				case DATEOBS:
104
				case ESPECE:
105
				case IMAGE:
106
					$selection=array_values($arr[$col]);
107
					array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
108
					$line[$colonne]=$selection;
109
					break;
110
 
111
			}
112
		}
113
 
114
	/*
115
		print_r($line[COMMUNE]);
116
		print_r($line[LIEUDIT]);
117
		print_r($line[STATION]);
118
		print_r($line[MILIEU]);
119
		print_r($line[LATITUDE]);
120
		print_r($line[LONGITUDE]);
121
		print_r($line[NOTES]);
122
		print_r($line[DATEOBS]);
123
		print_r($line[ESPECE]);
124
		print_r($line[IMAGE]);
125
	*/
126
 
127
// 1 : Traitement lignes
128
 
129
		for ($i=0;$i<=$colcount-1;$i++) {
130
			// On saute les lignes vides
131
			while (($this->analyserLigne($line,$i)==LIGNE_VIDE) && ($i<=$colcount)) {
132
				print "vide";
133
				$i++;
134
			}
135
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$colcount)) {
136
				$this->traiterLigne($line,$i);
137
				$i++;
138
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$colcount)) {
139
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
140
						$this->traiterLigneComplement($line,$i);
141
					}
142
					else {
143
						print "vide";
144
					}
145
					$i++;
146
				}
147
			}
148
 
149
			// Cas special : seul l'image est presente
150
 
151
		}
152
 
417 aurelien 153
	}
154
 
445 david 155
function analyserLigne($line,$i) {
156
	$ligne_vide=true;
157
	$ligne_image_seulement=true;
158
	$ligne_normale=true;
159
	foreach ($this->format_observation as $colonne) {
160
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
161
			if ($colonne!=IMAGE) {
162
				$ligne_image_seulement=false;
163
				$ligne_vide=false;
164
				break;
165
			}
166
			$ligne_vide=false;
167
		}
168
	}
169
	if ($ligne_vide) {
170
		return LIGNE_VIDE;
171
	}
172
	else {
173
		if ($ligne_image_seulement) {
174
			return LIGNE_IMAGE_SEULEMENT;
175
		}
176
		else {
177
			return LIGNE_NORMALE;
178
		}
179
	}
180
 
417 aurelien 181
 
445 david 182
}
417 aurelien 183
 
445 david 184
function traiterLigne($line,$i) {
185
	foreach ($this->format_observation as $colonne) {
186
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
187
			switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
188
				case COMMUNE:
189
					$info_commune=$this->traiterCommune($line[COMMUNE][$i]);
190
					echo $info_commune['name'];
191
					echo $info_commune['code'];
192
					break;
193
				case LIEUDIT:
194
					$this->traiterLieudit($line[LIEUDIT][$i]);
195
					break;
196
				case STATION:
197
					$this->traiterStation($line[STATION][$i]);
198
					break;
199
				case MILIEU:
200
					$this->traiterMilieu($line[MILIEU][$i]);
201
					break;
202
				case LATITUDE:
203
					$this->traiterLatitude($line[LATITUDE][$i]);
204
					break;
205
				case LONGITUDE:
206
					$this->traiterLongitude($line[LONGITUDE][$i]);
207
					break;
208
				case NOTES:
209
					$this->traiterNotes($line[NOTES][$i]);
210
					break;
211
				case DATEOBS:
212
					$this->traiterDateObs($line[DATEOBS][$i]);
213
					break;
214
				case ESPECE:
215
					$this->traiterEspece($line[ESPECE][$i]);
216
					break;
217
				case IMAGE:
218
					$this->traiterImage($line[IMAGE][$i]);
219
					break;
220
			}
221
			print "\n";
222
		}
223
	}
224
 
417 aurelien 225
}
226
 
445 david 227
function traiterLigneComplement($line,$i) {
228
	$this->traiterImage($line[IMAGE][$i]);
229
	print "\n";
417 aurelien 230
 
445 david 231
}
232
function traiterCommune($identifiant_commune) {  // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
233
 
234
 
235
	echo "traitement commune";
236
 
237
        $identifiant_commune=ltrim($identifiant_commune);
238
 
239
        $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
240
 
241
	preg_match('/(.*)\((.*)\)/',$identifiant_commune,$elements);
242
 
243
        $DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
244
 
245
	if ($elements[1]) { // departement present
246
		$nom_commune=$elements[1];
247
		$code_commune=$elements[2];
248
 
249
 	        $query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."%' AND code ='".$DB->escapeSimple($code_commune)."'";
250
 
251
	}
252
	else {
253
		preg_match('/([0-9][0-9])|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
254
		if ($elements[1]) { // code insee  commune
255
			$code_insee_commune=$elements[1];
256
 	        	$query="SELECT DISTINCT name, code  FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'";
257
		}
258
		else {
259
		preg_match('/(.*)/',$identifiant_commune,$elements);
260
			if ($elements[1]) { // commune
261
				$nom_commune=$elements[1];
262
	 	        	$query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."'";
263
			}
264
		}
265
	}
266
 
267
 
268
	$res =& $DB->query($query);
269
 
270
        if (DB::isError($res)) {
271
		 die($res->getMessage());
272
	}
273
 
274
	return $res->fetchrow(DB_FETCHMODE_ASSOC);
275
 
276
 
277
 
278
 
279
}
280
 
281
function traiterLieudit($lieudit) { // texte libre
282
 
283
	echo "traitement lieudit";
284
	return utf8_encode(ltrim($lieudit));
285
}
286
 
287
function traiterStation($station) { // texte libre
288
	echo "traitement station";
289
	return utf8_encode(ltrim($station));
290
}
291
 
292
function traiterMilieu($milieu) { // texte libre
293
	echo "traitement milieu";
294
	return utf8_encode(ltrim($milieu));
295
}
296
 
297
function traiterLatitude($latitude) {	//  verifier formal decimal + limite france ? TODO
298
	echo "traitement latitude";
299
	return ltrim($latitude);
300
}
301
 
302
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
303
	echo "traitement longitude";
304
	return ltrim($longitude);
305
}
306
 
307
function traiterNotes($notes) { // texte libre
308
	echo "traitement notes";
309
	return utf8_encode(ltrim($notes));
310
}
311
 
312
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
313
	echo "traitement dateobs";
314
	return ltrim($notes);
315
}
316
 
317
function traiterEspece($identifiant_espece) {  // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
318
/*
319
        $identifiant_espece=ltrim($identifiant_espece);
320
 
321
        $identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau
322
 
323
	preg_match('/B(.*)\((.*)\)/',$identifiant_commune,$elements);
324
	preg_match('/(.*)\((.*)\)/',$identifiant_commune,$elements);
325
 
326
        $DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
327
 
328
	if ($elements[1]) { // departeme
329
                      $query="SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
330
                                        "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
331
                                        " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
332
                                        " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
333
                                        " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
334
                                        " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom, esn_ce_statut" .
335
                                        " FROM eflore_nom, eflore_nom_rang, " .
336
                                        "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
337
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
338
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
339
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
340
                                "   , eflore_selection_nom".
341
                                        " WHERE en_id_version_projet_nom = '25' AND en_nom_genre LIKE '".$DB->escapeSimple($genre)."%' " .
342
                                        " AND en_ce_rang > 160 " .
343
                                        " AND en_epithete_espece like '".$DB->escapeSimple($espece)."%' AND en_ce_rang = enrg_id_rang " .
344
                                        " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
345
                                        " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
346
                                        " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
347
                                        " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
348
                                        " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
349
                                        " AND esn_id_nom= en_id_nom ".
350
                                        " ORDER BY esn_ce_statut, en_ce_rang, en_epithete_espece, en_nom_genre LIMIT 50";
351
 
352
 
353
 
354
	echo "traitement  espece";
355
*/
356
}
357
 
358
 
359
 
360
function traiterImage($image) { // recherche id image de ce nom et creation table correspondance
361
	echo "traitement  image";
362
}
363
 
364
 
365
 
366
 
367
}
368
 
369
 
370
 
417 aurelien 371
/* +--Fin du code ---------------------------------------------------------------------------------------+
372
* $Log$
373
*
374
*
375
*/
376
 
377
 
378
?>