Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2380 → Rev 2381

/trunk/jrest/services/ImportXLS.php
152,6 → 152,10
"date_creation" => "now()",
"date_modification" => "now()",
);
public static $prefixe_colonnes_etendues = 'ext:';
public static $indexes_colonnes_etendues = Array();
public static $gestion_champs_etendus = null;
 
public $id_utilisateur = NULL;
 
256,6 → 260,7
$obs_maj = 0;
$nb_images_ajoutees = 0;
$nb_mots_cle_ajoutes = 0;
$nb_champs_etendus_inseres = 0;
 
$dernier_ordre = Cel::db()->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
$dernier_ordre = intval($dernier_ordre[0]['ordre']) + 1;
304,7 → 309,7
// à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
 
// TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques
list($enregistrements, $images, $mots_cle) =
list($enregistrements, $images, $mots_cle, $champs_etendus) =
self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
if(! $enregistrements) break;
 
344,6 → 349,7
$nb_images_ajoutees += self::stockerImages($enregistrements, $images, $ordre_ids);
$nb_mots_cle_ajoutes += self::stockerMotsCle($enregistrements, $mots_cle, $dernier_autoinc);
$nb_champs_etendus_inseres += self::stockerChampsEtendus($champs_etendus, $ordre_ids, $this->config);
}
 
restore_error_handler();
379,20 → 385,28
static function detectionEntete($entete, $numeric_keys = FALSE) {
$colonnes_reconnues = Array();
$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard,avance');
foreach($entete as $k => $v) {
// traite les colonnes en faisant fi de la casse et des accents
$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
foreach($cols as $col) {
$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
$entete_officiel_abbrev = $col['abbrev'];
if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
// debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n";
define("C_" . strtoupper($entete_officiel_abbrev), $k);
$colonnes_reconnues[$k] = 1;
break;
}
$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
$entete_officiel_abbrev = $col['abbrev'];
if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
// debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n";
define("C_" . strtoupper($entete_officiel_abbrev), $k);
$colonnes_reconnues[$k] = 1;
break;
}
 
if(strpos($v, self::$prefixe_colonnes_etendues) === 0) {
$colonnes_reconnues[$k] = 1;
self::$indexes_colonnes_etendues[$k] = $v;
break;
}
}
}
// 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()
455,8 → 469,10
$enregistrements = Array();
$toutes_images = Array();
$tous_mots_cle = Array();
$tous_champs_etendus = array();
 
foreach($lignes as $ligne) {
// dans le cas de fgetcsv, on peut avoir des false additionnel (cf do/while l. 279)
if($ligne === false) continue;
 
493,12 → 509,17
unset($last['_mots_cle']);
}
 
if(isset($enregistrement['_champs_etendus'])) {
$tous_champs_etendus[] = Array("champs_etendus" => $last['_champs_etendus'],
"ordre" => $dernier_ordre);
unset($last['_champs_etendus']);
}
$dernier_ordre++;
}
}
 
// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
return Array($enregistrements, $toutes_images, $tous_mots_cle);
return Array($enregistrements, $toutes_images, $tous_mots_cle, $tous_champs_etendus);
}
 
 
623,9 → 644,24
if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
 
if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
$champs_etendus = self::traiterChampsEtendus($ligne, self::$indexes_colonnes_etendues);
if(!empty($champs_etendus)) {
$enregistrement["_champs_etendus"] = $champs_etendus;
}
 
return $enregistrement;
}
static function traiterChampsEtendus(&$ligne, &$indexes_colonnes_etendues) {
$champs_etendus_indexes = array();
foreach($indexes_colonnes_etendues as $index_num => $label) {
if(isset($ligne[$index_num])) {
$champs_etendus_indexes[str_replace(self::$prefixe_colonnes_etendues, '', $label)] = $ligne[$index_num];
}
}
return $champs_etendus_indexes;
}
 
static function traiterImage($str, $id_utilisateur, &$enregistrement) {
$liste_images = array_filter(explode("/", $str));
1008,69 → 1044,39
$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
}
public static function stockerChampsEtendus($champs_etendus, $ordre_ids, $config) {
// singleton du pauvre mais l'export est suffisamment inefficace pour s'en priver
self::$gestion_champs_etendus = self::$gestion_champs_etendus == null ?
new GestionChampsEtendus($config, 'obs') :
self::$gestion_champs_etendus;
$champs_etendus_obs = array();
foreach($champs_etendus as $champ_etendu_a_obs) {
$id_obs = $ordre_ids[$champ_etendu_a_obs['ordre']]; // id réel de l'observation correspondant à l'ordre
foreach($champ_etendu_a_obs['champs_etendus'] as $label => $champ) {
// XXX: insère t'on des valeurs vides ?
$valeur = $champ;
$cle = self::$gestion_champs_etendus->transformerLabelEnCle($label);
if (!empty($cle) && !empty($valeur)) {
$champ_etendu_a_inserer = new ChampEtendu();
$champ_etendu_a_inserer->id = $id_obs;
$champ_etendu_a_inserer->cle = $cle;
$champ_etendu_a_inserer->label = empty($label) ? $cle : $label;
$champ_etendu_a_inserer->valeur = $valeur;
$champs_etendus_obs[] = $champ_etendu_a_inserer;
}
}
}
$insertion = self::$gestion_champs_etendus->ajouterParLots($champs_etendus_obs);
//TODO: que faire si l'insertion des champs étendus échoue ?
return count($champs_etendus_obs);
}
 
/*
static function traiterLocalisation($ligne, Array &$localisation) {
$identifiant_commune = trim($ligne[C_ZONE_GEO]);
if(!$identifiant_commune) {
$departement = trim($ligne[C_CE_ZONE_GEO]);
goto testdepartement;
}
 
 
$select = "SELECT DISTINCT nom, code FROM cel_zones_geo";
if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
// commune + departement : montpellier (34)
$nom_commune=$elements[1];
$code_commune=$elements[2];
$requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
$select, self::quoteNonNull($nom_commune), self::quoteNonNull($code_commune.'%'));
}
elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
// Code insee seul
$code_insee_commune=$elements[1];
$requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
}
else {
// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
// on prend le risque ici de retourner une mauvaise Commune
$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
$requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
}
$resultat_commune = Cel::db()->requeter($requete);
// TODO: levenstein sort ?
 
// cas de la commune introuvable dans le référentiel
// réinitialisation aux valeurs du fichier XLS
if(! $resultat_commune) {
$localisation[C_ZONE_GEO] = trim($ligne[C_ZONE_GEO]);
$localisation[C_CE_ZONE_GEO] = trim($ligne[C_CE_ZONE_GEO]);
} else {
$localisation[C_ZONE_GEO] = $resultat_commune[0]['nom'];
$localisation[C_CE_ZONE_GEO] = $resultat_commune[0]['code'];
}
 
$departement = &$localisation[C_CE_ZONE_GEO];
 
testdepartement:
if(strpos($departement, "INSEE-C:", 0) === 0) goto protectloc;
 
if(!is_numeric($departement)) goto protectloc; // TODO ?
if(strlen($departement) == 4) $departement = "INSEE-C:0" . $departement;
if(strlen($departement) == 5) $departement = "INSEE-C:" . $departement;
// if(strlen($departement) <= 9) return "INSEE-C:0" . $departement; // ? ... TODO
 
$departement = trim($departement); // TODO
 
protectloc:
$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
}
*/
 
 
/* HELPERS */
 
// http://stackoverflow.com/questions/348410/sort-an-array-based-on-another-array