Subversion Repositories eFlore/Applications.cel

Rev

Rev 449 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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