Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1929 → Rev 1930

/trunk/scripts/modules/import/Import.php
18,7 → 18,7
protected $table_collection = 'coel_collection'; // @TODO configurer
protected $table_collection_bota = 'coel_collection_botanique'; // @TODO configurer
protected $id_table_publication = null;
protected $id_table_publication = null;
protected $id_table_publication_personne = null;
protected $id_role_auteur = null;
71,8 → 71,8
private function traiterInfosUtilisateur($utilisateur) {
$utilisateur_infos = json_decode($utilisateur, true);
if(!empty($utilisateur_infos)) {
$this->id_utilisateur = !empty($utilisateur_infos['id']) ? $utilisateur_infos['id'] : $this->id_utilisateur;
$this->id_session = !empty($utilisateur_infos['session']) ? $utilisateur_infos['session'] : $this->id_session;
$this->id_utilisateur = !empty($utilisateur_infos['id']) ? $utilisateur_infos['id'] : $this->id_utilisateur;
$this->id_session = !empty($utilisateur_infos['session']) ? $utilisateur_infos['session'] : $this->id_session;
$this->ip_utilisateur = !empty($utilisateur_infos['ip']) ? $utilisateur_infos['ip'] : $this->ip_utilisateur;
}
}
91,12 → 91,12
$this->colonnes_acceptees = Config::get('champs');
$tables = Config::get('tables');
$this->table_publication = $tables['publication'];
$this->table_publication = $tables['publication'];
$this->table_auteur = $tables['auteur'];
$this->table_publication_a_auteur = $tables['publication_a_auteur'];
$this->table_meta = $tables['meta'];
$this->id_table_publication = $tables['id_table_publication'];
$this->id_table_publication = $tables['id_table_publication'];
$this->id_table_publication_personne = $tables['id_table_publication_personne'];
$this->id_role_auteur = $tables['id_role_auteur'];
166,6 → 166,10
$idCollectionsParIdTemp[$ligne[$colonnesParNom['id']]] = $idCollection;
}
 
// mettre à jour le GUID des collections et des structures
$this->mettreAJourGUIDCollections();
$this->mettreAJourGUIDStructures();
 
//ouvrir le fichier collection botanique
$pointeurCollectionsBota = fopen($fichierCollectionsBota, "r");
// Chargement de la première colonne (qui contient les noms de colonnes à importer)
215,7 → 219,7
$requete = "INSERT INTO " . $this->table_structure . " (cs_nom)"
. " VALUES ($nsp)";
//echo "REQ INS: $requete\n";
$resultat = $this->bdd->executer($requete);
$this->bdd->executer($requete);
$idStructure = $this->bdd->recupererIdDernierAjout();
 
return $idStructure;
230,6 → 234,7
//echo "Insertion ! : "; var_dump($ligne); echo "<br/>";
$nom = $this->bdd->proteger($ligne[$colonnesParNom['cc_nom']]);
$desc = $this->bdd->proteger($ligne[$colonnesParNom['cc_description']]);
$type = $this->bdd->proteger($ligne[$colonnesParNom['cc_ce_type']]);
$pcd = $this->bdd->proteger($ligne[$colonnesParNom['cc_periode_constitution_debut']]);
$pcf = $this->bdd->proteger($ligne[$colonnesParNom['cc_periode_constitution_fin']]);
$tcl = $this->bdd->proteger($ligne[$colonnesParNom['cc_truk_couverture_lieu']]);
236,10 → 241,10
$cst = $this->bdd->proteger($ligne[$colonnesParNom['cc_ce_specimen_type']]);
 
$requete = "INSERT INTO " . $this->table_collection
. " (cc_ce_structure, cc_nom, cc_description, cc_periode_constitution_debut, cc_periode_constitution_fin, cc_truk_couverture_lieu, cc_ce_specimen_type)"
. " VALUES ($idStructure, $nom, $desc, $pcd, $pcf, $tcl, $cst)";
. " (cc_ce_structure, cc_nom, cc_description, cc_ce_type, cc_periode_constitution_debut, cc_periode_constitution_fin, cc_truk_couverture_lieu, cc_ce_specimen_type)"
. " VALUES ($idStructure, $nom, $desc, $type, $pcd, $pcf, $tcl, $cst)";
//echo "REQ INS: $requete\n";
$resultat = $this->bdd->executer($requete);
$this->bdd->executer($requete);
$idCollection = $this->bdd->recupererIdDernierAjout();
return $idCollection;
246,6 → 251,22
}
 
/**
* Reconstruit les GUID des structures à partir de leurs ID
*/
protected function mettreAJourGUIDStructures() {
$requete = "UPDATE coel_structure SET cs_guid = CONCAT('urn:lsid:tela-botanica.org:str', cs_id_structure)";
$this->bdd->executer($requete);
}
 
/**
* Reconstruit les GUID des collections à partir de leurs ID
*/
protected function mettreAJourGUIDCollections() {
$requete = "UPDATE coel_collection SET cc_guid = CONCAT('urn:lsid:tela-botanica.org:coll', cc_id_collection)";
$this->bdd->executer($requete);
}
 
/**
* Crée une collection botanique; la remplit avec les données issues de $ligne en se
* servant de $colonnesParNom pour accéder aux valeurs par clés textuelles
*/
260,15 → 281,16
$ci = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_ce_inventaire']]);
$ii = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_inventaire_info']]);
$aur = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_autres_unite_rangement']]);
$nph = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_nb_planches_herbiers']]);
$tcpt = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_truk_conservation_papier_type']]);
 
// @TODO comment gérer la colonne "Nombre de parts" ? Faut la mettre dans quoi ?
$requete = "INSERT INTO " . $this->table_collection_bota
. " (ccb_id_collection, ccb_ce_etat_general, ccb_nbre_echantillon, ccb_specialite, ccb_annotation_classement, ccb_ce_traitement, ccb_ce_inventaire,"
. " ccb_inventaire_info, ccb_autres_unites_rangement, ccb_truk_conservation_papier_type)"
. " VALUES ($id, $ceg, $ne, $spec, $ac, $ct, $ci, $ii, $aur, $tcpt)";
. " ccb_inventaire_info, ccb_autres_unites_rangement, ccb_nb_planches_herbiers, ccb_truk_conservation_papier_type)"
. " VALUES ($id, $ceg, $ne, $spec, $ac, $ct, $ci, $ii, $aur, $nph, $tcpt)";
//echo "REQ INS: $requete\n";
$resultat = $this->bdd->executer($requete);
$this->bdd->executer($requete);
}
 
private function chargerPubli($fichier) {
275,7 → 297,7
// vérification existence fichier
if(!file_exists(Config::get('dossiertmp').$fichier)) {
$erreur = "Le fichier ".Config::get('dossiertmp').$fichier." n'existe pas.";
$erreur = "Le fichier ".Config::get('dossiertmp').$fichier." n'existe pas.";
throw new Exception($erreur);
}
286,7 → 308,7
// Vérification des colonnes obligatoires et en même temps du séparateur
if(count($colonnes) < 2 || !array_intersect(array_keys($this->colonnes_obligatoires), $colonnes)) {
$erreur = "Le fichier ne contient pas les colonnes obligatoires : ".implode(',', array_keys($this->colonnes_obligatoires))."\n";
$erreur .= "ou bien n'est pas séparé par le caractère ';' ";
$erreur .= "ou bien n'est pas séparé par le caractère ';' ";
throw new Exception($erreur);
}
310,8 → 332,8
}
$roles_a_num_colonnes = array_flip($index_colonnes_importees);
// Ajout de la colonne nom complet aux champs de la requête
// Ajout de la colonne nom complet aux champs de la requête
$colonnes_importees[] = 'cpu_fmt_nom_complet';
 
$nb_publis_inserees = 0;
335,7 → 357,7
if(!empty($id_publication)) {
$nb_publis_inserees++;
// Pour aller plus vite on pourrait éventuellement faire une grosse requete d'ajout des publications
// à personne à la fin, mais ça nous priverait de faire une transaction (TODO: faire une transaction)
// à personne à la fin, mais ça nous priverait de faire une transaction (TODO: faire une transaction)
$nb_auteurs_lies = $this->insererLiensPublicationAuteurs($id_publication, $ligne[$roles_a_num_colonnes['auteur']]);
}
 
367,26 → 389,26
}
protected function insererLiensPublicationAuteurs($id_publication, &$auteurs) {
$colonnes = array('cpuap_id_publication', 'cpuap_id_personne', 'cpuap_id_role', 'cpuap_ce_truk_type', 'cpuap_ordre', 'cpuap_ce_meta');
$requete = "INSERT IGNORE INTO ".$this->table_publication_a_auteur." ".
$colonnes = array('cpuap_id_publication', 'cpuap_id_personne', 'cpuap_id_role', 'cpuap_ce_truk_type', 'cpuap_ordre', 'cpuap_ce_meta');
$requete = "INSERT IGNORE INTO ".$this->table_publication_a_auteur." ".
"(".implode(",", $colonnes).") VALUES ";
// L'ordre des auteurs commence à 1
$ordre_auteur = 1;
// Découpage des différents auteurs
$auteurs_tab = explode(',', $auteurs);
// Découpage des différents auteurs
$auteurs_tab = explode(',', $auteurs);
$auteurs_tab = array_filter($auteurs_tab);
// Les auteurs sont normalement cités dans l'ordre dans l'import
foreach($auteurs_tab as $auteur) {
// si les infos auteurs sont un tableau dans le cache alors l'id existe bien en base de données
if(is_array($this->cache_auteur[$auteur])) {
// Les auteurs sont normalement cités dans l'ordre dans l'import
foreach($auteurs_tab as $auteur) {
// si les infos auteurs sont un tableau dans le cache alors l'id existe bien en base de données
if(is_array($this->cache_auteur[$auteur])) {
$id_auteur = $this->cache_auteur[$auteur]['cp_id_personne'];
$valeurs = array($id_publication, $id_auteur, $this->id_role_auteur, "NULL", $ordre_auteur, "0");
$requete_insertion = $requete." (".implode(',', $valeurs).") ";
$requete_insertion = $requete." (".implode(',', $valeurs).") ";
$liaison = $this->bdd->executer($requete_insertion);
// Historisation de l'ajout
404,47 → 426,47
}
}
protected function creerXmlHisto($donnees) {
// Création du xml de l'enregistrement à historiser
$info = null;
$xml_tpl = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<resultset>\n<row>\n%s</row>\n</resultset>";
$xml = null;
protected function creerXmlHisto($donnees) {
// Création du xml de l'enregistrement à historiser
$info = null;
$xml_tpl = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<resultset>\n<row>\n%s</row>\n</resultset>";
$xml = null;
foreach ($donnees as $cle => $valeur) {
// Pour éviter un éventuel double échappement des valeurs
$valeur = stripslashes($valeur);
$valeur = trim($valeur, "'");
if (!is_null($valeur) && $valeur != '') {
$xml .= "<$cle>$valeur</$cle>\n";
}
}
if ($xml !== null) {
$info = sprintf($xml_tpl, $xml);
$info = $this->bdd->proteger($info);
}
return $info;
$valeur = trim($valeur, "'");
if (!is_null($valeur) && $valeur != '') {
$xml .= "<$cle>$valeur</$cle>\n";
}
}
if ($xml !== null) {
$info = sprintf($xml_tpl, $xml);
$info = $this->bdd->proteger($info);
}
return $info;
}
protected function historiser($table_id, $ligne_cle, $info) {
date_default_timezone_set('Europe/Paris');
// Pré-traitement des variables
$info = (is_null($info)) ? 'NULL' : $info;
// Historisation (Ajout des méta-données)
$requete = 'INSERT INTO coel_meta_historique_ligne '.
' (cmhl_ce_table, cmhl_cle_ligne, cmhl_enregistrement, cmhl_date_modification, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, cmhl_session_id) '.
'VALUES ('.
" $table_id, ".
' "'.$ligne_cle.'", '.
" $info, ".
' "'.date('Y-m-d H:i:s', time()).'", '.
" $this->id_utilisateur, ".
" ".self::ETAT_AJOUTER.", ".
' "'.$this->ip_utilisateur.'", '.
' "'.$this->id_session.'") ';
$resultat = $this->bdd->executer($requete);
return $this->bdd->recupererIdDernierAjout();
protected function historiser($table_id, $ligne_cle, $info) {
date_default_timezone_set('Europe/Paris');
// Pré-traitement des variables
$info = (is_null($info)) ? 'NULL' : $info;
// Historisation (Ajout des méta-données)
$requete = 'INSERT INTO coel_meta_historique_ligne '.
' (cmhl_ce_table, cmhl_cle_ligne, cmhl_enregistrement, cmhl_date_modification, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, cmhl_session_id) '.
'VALUES ('.
" $table_id, ".
' "'.$ligne_cle.'", '.
" $info, ".
' "'.date('Y-m-d H:i:s', time()).'", '.
" $this->id_utilisateur, ".
" ".self::ETAT_AJOUTER.", ".
' "'.$this->ip_utilisateur.'", '.
' "'.$this->id_session.'") ';
$resultat = $this->bdd->executer($requete);
return $this->bdd->recupererIdDernierAjout();
}
protected function formaterNomComplet($ligne, $roles) {
512,10 → 534,10
return implode(', ', $auteurs_fmt);
}
private function obtenirInfosAuteur($auteur_intitule) {
$retour = $auteur_intitule;
// Si on déjà recherché et trouvé (ou non l'auteur)
// Si on déjà recherché et trouvé (ou non l'auteur)
if(isset($this->cache_auteur[$auteur_intitule])) {
// On renvoie son nom complet formaté s'il existe en bdd ou sinon
// le nom qui a été donné dans la feuille csv
545,7 → 567,7
}
}
return $retour;
return $retour;
}
private function fabriquerCombinaisonsAuteur($auteur) {
608,27 → 630,27
return $auteurs_formates;
}
 
// http://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays
function cartesian($input) {
// filter out empty values
$input = array_filter($input);
$result = array(array());
foreach ($input as $key => $values) {
$append = array();
foreach($result as $product) {
foreach($values as $item) {
$product[$key] = $item;
$append[] = $product;
}
}
$result = $append;
}
return $result;
// http://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays
function cartesian($input) {
// filter out empty values
$input = array_filter($input);
$result = array(array());
foreach ($input as $key => $values) {
$append = array();
foreach($result as $product) {
foreach($values as $item) {
$product[$key] = $item;
$append[] = $product;
}
}
$result = $append;
}
return $result;
}
}
?>