Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1740 Rev 1762
Line 194... Line 194...
194
		// renomme le fichier pour lui ajouter son extension initiale, ce qui
194
		// renomme le fichier pour lui ajouter son extension initiale, ce qui
195
		// permet (une sorte) d'autodétection du format.
195
		// permet (une sorte) d'autodétection du format.
196
		$fichier = $infos_fichier['tmp_name'];
196
		$fichier = $infos_fichier['tmp_name'];
197
		$extension = pathinfo($infos_fichier['name'], PATHINFO_EXTENSION);
197
		$extension = pathinfo($infos_fichier['name'], PATHINFO_EXTENSION);
198
		if( (strlen($extension) == 3 || strlen($extension) == 4) &&
198
		if( (strlen($extension) == 3 || strlen($extension) == 4) &&
199
			(@rename($fichier, $fichier . '.' . $extension))) {
199
			(@rename($fichier, $fichier . '.' . $extension))) { // XXX: @ safe-mode
200
			$fichier = $fichier . '.' . $extension;
200
			$fichier = $fichier . '.' . $extension;
201
		}
201
		}
Line 202... Line 202...
202
 
202
 
203
		$objReader = PHPExcel_IOFactory::createReaderForFile($fichier);
203
		$objReader = PHPExcel_IOFactory::createReaderForFile($fichier);
Line 293... Line 293...
293
		}
293
		}
Line 294... Line 294...
294
 
294
 
Line 295... Line 295...
295
		restore_error_handler();
295
		restore_error_handler();
296
 
296
 
297
		if($this->bilan) echo implode("\n", $this->bilan) . "\n";
297
		if($this->bilan) echo implode("\n", $this->bilan) . "\n";
298
 		$summary = sprintf("%d observation(s) ajoutée(s)\n%d image(s) attachée(s)\n%d mot(s)-clé ajouté(s) [TODO]\n",
298
 		$summary = sprintf("%d observation(s) ajoutée(s)\n%d image(s) attachée(s)\n%d mot(s)-clé ajouté(s) [TODO]\ncolonnes non-traitées: %s\n",
299
						   $obs_ajouts,
299
						   $obs_ajouts,
-
 
300
						   $nb_images_ajoutees,
Line 300... Line 301...
300
						   $nb_images_ajoutees,
301
						   $nb_mots_cle_ajoutes,
301
						   $nb_mots_cle_ajoutes);
302
						   implode(', ', $filtre->exclues));
Line 302... Line 303...
302
 
303
 
Line 442... Line 443...
442
	  car ce tableau est passé à un PDO::preparedStatement() qui applique
443
	  car ce tableau est passé à un PDO::preparedStatement() qui applique
443
	  proprement les règle d'échappement.
444
	  proprement les règle d'échappement.
444
	 */
445
	 */
445
	static function chargerLigne($ligne, $dernier_ordre, $cel) {
446
	static function chargerLigne($ligne, $dernier_ordre, $cel) {
446
		// en premier car le résultat est utile pour
447
		// en premier car le résultat est utile pour
-
 
448
		// * traiter espèce (traiterEspece())
447
		// traiter longitude et latitude (traiterLonLat())
449
		// * traiter longitude et latitude (traiterLonLat())
448
		$referentiel = self::identReferentiel($ligne[C_NOM_REFERENTIEL]);
450
		$referentiel = self::identReferentiel(trim(strtolower($ligne[C_NOM_REFERENTIEL])), $ligne);
Line 449... Line 451...
449
 
451
 
450
		// $espece est rempli de plusieurs informations
452
		// $espece est rempli de plusieurs informations
451
		$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL,
453
		$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL,
452
						C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
454
						C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
Line 453... Line 455...
453
		self::traiterEspece($ligne, $espece, $cel);
455
		self::traiterEspece($ligne, $espece, $referentiel, $cel);
454
 
456
 
455
		// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
457
		// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
Line 479... Line 481...
479
			"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
481
			"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
Line 480... Line 482...
480
 
482
 
481
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
483
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
Line 482... Line 484...
482
			"date_observation" => self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne),
484
			"date_observation" => self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne),
483
 
485
 
484
			"lieudit" => trim($ligne[C_LIEUDIT]),
486
			"lieudit" => isset($ligne[C_LIEUDIT]) ? trim($ligne[C_LIEUDIT]) : NULL,
Line 485... Line 487...
485
			"station" => trim($ligne[C_STATION]),
487
			"station" => isset($ligne[C_STATION]) ? trim($ligne[C_STATION]) : NULL,
486
			"milieu" => trim($ligne[C_MILIEU]),
488
			"milieu" => isset($ligne[C_MILIEU]) ? trim($ligne[C_MILIEU]) : NULL,
487
 
489
 
Line 488... Line 490...
488
			"mots_cles_texte" => NULL, // TODO: foreign-key
490
			"mots_cles_texte" => NULL, // TODO: foreign-key
489
			// XXX: @ contre "Undefined index"
491
			// XXX: @ contre "Undefined index"
Line 490... Line 492...
490
			"commentaire" => @trim($ligne[C_COMMENTAIRE]),
492
			"commentaire" => isset($ligne[C_COMMENTAIRE]) ? trim($ligne[C_COMMENTAIRE]) : NULL,
491
 
493
 
492
			"transmission" => $transmission,
494
			"transmission" => $transmission,
493
			"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
495
			"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
Line 494... Line 496...
494
 
496
 
495
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
497
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
496
			"latitude" => self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne),
498
			"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne) : NULL,
497
			"longitude" => self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne),
499
			"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne) : NULL,
Line 519... Line 521...
519
		$liste_images = array_filter(explode("/", $str));
521
		$liste_images = array_filter(explode("/", $str));
Line 520... Line 522...
520
 
522
 
521
		//array_walk($liste_images, '__anonyme_4');
523
		//array_walk($liste_images, '__anonyme_4');
522
		array_walk($liste_images, array(__CLASS__, '__anonyme_4'));
524
		array_walk($liste_images, array(__CLASS__, '__anonyme_4'));
523
		$requete = sprintf(
525
		$requete = sprintf(
524
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
526
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (%s)",
525
			$id_utilisateur,
527
			$id_utilisateur,
Line 526... Line 528...
526
			implode('","', $liste_images));
528
			implode(',', $liste_images));
Line 527... Line 529...
527
 
529
 
528
		$resultat = Cel::db()->requeter($requete);
530
		$resultat = Cel::db()->requeter($requete);
Line 578... Line 580...
578
			// echo strftime("%Y/%m/%d 00:00:00", $timestamp); // NON
580
			// echo strftime("%Y/%m/%d 00:00:00", $timestamp); // NON
579
		}
581
		}
580
		else {
582
		else {
581
			// attend l'un des formats de
583
			// attend l'un des formats de
582
			// http://www.php.net/manual/fr/datetime.formats.date.php
584
			// http://www.php.net/manual/fr/datetime.formats.date.php
583
			// le plus simple: YYYY/MM/DD (utilisé à l'export)
585
			// le plus simple: YYYY/MM/DD (utilisé à l'export), mais DD-MM-YYYY est aussi supporté
-
 
586
			$matches = NULL;
-
 
587
			// et on essaie d'être sympa et supporter aussi DD/MM/YYYY
-
 
588
			if(preg_match(';^([0-3]?\d)/([01]\d)/([12]\d\d\d)$;', $date, $matches)) {
-
 
589
				$date = $matches[3] . '/' . $matches[2] . '/' . $matches[1];
-
 
590
			}
584
			$timestamp = strtotime($date);
591
			$timestamp = strtotime($date);
585
			if(! $timestamp) {
592
			if(! $timestamp) {
586
				if($date) trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: date erronée ($date)", E_USER_NOTICE);
593
				if($date) trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: date erronée ($date)", E_USER_NOTICE);
587
				return NULL;
594
				return NULL;
588
			}
595
			}
589
			return strftime("%Y-%m-%d 00:00:00", $timestamp);
596
			return strftime("%Y-%m-%d 00:00:00", $timestamp);
590
		}
597
		}
591
	}
598
	}
Line 592... Line 599...
592
 
599
 
593
	static function identReferentiel($referentiel) {
600
	static function identReferentiel($referentiel, $ligne) {
594
		// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
601
		// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
595
		if(strpos(strtolower($referentiel), 'bdtfx') !== FALSE) return 'bdtfx:v1.01';
602
		if(strpos($referentiel, 'bdtfx') !== FALSE) return 'bdtfx:v1.01';
596
		if(strpos(strtolower($referentiel), 'bdtxa') !== FALSE) return 'bdtxa:v1.00';
603
		if(strpos($referentiel, 'bdtxa') !== FALSE) return 'bdtxa:v1.00';
597
		if(strpos(strtolower($referentiel), 'bdnff') !== FALSE) return 'bdnff:4.02';
604
		if(strpos($referentiel, 'bdnff') !== FALSE) return 'bdnff:4.02';
-
 
605
		if(strpos($referentiel, 'isfan') !== FALSE) return 'isfan:v1.00';
Line 598... Line 606...
598
		if(strpos(strtolower($referentiel), 'isfan') !== FALSE) return 'isfan:v1.00';
606
		if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
599
 
607
 
-
 
608
		if($referentiel) {
600
		if($referentiel) {
609
			trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: référentiel inconnu", E_USER_NOTICE);
601
			trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: référentiel inconnu", E_USER_NOTICE);
610
			return 'autre';
602
		}
611
		}
603
		return NULL;
612
		return NULL;
604
		/* TODO: cf story,
613
		/* TODO: cf story,
Line 644... Line 653...
644
 
653
 
645
	/*
654
	/*
646
	  TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references,
655
	  TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references,
647
	  pour des questions de performances
656
	  pour des questions de performances
648
	*/
657
	*/
649
	static function traiterEspece($ligne, Array &$espece, $cel) {
658
	static function traiterEspece($ligne, Array &$espece, $referentiel, $cel) {
Line 650... Line 659...
650
		if(!$ligne[C_NOM_SEL]) return;
659
		if(!$ligne[C_NOM_SEL]) return;
651
 
660
 
Line 652... Line 661...
652
		// nom_sel reste toujours celui de l'utilisateur
661
		// nom_sel reste toujours celui de l'utilisateur
Line 653... Line 662...
653
		$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
662
		$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
Line 654... Line 663...
654
 
663
 
655
		$taxon_info_webservice = new RechercheInfosTaxonBeta($cel->config);
664
		$taxon_info_webservice = new RechercheInfosTaxonBeta($cel->config, $referentiel);
Line 666... Line 675...
666
		  SELECT num_nom, nom_sci, num_nom_retenu ,auteur, annee, biblio_origine, nom_sci,auteur  FROM bdtfx_v1_01  WHERE (nom_sci LIKE 'eliotropium% euro%')  ORDER BY nom_sci ASC   LIMIT 0, 1
675
		  SELECT num_nom, nom_sci, num_nom_retenu ,auteur, annee, biblio_origine, nom_sci,auteur  FROM bdtfx_v1_01  WHERE (nom_sci LIKE 'eliotropium% euro%')  ORDER BY nom_sci ASC   LIMIT 0, 1
667
		  #
676
		  #
Line 668... Line 677...
668
 
677
 
669
		  SELECT nom_sci, num_nom_retenu, nom_sci_html, auteur, annee, biblio_origine FROM bdtfx_v1_01 WHERE num_nom = 31468
678
		  SELECT nom_sci, num_nom_retenu, nom_sci_html, auteur, annee, biblio_origine FROM bdtfx_v1_01 WHERE num_nom = 31468
670
		*/
679
		*/
-
 
680
		// $resultat_recherche_espece = $taxon_info_webservice->rechercherInformationsComplementairesSurNom($ligne[C_NOM_SEL]);
-
 
681
		// permet une reconnaissance de BDNFFnnXXXX
671
		$resultat_recherche_espece = $taxon_info_webservice->rechercherInformationsComplementairesSurNom($ligne[C_NOM_SEL]);
682
		$resultat_recherche_espece = $taxon_info_webservice->rechercherInfosSurTexteCodeOuNumTax(trim($ligne[C_NOM_SEL]));
-
 
683
 
-
 
684
		// note: rechercherInfosSurTexteCodeOuNumTax peut ne retourner qu'une seule clef "nom_sel"
672
 
685
		if (! $resultat_recherche_espece || !isset($resultat_recherche_espece['en_id_nom'])) {
673
		// on supprime les noms retenus et renvoi tel quel
686
			// on supprime les noms retenus et renvoi tel quel
674
		// on réutilise les define pour les noms d'indexes, tant qu'à faire
-
 
675
		if (! $resultat_recherche_espece) {
687
			// on réutilise les define pour les noms d'indexes, tant qu'à faire
676
			// XXX; tout à NULL sauf C_NOM_SEL ci-dessus ?
688
			// XXX; tout à NULL sauf C_NOM_SEL ci-dessus ?
677
			$espece[C_NOM_SEL_NN] = $ligne[C_NOM_SEL_NN];
689
			$espece[C_NOM_SEL_NN] = $ligne[C_NOM_SEL_NN];
678
			$espece[C_NOM_RET] = $ligne[C_NOM_RET];
690
			$espece[C_NOM_RET] = $ligne[C_NOM_RET];
679
			$espece[C_NOM_RET_NN] = $ligne[C_NOM_RET_NN];
691
			$espece[C_NOM_RET_NN] = $ligne[C_NOM_RET_NN];
Line 682... Line 694...
682
 
694
 
683
			return;
695
			return;
Line 684... Line 696...
684
		}
696
		}
685
 
697
 
686
		// succès de la détection = écrasement du numéro nomenclatural saisi...
698
		// succès de la détection = écrasement du numéro nomenclatural saisi...
Line 687... Line 699...
687
		$espece[C_NOM_SEL_NN] = $resultat_recherche_espece[0][0];
699
		$espece[C_NOM_SEL_NN] = $resultat_recherche_espece['en_id_nom'];
688
		// et des info complémentaires
700
		// et des info complémentaires
689
 
701
 
690
		// echo "rechercherInformationsComplementairesSurNumNom()\n";
702
		// echo "rechercherInformationsComplementairesSurNumNom()\n";
691
		$complement = $taxon_info_webservice->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece[0][0]);
703
		$complement = $taxon_info_webservice->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
692
		/*
704
		/*
693
		  // GET /service:eflore:0.1/bdtfx/noms/31468?retour.champs=nom_sci,auteur,id,nom_retenu_complet,nom_retenu.id,num_taxonomique,famille
705
		  // GET /service:eflore:0.1/bdtfx/noms/31468?retour.champs=nom_sci,auteur,id,nom_retenu_complet,nom_retenu.id,num_taxonomique,famille
Line 738... Line 750...
738
 
750
 
Line 739... Line 751...
739
			$departement = trim($departement); // TODO
751
			$departement = trim($departement); // TODO
740
 
752
 
741
			$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
753
			$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
742
			$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
754
			$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
Line 743... Line 755...
743
 
755
			return;
Line 744... Line 756...
744
		}
756
		}
745
 
757
 
746
 
758
 
747
		$select = "SELECT DISTINCT nom, code  FROM cel_zones_geo";
759
		$select = "SELECT DISTINCT nom, code  FROM cel_zones_geo";
748
	
760
	
749
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
761
		if (preg_match('/(.+) \((\d+)\)/', $identifiant_commune, $elements)) {
Line 864... Line 876...
864
 
876
 
Line 865... Line 877...
865
 
877
 
-
 
878
	/* HELPERS */
866
	/* HELPERS */
879
 
867
 
880
	// http://stackoverflow.com/questions/348410/sort-an-array-based-on-another-array
868
	// http://stackoverflow.com/questions/348410/sort-an-array-based-on-another-array
881
	// XXX; utilisé aussi (temporairement ?) par FormateurGroupeColonne.
869
	static function sortArrayByArray($array, $orderArray) {
882
	static function sortArrayByArray($array, $orderArray) {
870
		$ordered = array();
883
		$ordered = array();