Line 157... |
Line 157... |
157 |
parent::__construct($config);
|
157 |
parent::__construct($config);
|
158 |
}
|
158 |
}
|
Line 159... |
Line 159... |
159 |
|
159 |
|
160 |
function createElement($pairs) {
|
160 |
function createElement($pairs) {
|
161 |
if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
|
161 |
if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
|
162 |
echo '0'; exit;
|
162 |
exit('0');
|
Line 163... |
Line 163... |
163 |
}
|
163 |
}
|
164 |
|
164 |
|
Line 177... |
Line 177... |
177 |
/* list(self;;$insert_prefix_ordre, self::$insert_ligne_pattern_ordre) =
|
177 |
/* list(self;;$insert_prefix_ordre, self::$insert_ligne_pattern_ordre) =
|
178 |
$this->initialiser_pdo_ordered_statements($this->colonnes_statiques); */
|
178 |
$this->initialiser_pdo_ordered_statements($this->colonnes_statiques); */
|
179 |
list(self::$insert_prefix, self::$insert_ligne_pattern) =
|
179 |
list(self::$insert_prefix, self::$insert_ligne_pattern) =
|
180 |
$this->initialiser_pdo_statements($this->colonnes_statiques);
|
180 |
$this->initialiser_pdo_statements($this->colonnes_statiques);
|
Line 181... |
Line -... |
181 |
|
- |
|
182 |
|
181 |
|
Line 183... |
Line 182... |
183 |
$infos_fichier = array_pop($_FILES);
|
182 |
$infos_fichier = array_pop($_FILES);
|
184 |
|
183 |
|
Line 293... |
Line 292... |
293 |
}
|
292 |
}
|
Line 294... |
Line 293... |
294 |
|
293 |
|
Line 295... |
Line 294... |
295 |
restore_error_handler();
|
294 |
restore_error_handler();
|
296 |
|
295 |
|
- |
|
296 |
if($this->bilan) echo implode("\n", $this->bilan) . "\n";
|
- |
|
297 |
$summary = sprintf('%1$d observation%2$c ajoutée%2$c' . "\n" .
|
- |
|
298 |
'%3$d image%4$c attachée%4$c' . "\n" .
|
- |
|
299 |
// '%5$d mot%6$c-clef ajouté%6$c [TODO]' . "\n" . // TODO
|
297 |
if($this->bilan) echo implode("\n", $this->bilan) . "\n";
|
300 |
count($filtre->exclues) > 0? 'colonnes non-traitées: %7$s' . "\n" : '',
|
- |
|
301 |
|
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",
|
302 |
$obs_ajouts,
|
- |
|
303 |
count($obs_ajouts) > 1 ? 's' : '',
|
299 |
$obs_ajouts,
|
304 |
$nb_images_ajoutees,
|
- |
|
305 |
count($nb_images_ajoutees) > 1 ? 's' : '',
|
300 |
$nb_images_ajoutees,
|
306 |
$nb_mots_cle_ajoutes,
|
Line 301... |
Line 307... |
301 |
$nb_mots_cle_ajoutes,
|
307 |
count($nb_mots_cle_ajoutes) > 1 ? 's' : '',
|
302 |
implode(', ', $filtre->exclues));
|
308 |
implode(', ', $filtre->exclues));
|
Line 318... |
Line 324... |
318 |
$colonnes_reconnues[$k] = 1;
|
324 |
$colonnes_reconnues[$k] = 1;
|
319 |
break;
|
325 |
break;
|
320 |
}
|
326 |
}
|
321 |
}
|
327 |
}
|
322 |
}
|
328 |
}
|
- |
|
329 |
// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
|
- |
|
330 |
// le tableau renvoyé par PHPExcel
|
- |
|
331 |
// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
|
- |
|
332 |
// les utilisent
|
- |
|
333 |
foreach($cols as $col) {
|
- |
|
334 |
if(!defined("C_" . strtoupper($col['abbrev'])))
|
- |
|
335 |
define("C_" . strtoupper($col['abbrev']), "C_" . strtoupper($col['abbrev']));
|
- |
|
336 |
}
|
Line 323... |
Line 337... |
323 |
|
337 |
|
Line 324... |
Line 338... |
324 |
// prépare le filtre de PHPExcel qui évitera le traitement de toutes les colonnes superflues
|
338 |
// prépare le filtre de PHPExcel qui évitera le traitement de toutes les colonnes superflues
|
325 |
|
339 |
|
Line 442... |
Line 456... |
442 |
cad aucune des valeurs retournée par traiter{Espece|Localisation}()
|
456 |
cad aucune des valeurs retournée par traiter{Espece|Localisation}()
|
443 |
car ce tableau est passé à un PDO::preparedStatement() qui applique
|
457 |
car ce tableau est passé à un PDO::preparedStatement() qui applique
|
444 |
proprement les règle d'échappement.
|
458 |
proprement les règle d'échappement.
|
445 |
*/
|
459 |
*/
|
446 |
static function chargerLigne($ligne, $dernier_ordre, $cel) {
|
460 |
static function chargerLigne($ligne, $dernier_ordre, $cel) {
|
- |
|
461 |
// évite des notices d'index lors des trigger_error()
|
- |
|
462 |
$ref_ligne = !empty($ligne[C_NOM_SEL]) ? trim($ligne[C_NOM_SEL]) : '';
|
- |
|
463 |
|
447 |
// en premier car le résultat est utile pour
|
464 |
// en premier car le résultat est utile pour
|
448 |
// * traiter espèce (traiterEspece())
|
465 |
// * traiter espèce (traiterEspece())
|
449 |
// * traiter longitude et latitude (traiterLonLat())
|
466 |
// * traiter longitude et latitude (traiterLonLat())
|
450 |
$referentiel = self::identReferentiel(trim(strtolower($ligne[C_NOM_REFERENTIEL])), $ligne);
|
467 |
$referentiel = self::identReferentiel(trim(strtolower(@$ligne[C_NOM_REFERENTIEL])), $ligne, $ref_ligne);
|
Line 451... |
Line 468... |
451 |
|
468 |
|
452 |
// $espece est rempli de plusieurs informations
|
469 |
// $espece est rempli de plusieurs informations
|
453 |
$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL,
|
470 |
$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL,
|
454 |
C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
|
471 |
C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
|
Line 479... |
Line 496... |
479 |
|
496 |
|
480 |
"zone_geo" => $localisation[C_ZONE_GEO],
|
497 |
"zone_geo" => $localisation[C_ZONE_GEO],
|
Line 481... |
Line 498... |
481 |
"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
|
498 |
"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
|
482 |
|
499 |
|
Line 483... |
Line 500... |
483 |
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
|
500 |
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
|
484 |
"date_observation" => self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne),
|
501 |
"date_observation" => isset($ligne[C_DATE_OBSERVATION]) ? self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ref_ligne) : NULL,
|
485 |
|
502 |
|
Line 493... |
Line 510... |
493 |
|
510 |
|
494 |
"transmission" => $transmission,
|
511 |
"transmission" => $transmission,
|
Line 495... |
Line 512... |
495 |
"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
|
512 |
"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
|
496 |
|
513 |
|
497 |
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
|
514 |
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
|
498 |
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne) : NULL,
|
515 |
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ref_ligne) : NULL,
|
Line 499... |
Line 516... |
499 |
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne) : NULL,
|
516 |
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ref_ligne) : NULL,
|
500 |
"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : NULL, // TODO: guess alt from lon/lat
|
517 |
"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : NULL, // TODO: guess alt from lon/lat
|
501 |
|
518 |
|
Line 558... |
Line 575... |
558 |
/* FONCTIONS de TRANSFORMATION de VALEUR DE CELLULE */
|
575 |
/* FONCTIONS de TRANSFORMATION de VALEUR DE CELLULE */
|
Line 559... |
Line 576... |
559 |
|
576 |
|
560 |
// TODO: PHP 5.3, utiliser date_parse_from_format()
|
577 |
// TODO: PHP 5.3, utiliser date_parse_from_format()
|
561 |
// TODO: parser les heures (cf product-owner)
|
578 |
// TODO: parser les heures (cf product-owner)
|
562 |
// TODO: passer par le timestamp pour s'assurer de la validité
|
579 |
// TODO: passer par le timestamp pour s'assurer de la validité
|
563 |
static function traiterDateObs($date, $ligne) {
|
580 |
static function traiterDateObs($date, $ref_ligne) {
|
564 |
// TODO: see https://github.com/PHPOffice/PHPExcel/issues/208
|
581 |
// TODO: see https://github.com/PHPOffice/PHPExcel/issues/208
|
565 |
if(is_double($date)) {
|
582 |
if(is_double($date)) {
|
566 |
if($date > 0)
|
583 |
if($date > 0)
|
567 |
return PHPExcel_Style_NumberFormat::toFormattedString($date, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) . " 00:00:00";
|
584 |
return PHPExcel_Style_NumberFormat::toFormattedString($date, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) . " 00:00:00";
|
568 |
trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": " .
|
585 |
trigger_error("ligne \"{$ref_ligne}\": " .
|
569 |
"Attention: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble",
|
586 |
"Attention: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble",
|
570 |
E_USER_NOTICE);
|
587 |
E_USER_NOTICE);
|
571 |
|
588 |
|
Line 572... |
Line 589... |
572 |
// throw new Exception("erreur: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble");
|
589 |
// throw new Exception("erreur: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble");
|
573 |
|
590 |
|
574 |
// attention, UNIX timestamp, car Excel les décompte depuis 1900
|
591 |
// attention, UNIX timestamp, car Excel les décompte depuis 1900
|
Line 588... |
Line 605... |
588 |
if(preg_match(';^([0-3]?\d)/([01]\d)/([12]\d\d\d)$;', $date, $matches)) {
|
605 |
if(preg_match(';^([0-3]?\d)/([01]\d)/([12]\d\d\d)$;', $date, $matches)) {
|
589 |
$date = $matches[3] . '/' . $matches[2] . '/' . $matches[1];
|
606 |
$date = $matches[3] . '/' . $matches[2] . '/' . $matches[1];
|
590 |
}
|
607 |
}
|
591 |
$timestamp = strtotime($date);
|
608 |
$timestamp = strtotime($date);
|
592 |
if(! $timestamp) {
|
609 |
if(! $timestamp) {
|
593 |
if($date) trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: date erronée ($date)", E_USER_NOTICE);
|
610 |
if($date) trigger_error("ligne \"{$ref_ligne}\": Attention: date erronée ($date)", E_USER_NOTICE);
|
594 |
return NULL;
|
611 |
return NULL;
|
595 |
}
|
612 |
}
|
596 |
return strftime("%Y-%m-%d 00:00:00", $timestamp);
|
613 |
return strftime("%Y-%m-%d 00:00:00", $timestamp);
|
597 |
}
|
614 |
}
|
598 |
}
|
615 |
}
|
Line 599... |
Line 616... |
599 |
|
616 |
|
600 |
static function identReferentiel($referentiel, $ligne) {
|
617 |
static function identReferentiel($referentiel, $ligne, $ref_ligne) {
|
601 |
// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
|
618 |
// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
|
602 |
if(strpos($referentiel, 'bdtfx') !== FALSE) return 'bdtfx:v1.01';
|
619 |
if(strpos($referentiel, 'bdtfx') !== FALSE) return 'bdtfx:v1.01';
|
603 |
if(strpos($referentiel, 'bdtxa') !== FALSE) return 'bdtxa:v1.00';
|
620 |
if(strpos($referentiel, 'bdtxa') !== FALSE) return 'bdtxa:v1.00';
|
604 |
if(strpos($referentiel, 'bdnff') !== FALSE) return 'bdnff:4.02';
|
621 |
if(strpos($referentiel, 'bdnff') !== FALSE) return 'bdnff:4.02';
|
605 |
if(strpos($referentiel, 'isfan') !== FALSE) return 'isfan:v1.00';
|
622 |
if(strpos($referentiel, 'isfan') !== FALSE) return 'isfan:v1.00';
|
Line 606... |
Line 623... |
606 |
if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
|
623 |
if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
|
607 |
|
624 |
|
608 |
if($referentiel) {
|
625 |
if($referentiel && isset($ligne[C_NOM_SEL]) && $ligne[C_NOM_SEL]) {
|
609 |
trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: référentiel inconnu", E_USER_NOTICE);
|
626 |
trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel inconnu", E_USER_NOTICE);
|
- |
|
627 |
return 'autre';
|
- |
|
628 |
}
|
610 |
return 'autre';
|
629 |
|
611 |
}
|
630 |
// pas de référentiel ou pas de NOM_SEL: NULL
|
612 |
return NULL;
|
631 |
return NULL;
|
613 |
/* TODO: cf story,
|
632 |
/* TODO: cf story,
|
614 |
En cas de NULL faire une seconde passe de détection à partir du nom saisi
|
633 |
En cas de NULL faire une seconde passe de détection à partir du nom saisi
|
Line 615... |
Line 634... |
615 |
+ accepter les n° de version */
|
634 |
+ accepter les n° de version */
|
616 |
}
|
635 |
}
|
617 |
|
636 |
|
618 |
static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01', $ligne) {
|
637 |
static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01', $ref_ligne) {
|
Line 619... |
Line 638... |
619 |
// en CSV ces valeurs sont des string, avec séparateur en français (","; cf défauts dans ExportXLS)
|
638 |
// en CSV ces valeurs sont des string, avec séparateur en français (","; cf défauts dans ExportXLS)
|
620 |
if($lon && is_string($lon)) $lon = str_replace(',', '.', $lon);
|
639 |
if($lon && is_string($lon)) $lon = str_replace(',', '.', $lon);
|
621 |
if($lat && is_string($lat)) $lat = str_replace(',', '.', $lat);
|
640 |
if($lat && is_string($lat)) $lat = str_replace(',', '.', $lat);
|
622 |
|
641 |
|
Line 623... |
Line 642... |
623 |
// sprintf applique une précision à 5 décimale (comme le ferait MySQL)
|
642 |
// sprintf applique une précision à 5 décimale (comme le ferait MySQL)
|
624 |
// tout en uniformisant le format de séparateur des décimales (le ".")
|
643 |
// tout en uniformisant le format de séparateur des décimales (le ".")
|
625 |
if($lon && is_numeric($lon) && $lon >= -180 && $lon <= 180) return sprintf('%.5F', $lon);
|
644 |
if($lon && is_numeric($lon) && $lon >= -180 && $lon <= 180) return sprintf('%.5F', $lon);
|
626 |
if($lat && is_numeric($lat) && $lat >= -90 && $lat <= 90) return sprintf('%.5F', $lat);
|
645 |
if($lat && is_numeric($lat) && $lat >= -90 && $lat <= 90) return sprintf('%.5F', $lat);
|
627 |
|
646 |
|
628 |
if($lon || $lat) {
|
647 |
if($lon || $lat) {
|
Line 654... |
Line 673... |
654 |
/*
|
673 |
/*
|
655 |
TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references,
|
674 |
TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references,
|
656 |
pour des questions de performances
|
675 |
pour des questions de performances
|
657 |
*/
|
676 |
*/
|
658 |
static function traiterEspece($ligne, Array &$espece, $referentiel, $cel) {
|
677 |
static function traiterEspece($ligne, Array &$espece, $referentiel, $cel) {
|
659 |
if(!$ligne[C_NOM_SEL]) return;
|
678 |
if(empty($ligne[C_NOM_SEL])) return;
|
Line 660... |
Line 679... |
660 |
|
679 |
|
661 |
// nom_sel reste toujours celui de l'utilisateur
|
680 |
// nom_sel reste toujours celui de l'utilisateur
|
Line 662... |
Line 681... |
662 |
$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
|
681 |
$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
|
Line 710... |
Line 729... |
710 |
*/
|
729 |
*/
|
711 |
$espece[C_NOM_RET] = $complement['Nom_Retenu'];
|
730 |
$espece[C_NOM_RET] = $complement['Nom_Retenu'];
|
712 |
$espece[C_NOM_RET_NN] = $complement['Num_Nom_Retenu'];
|
731 |
$espece[C_NOM_RET_NN] = $complement['Num_Nom_Retenu'];
|
713 |
$espece[C_NT] = $complement['Num_Taxon'];
|
732 |
$espece[C_NT] = $complement['Num_Taxon'];
|
714 |
$espece[C_FAMILLE] = $complement['Famille'];
|
733 |
$espece[C_FAMILLE] = $complement['Famille'];
|
715 |
//var_dump("a", $espece);die;
|
734 |
//var_dump($complement, $espece);die;
|
716 |
}
|
735 |
}
|
Line 717... |
Line 736... |
717 |
|
736 |
|
718 |
static function detectFromNom($nom) {
|
737 |
static function detectFromNom($nom) {
|
719 |
$r = Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
|
738 |
$r = Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
|
Line 728... |
Line 747... |
728 |
return $r;
|
747 |
return $r;
|
729 |
}
|
748 |
}
|
Line 730... |
Line 749... |
730 |
|
749 |
|
- |
|
750 |
|
- |
|
751 |
static function traiterLocalisation($ligne, Array &$localisation) {
|
- |
|
752 |
if(empty($ligne[C_ZONE_GEO])) $ligne[C_ZONE_GEO] = NULL;
|
731 |
|
753 |
if(empty($ligne[C_CE_ZONE_GEO])) $ligne[C_CE_ZONE_GEO] = NULL;
|
732 |
static function traiterLocalisation($ligne, Array &$localisation) {
|
754 |
|
733 |
$identifiant_commune = trim($ligne[C_ZONE_GEO]);
|
755 |
$identifiant_commune = trim($ligne[C_ZONE_GEO]);
|
734 |
if(!$identifiant_commune) {
|
756 |
if(!$identifiant_commune) {
|
735 |
$departement = trim($ligne[C_CE_ZONE_GEO]);
|
757 |
$departement = trim($ligne[C_CE_ZONE_GEO]);
|