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();
|