159,7 → 159,7 |
|
function createElement($pairs) { |
if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') { |
echo '0'; exit; |
exit('0'); |
} |
|
$id_utilisateur = intval($pairs['utilisateur']); |
179,7 → 179,6 |
list(self::$insert_prefix, self::$insert_ligne_pattern) = |
$this->initialiser_pdo_statements($this->colonnes_statiques); |
|
|
$infos_fichier = array_pop($_FILES); |
|
/*$objPHPExcel = PHPExcel_IOFactory::load($infos_fichier['tmp_name']); |
295,10 → 294,17 |
restore_error_handler(); |
|
if($this->bilan) echo implode("\n", $this->bilan) . "\n"; |
$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", |
$summary = sprintf('%1$d observation%2$c ajoutée%2$c' . "\n" . |
'%3$d image%4$c attachée%4$c' . "\n" . |
// '%5$d mot%6$c-clef ajouté%6$c [TODO]' . "\n" . // TODO |
count($filtre->exclues) > 0? 'colonnes non-traitées: %7$s' . "\n" : '', |
|
$obs_ajouts, |
count($obs_ajouts) > 1 ? 's' : '', |
$nb_images_ajoutees, |
count($nb_images_ajoutees) > 1 ? 's' : '', |
$nb_mots_cle_ajoutes, |
count($nb_mots_cle_ajoutes) > 1 ? 's' : '', |
implode(', ', $filtre->exclues)); |
|
die("$summary"); |
320,6 → 326,14 |
} |
} |
} |
// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans |
// le tableau renvoyé par PHPExcel |
// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece() |
// les utilisent |
foreach($cols as $col) { |
if(!defined("C_" . strtoupper($col['abbrev']))) |
define("C_" . strtoupper($col['abbrev']), "C_" . strtoupper($col['abbrev'])); |
} |
|
// prépare le filtre de PHPExcel qui évitera le traitement de toutes les colonnes superflues |
|
444,10 → 458,13 |
proprement les règle d'échappement. |
*/ |
static function chargerLigne($ligne, $dernier_ordre, $cel) { |
// évite des notices d'index lors des trigger_error() |
$ref_ligne = !empty($ligne[C_NOM_SEL]) ? trim($ligne[C_NOM_SEL]) : ''; |
|
// en premier car le résultat est utile pour |
// * traiter espèce (traiterEspece()) |
// * traiter longitude et latitude (traiterLonLat()) |
$referentiel = self::identReferentiel(trim(strtolower($ligne[C_NOM_REFERENTIEL])), $ligne); |
$referentiel = self::identReferentiel(trim(strtolower(@$ligne[C_NOM_REFERENTIEL])), $ligne, $ref_ligne); |
|
// $espece est rempli de plusieurs informations |
$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL, |
481,7 → 498,7 |
"ce_zone_geo" => $localisation[C_CE_ZONE_GEO], |
|
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible) |
"date_observation" => self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne), |
"date_observation" => isset($ligne[C_DATE_OBSERVATION]) ? self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ref_ligne) : NULL, |
|
"lieudit" => isset($ligne[C_LIEUDIT]) ? trim($ligne[C_LIEUDIT]) : NULL, |
"station" => isset($ligne[C_STATION]) ? trim($ligne[C_STATION]) : NULL, |
495,8 → 512,8 |
"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now() |
|
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible) |
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne) : NULL, |
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne) : NULL, |
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ref_ligne) : NULL, |
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ref_ligne) : NULL, |
"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : NULL, // TODO: guess alt from lon/lat |
|
// @ car potentiellement optionnelles ou toutes vides => pas d'index dans PHPExcel (tableau optimisé) |
560,15 → 577,15 |
// TODO: PHP 5.3, utiliser date_parse_from_format() |
// TODO: parser les heures (cf product-owner) |
// TODO: passer par le timestamp pour s'assurer de la validité |
static function traiterDateObs($date, $ligne) { |
static function traiterDateObs($date, $ref_ligne) { |
// TODO: see https://github.com/PHPOffice/PHPExcel/issues/208 |
if(is_double($date)) { |
if($date > 0) |
return PHPExcel_Style_NumberFormat::toFormattedString($date, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) . " 00:00:00"; |
trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": " . |
trigger_error("ligne \"{$ref_ligne}\": " . |
"Attention: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble", |
E_USER_NOTICE); |
|
|
// throw new Exception("erreur: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble"); |
|
// attention, UNIX timestamp, car Excel les décompte depuis 1900 |
590,7 → 607,7 |
} |
$timestamp = strtotime($date); |
if(! $timestamp) { |
if($date) trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: date erronée ($date)", E_USER_NOTICE); |
if($date) trigger_error("ligne \"{$ref_ligne}\": Attention: date erronée ($date)", E_USER_NOTICE); |
return NULL; |
} |
return strftime("%Y-%m-%d 00:00:00", $timestamp); |
597,7 → 614,7 |
} |
} |
|
static function identReferentiel($referentiel, $ligne) { |
static function identReferentiel($referentiel, $ligne, $ref_ligne) { |
// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC; |
if(strpos($referentiel, 'bdtfx') !== FALSE) return 'bdtfx:v1.01'; |
if(strpos($referentiel, 'bdtxa') !== FALSE) return 'bdtxa:v1.00'; |
605,10 → 622,12 |
if(strpos($referentiel, 'isfan') !== FALSE) return 'isfan:v1.00'; |
if(strpos($referentiel, 'autre') !== FALSE) return 'autre'; |
|
if($referentiel) { |
trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: référentiel inconnu", E_USER_NOTICE); |
if($referentiel && isset($ligne[C_NOM_SEL]) && $ligne[C_NOM_SEL]) { |
trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel inconnu", E_USER_NOTICE); |
return 'autre'; |
} |
|
// pas de référentiel ou pas de NOM_SEL: NULL |
return NULL; |
/* TODO: cf story, |
En cas de NULL faire une seconde passe de détection à partir du nom saisi |
615,7 → 634,7 |
+ accepter les n° de version */ |
} |
|
static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01', $ligne) { |
static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01', $ref_ligne) { |
// en CSV ces valeurs sont des string, avec séparateur en français (","; cf défauts dans ExportXLS) |
if($lon && is_string($lon)) $lon = str_replace(',', '.', $lon); |
if($lat && is_string($lat)) $lat = str_replace(',', '.', $lat); |
626,7 → 645,7 |
if($lat && is_numeric($lat) && $lat >= -90 && $lat <= 90) return sprintf('%.5F', $lat); |
|
if($lon || $lat) { |
trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": " . |
trigger_error("ligne \"{$ref_ligne}\": " . |
"Attention: longitude ou latitude erronée", |
E_USER_NOTICE); |
} |
656,7 → 675,7 |
pour des questions de performances |
*/ |
static function traiterEspece($ligne, Array &$espece, $referentiel, $cel) { |
if(!$ligne[C_NOM_SEL]) return; |
if(empty($ligne[C_NOM_SEL])) return; |
|
// nom_sel reste toujours celui de l'utilisateur |
$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]); |
712,7 → 731,7 |
$espece[C_NOM_RET_NN] = $complement['Num_Nom_Retenu']; |
$espece[C_NT] = $complement['Num_Taxon']; |
$espece[C_FAMILLE] = $complement['Famille']; |
//var_dump("a", $espece);die; |
//var_dump($complement, $espece);die; |
} |
|
static function detectFromNom($nom) { |
730,6 → 749,9 |
|
|
static function traiterLocalisation($ligne, Array &$localisation) { |
if(empty($ligne[C_ZONE_GEO])) $ligne[C_ZONE_GEO] = NULL; |
if(empty($ligne[C_CE_ZONE_GEO])) $ligne[C_CE_ZONE_GEO] = NULL; |
|
$identifiant_commune = trim($ligne[C_ZONE_GEO]); |
if(!$identifiant_commune) { |
$departement = trim($ligne[C_CE_ZONE_GEO]); |