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
 
483 david 6
 
7
// TODO : traiter image multilignes
8
 
480 david 9
/*
417 aurelien 10
 
480 david 11
Octobre 2010 David Delon.
12
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
13
et liaison d'images déjà chargee aux observations ainsi crées.
417 aurelien 14
 
480 david 15
Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé
16
Aucune valeur dans les colonnes n'est obligatoire
17
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
18
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
19
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
445 david 20
 
480 david 21
*/
445 david 22
 
480 david 23
 
24
// Nom des colonnes
25
 
445 david 26
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
27
define('LIEUDIT','lieu-dit'); // Texte libre
28
define('STATION','station'); // Texte libre
29
define('MILIEU','milieu'); // Texte libre
30
define('LATITUDE','latitude'); // En decimal systeme WGS84
31
define('LONGITUDE','longitude'); // En decimal systeme WGS84
32
define('NOTES','notes'); // Texte libre
33
define('DATEOBS','date'); // date au format jj/mm/aaaa
34
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
35
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
36
 
480 david 37
// Resultat de l'analyse d'une ligne
445 david 38
define('LIGNE_VIDE',1); //
39
define('LIGNE_NORMALE',2); //
40
define('LIGNE_IMAGE_SEULEMENT',3); //
41
 
449 david 42
include_once('Decoupage.class.php'); // TODO : Autoload
43
include_once('DecoupageNomLatin.class.php');
445 david 44
 
45
// Element constituant une observation
46
 
417 aurelien 47
Class InventoryImportExcel extends DBAccessor  {
48
 
445 david 49
// Element constituant une observation
417 aurelien 50
 
445 david 51
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION ,MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,IMAGE );
480 david 52
 
53
 
54
// Fichier configuration
417 aurelien 55
	var $config;
480 david 56
 
57
// Encapsulation classe lecture fichier excel
58
 
417 aurelien 59
	var $extendExcelReader;
60
 
480 david 61
/**
62
 Constructeur
63
**/
417 aurelien 64
	function InventoryImportExcel($config) {
65
 
66
		$this->config=$config;
67
		// Pas d'heritage multiple en php :(
68
 
69
		$this->extendExcelReader = new ExcelReader();
70
		$this->extendExcelReader->initExcelReader();
71
	}
72
 
480 david 73
/**
74
 Sur post
75
**/
445 david 76
	function createElement($pairs) {
417 aurelien 77
 
78
 
480 david 79
		$pairs['utilisateur']=$_POST['identifiant'];
417 aurelien 80
 
480 david 81
 
445 david 82
		session_start();
480 david 83
                $this->controleUtilisateur($pairs['utilisateur']);
417 aurelien 84
 
85
 
480 david 86
		foreach($_FILES as $file) { // C'est le plus simple
87
 
445 david 88
                        $infos_fichier = $file ;
89
                }
417 aurelien 90
 
91
 
480 david 92
// Chargement tableau en memoire
445 david 93
 
94
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
480 david 95
		$arr = array();
445 david 96
 
97
		$rowcount=$data->rowcount(0);
98
		$colcount=$data->colcount(0);
99
 
100
		if ($rowcount<=1) { // TODO : retour erreur
101
			print "Tableau vide";
102
			exit;
103
		}
104
 
105
	        for($row=1;$row<=$rowcount;$row++)
106
        	        for($col=1;$col<=$colcount;$col++)
107
                	        $arr[$col][$row] = $data->val($row,$col,0);
108
 
109
 
417 aurelien 110
 
445 david 111
// 1 : Traitement colonnes
417 aurelien 112
 
445 david 113
		$line = array();
417 aurelien 114
 
445 david 115
/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */
116
 
117
                for($col=1;$col<=$colcount;$col++) {
118
			$colonne=strtolower($arr[$col][1]);
119
			switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
120
				case COMMUNE:
121
				case LIEUDIT:
122
				case STATION:
123
				case MILIEU:
124
				case LATITUDE:
125
				case LONGITUDE:
126
				case NOTES:
127
				case DATEOBS:
128
				case ESPECE:
129
				case IMAGE:
130
					$selection=array_values($arr[$col]);
131
					array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
132
					$line[$colonne]=$selection;
133
					break;
134
 
135
			}
136
		}
137
 
138
	/*
139
		print_r($line[COMMUNE]);
140
		print_r($line[LIEUDIT]);
141
		print_r($line[STATION]);
142
		print_r($line[MILIEU]);
143
		print_r($line[LATITUDE]);
144
		print_r($line[LONGITUDE]);
145
		print_r($line[NOTES]);
146
		print_r($line[DATEOBS]);
147
		print_r($line[ESPECE]);
148
		print_r($line[IMAGE]);
149
	*/
150
 
151
// 1 : Traitement lignes
152
 
483 david 153
		$cpt_obs=0;
480 david 154
		for ($i=0;$i<=$rowcount-1;$i++) {
155
			// On saute les lignes vides du debut et les lignes contenant des information sur image uniquement
156
			while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
157
				if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
158
	//				print "image non rattachee a une observation";
159
				}
160
				else {
161
	//				print "vide";
162
				}
445 david 163
				$i++;
164
			}
480 david 165
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
166
				$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur']);
483 david 167
				if ($ordre>0) {
168
					$cpt_obs++; // Compteur d'observations crees
169
				}
445 david 170
				$i++;
480 david 171
				// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
172
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
445 david 173
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
480 david 174
						$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$ordre); // images supplementaires
445 david 175
					}
176
					else {
480 david 177
	//					print "vide";
445 david 178
					}
179
					$i++;
180
				}
181
			}
182
 
183
 
184
		}
483 david 185
		print $cpt_obs;
445 david 186
 
417 aurelien 187
	}
188
 
445 david 189
function analyserLigne($line,$i) {
190
	$ligne_vide=true;
191
	$ligne_image_seulement=true;
192
	$ligne_normale=true;
193
	foreach ($this->format_observation as $colonne) {
194
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
195
			if ($colonne!=IMAGE) {
196
				$ligne_image_seulement=false;
197
				$ligne_vide=false;
198
				break;
199
			}
200
			$ligne_vide=false;
201
		}
202
	}
203
	if ($ligne_vide) {
204
		return LIGNE_VIDE;
205
	}
206
	else {
207
		if ($ligne_image_seulement) {
208
			return LIGNE_IMAGE_SEULEMENT;
209
		}
210
		else {
211
			return LIGNE_NORMALE;
212
		}
213
	}
214
 
417 aurelien 215
 
445 david 216
}
417 aurelien 217
 
480 david 218
function traiterLigne($line,$i,$utilisateur) { // Controle donnee et insertion
219
	$info_image=array();
445 david 220
	foreach ($this->format_observation as $colonne) {
221
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
222
			switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
223
				case COMMUNE:
224
					$info_commune=$this->traiterCommune($line[COMMUNE][$i]);
225
					break;
226
				case LIEUDIT:
480 david 227
					$info_lieudit=$this->traiterLieudit($line[LIEUDIT][$i]);
445 david 228
					break;
229
				case STATION:
480 david 230
					$info_station=$this->traiterStation($line[STATION][$i]);
445 david 231
					break;
232
				case MILIEU:
480 david 233
					$info_milieu=$this->traiterMilieu($line[MILIEU][$i]);
445 david 234
					break;
235
				case LATITUDE:
480 david 236
					$info_latitude=$this->traiterLatitude($line[LATITUDE][$i]);
445 david 237
					break;
238
				case LONGITUDE:
480 david 239
					$info_longitude=$this->traiterLongitude($line[LONGITUDE][$i]);
445 david 240
					break;
241
				case NOTES:
480 david 242
					$info_notes=$this->traiterNotes($line[NOTES][$i]);
445 david 243
					break;
244
				case DATEOBS:
480 david 245
					$info_dateobs=$this->traiterDateObs($line[DATEOBS][$i]);
445 david 246
					break;
247
				case ESPECE:
480 david 248
					$info_espece=$this->traiterEspece($line[ESPECE][$i]);
249
					if (isset($info_espece['en_id_nom']) && $info_espece['en_id_nom']!='') {
250
						$complement=$this->rechercherInformationsComplementaires($info_espece['en_id_nom']);
251
						$info_espece['nom_ret']=$complement['Nom_Retenu'];
252
	        	                        $info_espece['num_nom_ret']=$complement['Num_Nom_Retenu'];
253
        	        	                $info_espece['num_taxon']=$complement['Num_Taxon'];
254
                	        	        $info_espece['famille']=$complement['Famille'];
255
					}
256
 
257
 
445 david 258
					break;
259
				case IMAGE:
480 david 260
					$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
445 david 261
					break;
262
			}
263
		}
480 david 264
		else {
265
		 	switch($colonne) {
266
				case COMMUNE:
267
					$info_commune['name']="000null";
268
					$info_commune['code']="000null";
269
					break;
270
				case LIEUDIT:
271
					$info_lieudit="000null";
272
					break;
273
				case STATION:
274
					$info_station="000null";
275
					break;
276
				case MILIEU:
277
					$info_milieu="000null";
278
					break;
279
				case LATITUDE:
280
					$info_latitude="000null";
281
					break;
282
				case LONGITUDE:
283
					$info_longitude="000null";
284
					break;
285
 
286
			}
287
 
288
		}
445 david 289
	}
290
 
480 david 291
                // Dernier numero d'ordre utilise :
292
 
293
                $DB=$this->connectDB($this->config,'database_cel'); // TODO / a garder en memoire pour eviter appels mutliples
294
                $query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($utilisateur)."' ";
295
 
296
                $res =& $DB->query($query);
297
                if (DB::isError($res)) {
298
                        die($res->getMessage());
299
                }
483 david 300
                $ordre=1;
480 david 301
 
302
                while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
303
                    $ordre=$row['ordre']+1;
304
                }
305
 
306
                list($jour,$mois,$annee)=split("/",$info_dateobs);
307
                $info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
308
 
309
 
310
	 $query  = "INSERT INTO cel_inventory (identifiant,ordre,nom_sel,num_nom_sel,nom_ret,num_nom_ret,num_taxon,famille,location,id_location,date_observation,lieudit,station, milieu, commentaire, date_creation,date_modification,coord_x,coord_y) " .
311
                " VALUES('".$DB->escapeSimple($utilisateur)."','".
312
                $DB->escapeSimple($ordre)."','".
313
                $DB->escapeSimple($info_espece['nom_sel'])."','".
314
                $DB->escapeSimple($info_espece['en_id_nom'])."','".
315
                $DB->escapeSimple($info_espece['nom_ret'])."','".
316
                $DB->escapeSimple($info_espece['num_nom_ret'])."','".
317
                $DB->escapeSimple($info_espece['num_taxon'])."','".
318
                $DB->escapeSimple($info_espece['famille'])."','".
319
                $DB->escapeSimple($info_commune['name'])."','".
320
                $DB->escapeSimple($info_commune['code'])."','".
321
                $DB->escapeSimple($info_dateobs)."','".
322
                $DB->escapeSimple($info_lieudit)."','".
323
                $DB->escapeSimple($info_station)."','".
324
                $DB->escapeSimple($info_milieu)."','".
325
                $DB->escapeSimple($info_notes)."',".
326
                "now() , now(),'".
327
                $DB->escapeSimple($info_latitude)."','".
328
                $DB->escapeSimple($info_longitude)."')";
329
//		print $query;
330
//		print "\n";
331
 
332
 
333
		   $res =& $DB->query($query);
334
 
335
                if (PEAR::isError($res)) {
336
                        return false;
337
                }
338
 
339
 
340
	// creation lien image
341
	foreach ($info_image as $pic) {
342
 
343
		$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'",    "'.$DB->escapeSimple($ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
344
 
345
//print $query;
346
 
347
		$res =& $DB->query($query);
348
 
349
                if (PEAR::isError($res)) {
350
                        return false;
351
                }
352
 
353
 
354
	}
355
 
356
 
357
 
358
		return $ordre;
359
 
360
 
417 aurelien 361
}
362
 
480 david 363
function traiterLigneComplement($line,$i,$utilisateur) {
417 aurelien 364
 
480 david 365
// TODO
366
 
445 david 367
}
368
function traiterCommune($identifiant_commune) {  // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
369
 
370
 
371
 
372
        $identifiant_commune=ltrim($identifiant_commune);
373
 
374
        $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
375
 
376
	preg_match('/(.*)\((.*)\)/',$identifiant_commune,$elements);
377
 
378
        $DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
379
 
380
	if ($elements[1]) { // departement present
381
		$nom_commune=$elements[1];
382
		$code_commune=$elements[2];
383
 
480 david 384
 	        $query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."' AND code ='".$DB->escapeSimple($code_commune)."'";
445 david 385
 
386
	}
387
	else {
388
		preg_match('/([0-9][0-9])|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
389
		if ($elements[1]) { // code insee  commune
390
			$code_insee_commune=$elements[1];
391
 	        	$query="SELECT DISTINCT name, code  FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'";
392
		}
393
		else {
394
		preg_match('/(.*)/',$identifiant_commune,$elements);
395
			if ($elements[1]) { // commune
396
				$nom_commune=$elements[1];
397
	 	        	$query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."'";
398
			}
399
		}
400
	}
401
 
402
 
403
	$res =& $DB->query($query);
404
 
405
        if (DB::isError($res)) {
406
		 die($res->getMessage());
407
	}
408
 
409
	return $res->fetchrow(DB_FETCHMODE_ASSOC);
410
 
411
 
412
 
413
 
414
}
415
 
416
function traiterLieudit($lieudit) { // texte libre
417
 
480 david 418
	//echo "traitement lieudit";
419
 
445 david 420
	return utf8_encode(ltrim($lieudit));
421
}
422
 
423
function traiterStation($station) { // texte libre
480 david 424
//	echo "traitement station";
445 david 425
	return utf8_encode(ltrim($station));
426
}
427
 
428
function traiterMilieu($milieu) { // texte libre
480 david 429
//	echo "traitement milieu";
445 david 430
	return utf8_encode(ltrim($milieu));
431
}
432
 
433
function traiterLatitude($latitude) {	//  verifier formal decimal + limite france ? TODO
480 david 434
//	echo "traitement latitude";
445 david 435
	return ltrim($latitude);
436
}
437
 
438
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
480 david 439
//	echo "traitement longitude";
445 david 440
	return ltrim($longitude);
441
}
442
 
443
function traiterNotes($notes) { // texte libre
480 david 444
//	echo "traitement notes";
445 david 445
	return utf8_encode(ltrim($notes));
446
}
447
 
448
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
480 david 449
//	echo "traitement dateobs";
450
	return ltrim($dateobs);
445 david 451
}
452
 
449 david 453
function traiterEspece($identifiant_espece) {  // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999)
454
 
480 david 455
//	echo "traitement  espece";
445 david 456
        $identifiant_espece=ltrim($identifiant_espece);
457
 
458
        $identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau
459
 
449 david 460
	preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements);
445 david 461
 
449 david 462
		if ($elements[1]) { // Numero nomenclatural
445 david 463
 
449 david 464
 
480 david 465
// Recherche du nom associe
466
                        $DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
467
                                      $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
445 david 468
                                        "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
469
                                        " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
470
                                        " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
471
                                        " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
449 david 472
                                        " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
473
                                        " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a,  " .
474
                                        "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
480 david 475
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
476
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
477
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
478
				     	" WHERE a.esn_id_nom= '".$elements[1]. "'".
479
					" AND a.esn_id_version_projet_taxon = 25 ".
480
				    	" AND en_ce_rang = enrg_id_rang" .
481
				     	" AND en_id_nom = a.esn_id_nom" .
482
				     	" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
483
				        " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
484
		                        " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
485
                   		        " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
486
                                        " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
487
 
488
				    	$res =& $DB->query($query);
489
 
490
 
491
					if (DB::isError($res)) {
492
						die($res->getMessage());
493
					}
494
 
495
					$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
496
		 			return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$elements[1]);
497
 
449 david 498
		}
499
 
500
		else { // Nom scientifique
501
 
502
 
503
			$decoupageNomLatin=new DecoupageNomLatin();
504
			$nom_latin_decoupe=$decoupageNomLatin->decouper($identifiant_espece);
505
 
506
/*
507
 
508
    [nom_genre] => Acer
509
    [nom_sp] => monspessulanum
510
    [auteur_sp] =>
511
    [nom_complement] =>
512
    [type_infrasp] =>
513
    [nom_infrasp] =>
514
    [num_nomenc] =>
515
    [num_taxo] =>
516
    [rang_taxonomique] => 250
517
    [nom_courant] => monspessulanum
518
    [nom_superieur] => Acer
519
    [agg] =>
520
    [nom_complet] => Acer monspessulanum
521
 
522
/*
523
 
524
  [nom_genre] => Acer
525
    [nom_sp] => monspessulanum
526
    [auteur_sp] =>
527
    [nom_complement] =>
528
    [type_infrasp] => subsp.
529
    [nom_infrasp] => monspessulanum
530
    [num_nomenc] =>
531
    [num_taxo] =>
532
    [rang_taxonomique] => 280
533
    [nom_courant] => monspessulanum
534
    [nom_superieur] => monspessulanum
535
    [agg] =>
536
    [nom_complet] => Acer monspessulanum subsp. monspessulanum
537
 
538
*/
539
 
540
 
480 david 541
        		$DB=$this->connectDB($this->config); // FIXME regarder si opportun ici
542
 
543
                      	$query="SELECT DISTINCT en_id_nom" .
544
                                        " FROM eflore_nom, eflore_nom_rang " .
545
                                        " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['nom_genre'])."' " .
546
                                        " AND en_ce_rang = '".$DB->escapeSimple($nom_latin_decoupe['rang_taxonomique'])."' " ;
547
					if (isset($nom_latin_decoupe['nom_infrasp']) && $nom_latin_decoupe['nom_infrasp']!="") {
548
						$query.=" AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['nom_infrasp'])."' " ;
549
					}
550
                                        $query.=" AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['nom_sp'])."' AND en_ce_rang = enrg_id_rang " .
551
                                        " LIMIT 1";
552
 
553
 
554
			}
555
 
556
			$res =& $DB->query($query);
557
 
558
			if (DB::isError($res)) {
559
				 die($res->getMessage());
560
			}
561
 
562
			$id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC);
563
 
564
			// Recherche du nom associe
565
                        $DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
566
                                      $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
449 david 567
                                        "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
568
                                        " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
569
                                        " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
570
                                        " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
480 david 571
                                        " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
572
                                        " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a,  " .
445 david 573
                                        "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
574
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
575
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
576
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
480 david 577
				     	" WHERE a.esn_id_nom= '".$id_nom['en_id_nom']. "'".
578
					" AND a.esn_id_version_projet_taxon = 25 ".
579
				    	" AND en_ce_rang = enrg_id_rang" .
580
				     	" AND en_id_nom = a.esn_id_nom" .
581
				     	" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
582
				        " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
583
		                        " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
584
                   		        " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
585
                                        " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
586
				$res =& $DB->query($query);
445 david 587
 
588
 
480 david 589
					if (DB::isError($res)) {
590
						die($res->getMessage());
591
					}
592
 
593
					$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
594
		 			return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);
595
 
596
 
597
 
598
 
599
 
445 david 600
}
601
 
602
 
603
 
480 david 604
function traiterImage($images,$utilisateur) { // recherche id image de ce nom
605
 
606
	//echo "traitement  image";
607
        $DB=$this->connectDB($this->config,'cel_db');
608
 
609
	$liste_images = explode("/",$images) ;
610
 
611
	$row =array();
612
        foreach($liste_images as $image) {
613
 
614
		$query="SELECT * FROM cel_images WHERE ci_ce_utilisateur='".$DB->escapeSimple($utilisateur)."' AND ci_nom_original='".$DB->escapeSimple($image)."'";
615
 
616
	        $res  =& $DB->query($query);
617
		$row [] =& $res->fetchrow(DB_FETCHMODE_ASSOC);
618
 
619
	        if (DB::isError($res)) {
620
        	    die($res->getMessage());
621
	        }
622
 
623
	}
624
	return $row;
625
 
626
 
445 david 627
}
628
 
629
 
449 david 630
// utilitaire : FIXME mutualiser avec autres scripts
445 david 631
 
480 david 632
       function rechercherInformationsComplementaires($numNom) {
633
 
634
                $DB=$this->connectDB($this->config);
635
 
636
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
637
                                                        "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
638
                                        " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
639
                                        " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
640
                                        " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
641
                             " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, b.esn_id_taxon, b.esn_id_nom" .
642
                             " FROM eflore_nom, eflore_nom_rang," .
643
                                                "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
644
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
645
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
646
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
647
                             " ,eflore_selection_nom a, eflore_selection_nom b".
648
                             " WHERE a.esn_id_nom= ".$numNom.
649
                             " AND a.esn_id_version_projet_taxon = 25 ".
650
                             " AND a.esn_id_taxon=b.esn_id_taxon ".
651
                             " AND b.esn_ce_statut=3 ".
652
                             " AND a.esn_id_version_projet_taxon=b.esn_id_version_projet_taxon" .
653
                             " AND en_ce_rang = enrg_id_rang" .
654
                             " AND en_id_nom = b.esn_id_nom" .
655
                             " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
656
                         " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
657
                         " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
658
                     " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
659
                             " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
660
 
661
 
662
           $res =& $DB->query($query);
663
 
664
 
665
 
666
        if (DB::isError($res)) {
667
                die($res->getMessage());
668
        }
669
 
670
                // Nom retenu, Num Nomen nom retenu, Num Taxon,
671
                                                                                // Famille
672
 
673
                $value=array('Nom_Retenu'=>"",'Num_Nom_Retenu'=>"0",'Num_Taxon'=>"0",'Famille'=>"");
674
 
675
                while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
676
                        $fam=$this->rechercherFamille($row['esn_id_taxon'],$DB);
677
                while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) {
678
                        $fam=$this->rechercherFamille($fam['etr_id_taxon_2'],$DB);
679
                }
680
                if ($fam['en_ce_rang']==120) {
681
                        $famille=$fam['en_nom_supra_generique'];
682
                }
683
                else {
684
                        $famille="Famille inconnue";
685
                }
686
                $value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille);
687
 
688
 
689
            }
690
 
691
            return $value;
692
 
693
 
694
 
695
        }
696
 
449 david 697
function formaterNom($rawnom) {
480 david 698
 
699
 
449 david 700
                // Constitution du nom:
701
                $nom = '';
445 david 702
 
449 david 703
                if ($rawnom['en_nom_supra_generique'] != '') {
704
                    $nom .= $rawnom['en_nom_supra_generique'];
705
                } else if ($rawnom['en_epithete_infra_generique'] != '') {
706
                    $nom .= $rawnom['en_epithete_infra_generique'];
707
                } else {
708
                        if ($rawnom['en_nom_genre'] != '') {
709
                            $nom .=  $rawnom['en_nom_genre'];
710
                        }
711
                        if ($rawnom['en_epithete_espece']!= '') {
712
                            $nom .= ' '.$rawnom['en_epithete_espece'];
713
                        }
714
                        if ($rawnom['en_epithete_infra_specifique'] != '') {
715
                                if (!empty($rawnom['enrg_abreviation_rang'])) {
716
                                        $nom .= ' '.$rawnom['enrg_abreviation_rang'].'';
717
                                }
718
                                $nom .= ' '.$rawnom['en_epithete_infra_specifique'];
719
                        }
720
 
721
                }
480 david 722
 
723
                return $nom .$this->retournerAuteur($rawnom) ;
724
 
725
 }
726
 
727
 
728
function rechercherFamille($taxon,&$DB) {
729
 
730
        $row=array();
731
 
732
        $query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ".
733
        " FROM eflore_taxon_relation, eflore_selection_nom, eflore_nom ".
734
        " WHERE etr_id_taxon_1 = ".$taxon.
735
        " AND etr_id_version_projet_taxon_1 = 25 ".
736
        " AND etr_id_categorie_taxon = 3 ".
737
        " AND etr_id_valeur_taxon = 3 ".
738
        " AND esn_id_taxon =  etr_id_taxon_2 ".
739
        " AND esn_ce_statut = 3 ".
740
        " AND esn_id_version_projet_taxon = etr_id_version_projet_taxon_1 ".
741
        " AND en_id_nom = esn_id_nom ".
742
        " AND esn_id_version_projet_taxon=en_id_version_projet_nom  ";
743
        $res =& $DB->query($query);
744
 
745
        if (DB::isError($res)) {
746
         die($res->getMessage());
747
        }
748
 
749
        if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
750
                return $row;
751
    }
752
    else {
753
        $row['en_ce_rang']='fin';
754
        return $row;
755
    }
756
 
445 david 757
}
758
 
480 david 759
 
449 david 760
function retournerAuteur($rawnom) {
480 david 761
                $auteurs = '';
762
                $auteur_basio = '';
763
                $auteur_modif = '';
764
                if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' )  {
765
                    $auteur_basio .= $rawnom['abreviation_auteur_basio_ex'];
766
                    if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
767
                        $auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio'];
768
                    }
769
                } else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
770
                    $auteur_basio .= $rawnom['abreviation_auteur_basio'];
771
                }
445 david 772
 
480 david 773
                if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') {
774
                    $auteur_modif .= $rawnom['abreviation_auteur_modif_ex'];
775
                    if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
776
                        $auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif'];
777
                    }
778
                } else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-')  {
779
                    $auteur_modif .= $rawnom['abreviation_auteur_modif'];
780
                }
445 david 781
 
480 david 782
                if (!empty($auteur_modif)) {
783
                    $auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
784
                } elseif (!empty($auteur_basio)) {
785
                    $auteurs = ' '.$auteur_basio;
786
                }
449 david 787
 
480 david 788
                return $auteurs ;
449 david 789
}
790
 
791
 
792
 
480 david 793
 
449 david 794
}
795
 
796
 
797
 
417 aurelien 798
/* +--Fin du code ---------------------------------------------------------------------------------------+
799
* $Log$
800
*
801
*
802
*/
803
 
804
 
805
?>