Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 417 Rev 445
Line 8... Line 8...
8
// Test fonction d'import
8
// Test fonction d'import
9
// Import de base
9
// Import de base
10
// TODO : soigner les controles ...
10
// TODO : soigner les controles ...
11
// Scenario avance
11
// Scenario avance
Line -... Line 12...
-
 
12
 
-
 
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 
12
 
34
 
Line -... Line 35...
-
 
35
Class InventoryImportExcel extends DBAccessor  {
Line -... Line 36...
-
 
36
 
13
Class InventoryImportExcel extends DBAccessor  {
37
// Element constituant une observation 
14
 
38
 
Line 15... Line 39...
15
 
39
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION ,MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,IMAGE );
Line 16... Line 40...
16
	var $config;
40
	var $config;
17
	var $extendExcelReader;
41
	var $extendExcelReader;
Line 18... Line -...
18
 
-
 
19
	function InventoryImportExcel($config) {
42
 
20
 
43
	function InventoryImportExcel($config) {
21
		$this->config=$config;
44
 
Line 22... Line 45...
22
		// Pas d'heritage multiple en php :(
45
		$this->config=$config;
Line -... Line 46...
-
 
46
		// Pas d'heritage multiple en php :(
Line 23... Line -...
23
 
-
 
24
 
-
 
25
		$this->extendExcelReader = new ExcelReader();
-
 
Line -... Line 47...
-
 
47
 
-
 
48
		$this->extendExcelReader = new ExcelReader();
26
		$this->extendExcelReader->initExcelReader();
49
		$this->extendExcelReader->initExcelReader();
-
 
50
	}
-
 
51
 
-
 
52
 
27
	}
53
	function createElement($pairs) {
-
 
54
 
-
 
55
		// uid[0] : utilisateur obligatoire
-
 
56
 
Line -... Line 57...
-
 
57
			
Line -... Line 58...
-
 
58
		session_start();
-
 
59
                $this->controleUtilisateur($pairs['identifiant']);
28
 
60
 
Line -... Line 61...
-
 
61
                foreach($_FILES as $file) { // FIXME : est necessaire
29
 
62
 
-
 
63
                        $infos_fichier = $file ;
-
 
64
                }
-
 
65
 
-
 
66
 
-
 
67
// Chargement tableau en memoire FIXME : limiter le nombre de ligne ?
-
 
68
 
Line -... Line 69...
-
 
69
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
30
	function getElement($uid){
70
 
31
 
-
 
32
 
-
 
Line -... Line 71...
-
 
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);
-
 
86
                        
-
 
87
// 1 : Traitement colonnes 
-
 
88
 
-
 
89
		$line = array();
-
 
90
 
-
 
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
 
-
 
153
	}
-
 
154
 
-
 
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
	
-
 
181
 
-
 
182
}
-
 
183
 
-
 
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]);
33
		 // Controle detournement utilisateur
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
 
-
 
225
}
-
 
226
 
-
 
227
function traiterLigneComplement($line,$i) {
-
 
228
	$this->traiterImage($line[IMAGE][$i]);
-
 
229
	print "\n";
-
 
230
 
-
 
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)."'";
Line -... Line 250...
-
 
250
 
-
 
251
	}
Line -... Line 252...
-
 
252
	else {
-
 
253
		preg_match('/([0-9][0-9])|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
34
		 session_start();
254
		if ($elements[1]) { // code insee  commune
Line -... Line 255...
-
 
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 ".
Line -... Line 338...
-
 
338
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
-
 
339
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
-
 
340
                                "   , eflore_selection_nom".
35
		 $this->controleUtilisateur($uid[0]);
341
                                        " WHERE en_id_version_projet_nom = '25' AND en_nom_genre LIKE '".$DB->escapeSimple($genre)."%' " .
Line -... Line 342...
-
 
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 ".
36
			
348
                                        " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
37
		
349
                                        " AND esn_id_nom= en_id_nom ".
38
// Begin
-
 
39
 
-
 
40
 
-
 
41
$data = new Spreadsheet_Excel_Reader("import.xls", false); // false : pour menager la memoire.
-
 
42
 
-
 
43
$arr = array();
-
 
44
 
-
 
45
        for($row=1;$row<=$data->rowcount(0);$row++) 
-
 
46
                for($col=1;$col<=$data->colcount(0);$col++) 
-
 
47
                        $arr[$row][$col] = $data->val($row,$col,0);
-
 
48
                        
-
 
49
print_r($arr);
-
 
50
 
350
                                        " ORDER BY esn_ce_statut, en_ce_rang, en_epithete_espece, en_nom_genre LIMIT 50";
51
 
351
 
52
	}
352