153,6 → 153,10 |
"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; |
|
// erreurs d'import |
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,6 → 385,7 |
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))); |
391,8 → 398,15 |
$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); |
} |
|
|
624,9 → 645,24 |
|
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)); |
|
1009,68 → 1045,38 |
$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO]; |
} |
|
/* |
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; |
} |
|
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; |
|
$select = "SELECT DISTINCT nom, code FROM cel_zones_geo"; |
$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 (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.'%')); |
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; |
} |
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']; |
$insertion = self::$gestion_champs_etendus->ajouterParLots($champs_etendus_obs); |
//TODO: que faire si l'insertion des champs étendus échoue ? |
return count($champs_etendus_obs); |
} |
|
$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 |