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; |
} |
} |
?> |