Line 150... |
Line 150... |
150 |
// XXX future: mais pourraient varier dans le futur si la mise-à-jour
|
150 |
// XXX future: mais pourraient varier dans le futur si la mise-à-jour
|
151 |
// d'observation est implémentée
|
151 |
// d'observation est implémentée
|
152 |
"date_creation" => "now()",
|
152 |
"date_creation" => "now()",
|
153 |
"date_modification" => "now()",
|
153 |
"date_modification" => "now()",
|
154 |
);
|
154 |
);
|
- |
|
155 |
|
- |
|
156 |
public static $prefixe_colonnes_etendues = 'ext:';
|
- |
|
157 |
public static $indexes_colonnes_etendues = Array();
|
- |
|
158 |
public static $gestion_champs_etendus = null;
|
Line 155... |
Line 159... |
155 |
|
159 |
|
Line 156... |
Line 160... |
156 |
public $id_utilisateur = NULL;
|
160 |
public $id_utilisateur = NULL;
|
157 |
|
161 |
|
Line 254... |
Line 258... |
254 |
|
258 |
|
255 |
$obs_ajouts = 0;
|
259 |
$obs_ajouts = 0;
|
256 |
$obs_maj = 0;
|
260 |
$obs_maj = 0;
|
257 |
$nb_images_ajoutees = 0;
|
261 |
$nb_images_ajoutees = 0;
|
- |
|
262 |
$nb_mots_cle_ajoutes = 0;
|
Line 258... |
Line 263... |
258 |
$nb_mots_cle_ajoutes = 0;
|
263 |
$nb_champs_etendus_inseres = 0;
|
259 |
|
264 |
|
260 |
$dernier_ordre = Cel::db()->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
|
265 |
$dernier_ordre = Cel::db()->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
|
Line 302... |
Line 307... |
302 |
// var_dump($donnees, get_defined_constants(true)['user']);die;
|
307 |
// var_dump($donnees, get_defined_constants(true)['user']);die;
|
303 |
// ici on appel la fonction qui fera effectivement l'insertion multiple
|
308 |
// ici on appel la fonction qui fera effectivement l'insertion multiple
|
304 |
// à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
|
309 |
// à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
|
Line 305... |
Line 310... |
305 |
|
310 |
|
306 |
// TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques
|
311 |
// TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques
|
307 |
list($enregistrements, $images, $mots_cle) =
|
312 |
list($enregistrements, $images, $mots_cle, $champs_etendus) =
|
308 |
self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
|
313 |
self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
|
Line 309... |
Line 314... |
309 |
if(! $enregistrements) break;
|
314 |
if(! $enregistrements) break;
|
310 |
|
315 |
|
Line 342... |
Line 347... |
342 |
|
347 |
|
Line 343... |
Line 348... |
343 |
$ordre_ids = self::chargerCorrespondancesIdOrdre($this, $enregistrements);
|
348 |
$ordre_ids = self::chargerCorrespondancesIdOrdre($this, $enregistrements);
|
344 |
|
349 |
|
- |
|
350 |
$nb_images_ajoutees += self::stockerImages($enregistrements, $images, $ordre_ids);
|
345 |
$nb_images_ajoutees += self::stockerImages($enregistrements, $images, $ordre_ids);
|
351 |
$nb_mots_cle_ajoutes += self::stockerMotsCle($enregistrements, $mots_cle, $dernier_autoinc);
|
Line 346... |
Line 352... |
346 |
$nb_mots_cle_ajoutes += self::stockerMotsCle($enregistrements, $mots_cle, $dernier_autoinc);
|
352 |
$nb_champs_etendus_inseres += self::stockerChampsEtendus($champs_etendus, $ordre_ids, $this->config);
|
Line 347... |
Line 353... |
347 |
}
|
353 |
}
|
Line 377... |
Line 383... |
377 |
Le détecter après coup est difficile et pourtant cette distinction est importante car le comportement
|
383 |
Le détecter après coup est difficile et pourtant cette distinction est importante car le comportement
|
378 |
d'array_merge() (réordonnancement des clefs numérique) n'est pas souhaitable dans le second cas. */
|
384 |
d'array_merge() (réordonnancement des clefs numérique) n'est pas souhaitable dans le second cas. */
|
379 |
static function detectionEntete($entete, $numeric_keys = FALSE) {
|
385 |
static function detectionEntete($entete, $numeric_keys = FALSE) {
|
380 |
$colonnes_reconnues = Array();
|
386 |
$colonnes_reconnues = Array();
|
381 |
$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard,avance');
|
387 |
$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard,avance');
|
- |
|
388 |
|
382 |
foreach($entete as $k => $v) {
|
389 |
foreach($entete as $k => $v) {
|
383 |
// traite les colonnes en faisant fi de la casse et des accents
|
390 |
// traite les colonnes en faisant fi de la casse et des accents
|
384 |
$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
|
391 |
$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
|
385 |
foreach($cols as $col) {
|
392 |
foreach($cols as $col) {
|
386 |
$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
|
393 |
$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
|
387 |
$entete_officiel_abbrev = $col['abbrev'];
|
394 |
$entete_officiel_abbrev = $col['abbrev'];
|
388 |
if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
|
395 |
if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
|
389 |
// debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n";
|
396 |
// debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n";
|
390 |
define("C_" . strtoupper($entete_officiel_abbrev), $k);
|
397 |
define("C_" . strtoupper($entete_officiel_abbrev), $k);
|
391 |
$colonnes_reconnues[$k] = 1;
|
398 |
$colonnes_reconnues[$k] = 1;
|
392 |
break;
|
399 |
break;
|
- |
|
400 |
}
|
- |
|
401 |
|
- |
|
402 |
if(strpos($v, self::$prefixe_colonnes_etendues) === 0) {
|
- |
|
403 |
$colonnes_reconnues[$k] = 1;
|
- |
|
404 |
self::$indexes_colonnes_etendues[$k] = $v;
|
- |
|
405 |
break;
|
393 |
}
|
406 |
}
|
394 |
}
|
407 |
}
|
395 |
}
|
408 |
}
|
- |
|
409 |
|
396 |
// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
|
410 |
// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
|
397 |
// le tableau renvoyé par PHPExcel
|
411 |
// le tableau renvoyé par PHPExcel
|
398 |
// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
|
412 |
// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
|
399 |
// les utilisent
|
413 |
// les utilisent
|
400 |
foreach($cols as $col) {
|
414 |
foreach($cols as $col) {
|
Line 453... |
Line 467... |
453 |
static function chargerLignes($cel, $lignes, $colonnes_statiques, &$dernier_ordre) {
|
467 |
static function chargerLignes($cel, $lignes, $colonnes_statiques, &$dernier_ordre) {
|
454 |
$enregistrement = NULL;
|
468 |
$enregistrement = NULL;
|
455 |
$enregistrements = Array();
|
469 |
$enregistrements = Array();
|
456 |
$toutes_images = Array();
|
470 |
$toutes_images = Array();
|
457 |
$tous_mots_cle = Array();
|
471 |
$tous_mots_cle = Array();
|
- |
|
472 |
$tous_champs_etendus = array();
|
Line 458... |
Line 473... |
458 |
|
473 |
|
- |
|
474 |
foreach($lignes as $ligne) {
|
459 |
foreach($lignes as $ligne) {
|
475 |
|
460 |
// dans le cas de fgetcsv, on peut avoir des false additionnel (cf do/while l. 279)
|
476 |
// dans le cas de fgetcsv, on peut avoir des false additionnel (cf do/while l. 279)
|
Line 461... |
Line 477... |
461 |
if($ligne === false) continue;
|
477 |
if($ligne === false) continue;
|
462 |
|
478 |
|
Line 491... |
Line 507... |
491 |
// XXX: postponer l'ajout de ces informations dans cel_obs *après* l'insertion effective
|
507 |
// XXX: postponer l'ajout de ces informations dans cel_obs *après* l'insertion effective
|
492 |
// des records dans cel_mots_cles_obs ?
|
508 |
// des records dans cel_mots_cles_obs ?
|
493 |
unset($last['_mots_cle']);
|
509 |
unset($last['_mots_cle']);
|
494 |
}
|
510 |
}
|
Line -... |
Line 511... |
- |
|
511 |
|
- |
|
512 |
if(isset($enregistrement['_champs_etendus'])) {
|
- |
|
513 |
$tous_champs_etendus[] = Array("champs_etendus" => $last['_champs_etendus'],
|
- |
|
514 |
"ordre" => $dernier_ordre);
|
- |
|
515 |
unset($last['_champs_etendus']);
|
495 |
|
516 |
}
|
496 |
$dernier_ordre++;
|
517 |
$dernier_ordre++;
|
497 |
}
|
518 |
}
|
Line 498... |
Line 519... |
498 |
}
|
519 |
}
|
499 |
|
520 |
|
500 |
// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
|
521 |
// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
|
Line 501... |
Line 522... |
501 |
return Array($enregistrements, $toutes_images, $tous_mots_cle);
|
522 |
return Array($enregistrements, $toutes_images, $tous_mots_cle, $tous_champs_etendus);
|
502 |
}
|
523 |
}
|
Line 621... |
Line 642... |
621 |
// que si des résultats sont trouvés
|
642 |
// que si des résultats sont trouvés
|
622 |
// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
|
643 |
// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
|
623 |
if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
|
644 |
if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
|
Line 624... |
Line 645... |
624 |
|
645 |
|
- |
|
646 |
if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
|
- |
|
647 |
|
- |
|
648 |
$champs_etendus = self::traiterChampsEtendus($ligne, self::$indexes_colonnes_etendues);
|
- |
|
649 |
if(!empty($champs_etendus)) {
|
- |
|
650 |
$enregistrement["_champs_etendus"] = $champs_etendus;
|
Line 625... |
Line 651... |
625 |
if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
|
651 |
}
|
626 |
|
652 |
|
- |
|
653 |
return $enregistrement;
|
- |
|
654 |
}
|
- |
|
655 |
|
- |
|
656 |
static function traiterChampsEtendus(&$ligne, &$indexes_colonnes_etendues) {
|
- |
|
657 |
$champs_etendus_indexes = array();
|
- |
|
658 |
foreach($indexes_colonnes_etendues as $index_num => $label) {
|
- |
|
659 |
if(isset($ligne[$index_num])) {
|
- |
|
660 |
$champs_etendus_indexes[str_replace(self::$prefixe_colonnes_etendues, '', $label)] = $ligne[$index_num];
|
- |
|
661 |
}
|
- |
|
662 |
}
|
Line 627... |
Line 663... |
627 |
return $enregistrement;
|
663 |
return $champs_etendus_indexes;
|
628 |
}
|
664 |
}
|
Line 629... |
Line 665... |
629 |
|
665 |
|
Line 1006... |
Line 1042... |
1006 |
$departement = trim($departement); // TODO
|
1042 |
$departement = trim($departement); // TODO
|
Line 1007... |
Line 1043... |
1007 |
|
1043 |
|
1008 |
$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
|
1044 |
$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
|
1009 |
$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
|
1045 |
$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
|
1010 |
}
|
1046 |
}
|
1011 |
|
1047 |
|
1012 |
/*
|
1048 |
|
1013 |
static function traiterLocalisation($ligne, Array &$localisation) {
|
1049 |
public static function stockerChampsEtendus($champs_etendus, $ordre_ids, $config) {
|
1014 |
$identifiant_commune = trim($ligne[C_ZONE_GEO]);
|
1050 |
// singleton du pauvre mais l'export est suffisamment inefficace pour s'en priver
|
1015 |
if(!$identifiant_commune) {
|
1051 |
self::$gestion_champs_etendus = self::$gestion_champs_etendus == null ?
|
1016 |
$departement = trim($ligne[C_CE_ZONE_GEO]);
|
1052 |
new GestionChampsEtendus($config, 'obs') :
|
1017 |
goto testdepartement;
|
- |
|
1018 |
}
|
- |
|
1019 |
|
- |
|
1020 |
|
- |
|
1021 |
$select = "SELECT DISTINCT nom, code FROM cel_zones_geo";
|
1053 |
self::$gestion_champs_etendus;
|
1022 |
|
- |
|
1023 |
if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
|
- |
|
1024 |
// commune + departement : montpellier (34)
|
- |
|
1025 |
$nom_commune=$elements[1];
|
1054 |
|
1026 |
$code_commune=$elements[2];
|
1055 |
$champs_etendus_obs = array();
|
1027 |
$requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
|
1056 |
foreach($champs_etendus as $champ_etendu_a_obs) {
|
1028 |
$select, self::quoteNonNull($nom_commune), self::quoteNonNull($code_commune.'%'));
|
- |
|
1029 |
}
|
1057 |
$id_obs = $ordre_ids[$champ_etendu_a_obs['ordre']]; // id réel de l'observation correspondant à l'ordre
|
1030 |
elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
|
- |
|
1031 |
// Code insee seul
|
1058 |
foreach($champ_etendu_a_obs['champs_etendus'] as $label => $champ) {
|
1032 |
$code_insee_commune=$elements[1];
|
- |
|
1033 |
$requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
|
- |
|
1034 |
}
|
1059 |
// XXX: insère t'on des valeurs vides ?
|
1035 |
else {
|
- |
|
1036 |
// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
|
1060 |
$valeur = $champ;
|
1037 |
// on prend le risque ici de retourner une mauvaise Commune
|
- |
|
1038 |
$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
|
- |
|
1039 |
$requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
|
- |
|
1040 |
}
|
1061 |
$cle = self::$gestion_champs_etendus->transformerLabelEnCle($label);
|
1041 |
|
- |
|
1042 |
$resultat_commune = Cel::db()->requeter($requete);
|
1062 |
|
1043 |
// TODO: levenstein sort ?
|
- |
|
1044 |
|
1063 |
if (!empty($cle) && !empty($valeur)) {
|
1045 |
// cas de la commune introuvable dans le référentiel
|
1064 |
$champ_etendu_a_inserer = new ChampEtendu();
|
1046 |
// réinitialisation aux valeurs du fichier XLS
|
- |
|
1047 |
if(! $resultat_commune) {
|
1065 |
$champ_etendu_a_inserer->id = $id_obs;
|
1048 |
$localisation[C_ZONE_GEO] = trim($ligne[C_ZONE_GEO]);
|
1066 |
$champ_etendu_a_inserer->cle = $cle;
|
1049 |
$localisation[C_CE_ZONE_GEO] = trim($ligne[C_CE_ZONE_GEO]);
|
- |
|
1050 |
} else {
|
1067 |
$champ_etendu_a_inserer->label = empty($label) ? $cle : $label;
|
1051 |
$localisation[C_ZONE_GEO] = $resultat_commune[0]['nom'];
|
- |
|
1052 |
$localisation[C_CE_ZONE_GEO] = $resultat_commune[0]['code'];
|
- |
|
1053 |
}
|
1068 |
$champ_etendu_a_inserer->valeur = $valeur;
|
1054 |
|
1069 |
|
1055 |
$departement = &$localisation[C_CE_ZONE_GEO];
|
1070 |
$champs_etendus_obs[] = $champ_etendu_a_inserer;
|
1056 |
|
1071 |
}
|
1057 |
testdepartement:
|
- |
|
1058 |
if(strpos($departement, "INSEE-C:", 0) === 0) goto protectloc;
|
1072 |
}
|
1059 |
|
- |
|
1060 |
if(!is_numeric($departement)) goto protectloc; // TODO ?
|
- |
|
1061 |
if(strlen($departement) == 4) $departement = "INSEE-C:0" . $departement;
|
- |
|
1062 |
if(strlen($departement) == 5) $departement = "INSEE-C:" . $departement;
|
- |
|
1063 |
// if(strlen($departement) <= 9) return "INSEE-C:0" . $departement; // ? ... TODO
|
1073 |
}
|
1064 |
|
1074 |
|
1065 |
$departement = trim($departement); // TODO
|
- |
|
1066 |
|
- |
|
1067 |
protectloc:
|
1075 |
$insertion = self::$gestion_champs_etendus->ajouterParLots($champs_etendus_obs);
|
1068 |
$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
|
1076 |
//TODO: que faire si l'insertion des champs étendus échoue ?
|
1069 |
$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
|
1077 |
return count($champs_etendus_obs);
|
1070 |
}
|
- |
|
1071 |
*/
|
- |
|
Line 1072... |
Line 1078... |
1072 |
|
1078 |
}
|
Line 1073... |
Line 1079... |
1073 |
|
1079 |
|
1074 |
/* HELPERS */
|
1080 |
/* HELPERS */
|