Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1928 → Rev 1929

/trunk/scripts/modules/import/Import.php
14,6 → 14,9
protected $table_auteur = null;
protected $table_publication_a_auteur = null;
protected $table_meta = null;
protected $table_structure = 'coel_structure'; // @TODO configurer
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_personne = null;
98,22 → 101,176
$this->id_role_auteur = $tables['id_role_auteur'];
}
 
/**
* Importe des collections botaniques à partir de deux fichiers : $fichier-collections.csv et
* $fichier-collections-bota.csv
* Il faut donc fournir en paramètre seulement le début du nom de fichier. Ex :
* fichiers:
* - rhone-alpes-collections.csv
* - rhone-alpes-collections-bota.csv
* commande :
* - php cli.php import -a collections -n rhone-alpes
*/
private function chargerCollections($fichier) {
 
$separateur = "\t"; // @TODO configurer
$fichierCollections = Config::get('dossiertmp').$fichier . '-collections.csv';
$fichierCollectionsBota = Config::get('dossiertmp').$fichier . '-collections-bota.csv';
 
// vérification existence fichiers
if(!file_exists($fichierCollections)) {
throw new Exception("Le fichier ".Config::get('dossiertmp').$fichierCollections." n'existe pas.");
}
if(!file_exists($fichierCollectionsBota)) {
throw new Exception("Le fichier ".Config::get('dossiertmp').$fichierCollectionsBota." n'existe pas.");
}
 
//ouvrir le fichier - collection
$pointeurCollections = fopen($fichierCollections, "r");
// Chargement de la première colonne (qui contient les noms de colonnes à importer)
$colonnes = fgetcsv($pointeurCollections, 0, $separateur);
$colonnesParNom = array_flip($colonnes);
//var_dump($colonnes);
//var_dump($colonnesParNom);
 
// vérifier le nom des colonnes
// tester l'existence de la structure
// si oui récupérer l'id
//sinon créer la structure et récupérer son id
// remplacer le nom de la structure par son id
// créer les collections et récupérer leur id
// @TODO on verra plus tard
/*if(count($colonnes) < 2 || !array_intersect(array_keys($this->colonnes_obligatoires), $colonnes)) {
// Vérification des colonnes obligatoires et en même temps du séparateur
$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 ';' ";
throw new Exception($erreur);
}*/
 
$idCollectionsParIdTemp = array();
// parcours du fichier "-collections.csv"
while($ligne = fgetcsv($pointeurCollections, 0, $separateur)) {
//var_dump($ligne);
$nomStructure = $ligne[$colonnesParNom['cc_ce_structure']];
if (empty($nomStructure) || is_numeric($nomStructure)) {
echo "- omission de la structure pour cause de nom chelou [$nomStructure]\n";
continue;
}
// tester l'existence de la structure
$idStructure = $this->verifierExistenceStructureParNom($nomStructure);
// si oui récupérer l'id
//sinon créer la structure et récupérer son id
if ($idStructure === false) {
$idStructure = $this->creerStructure($nomStructure);
}
// remplacer le nom de la structure par son id
// créer les collections et récupérer leur id
// @TODO vérifier qu'elles existent pour ne pas insérer de doublons en relançant le script !!
$idCollection = $this->creerCollection($idStructure, $ligne, $colonnesParNom);
$idCollectionsParIdTemp[$ligne[$colonnesParNom['id']]] = $idCollection;
}
 
//ouvrir le fichier collection botanique
$pointeurCollectionsBota = fopen($fichierCollectionsBota, "r");
// Chargement de la première colonne (qui contient les noms de colonnes à importer)
$colonnesBota = fgetcsv($pointeurCollectionsBota, 0, $separateur);
$colonnesBotaParNom = array_flip($colonnesBota);
//var_dump($colonnesBota);
//var_dump($colonnesBotaParNom);
 
// vérifier les colonnes
// remplacer les noms des collections par leur id (créé précédemment)
// créer/importer
// @TODO on verra plus tard
 
// parcours du fichier "-collections-bota.csv"
while($ligne = fgetcsv($pointeurCollectionsBota, 0, $separateur)) {
// remplacer les noms des collections par leur id (créé précédemment)
$ligne[$colonnesBotaParNom['ccb_id_collection']] = $idCollectionsParIdTemp[$ligne[$colonnesBotaParNom['ccb_id_collection']]];
// créer/importer
// @TODO vérifier qu'elles existent pour ne pas insérer de doublons en relançant le script !!
$this->creerCollectionBota($ligne, $colonnesBotaParNom);
}
}
 
/**
* Si une structure ayant pour nom $nomStructure existe, retourne son
* identifiant numérique, sinon retourne false
*/
protected function verifierExistenceStructureParNom($nomStructure) {
$idStructure = false;
$nsp = $this->bdd->proteger($nomStructure);
$requete = "SELECT cs_id_structure FROM " . $this->table_structure
. " WHERE cs_nom = $nsp";
 
$resultat = $this->bdd->recupererTous($requete);
// var_dump($resultat);
if (count($resultat) > 0) {
$idStructure = $resultat[0]['cs_id_structure'];
}
return $idStructure;
}
 
/**
* Crée une structure portant le nom $nomStructure, sans rien fournir d'autre, et
* retourne l'identifiant numérique du novueau tuple
*/
protected function creerStructure($nomStructure) {
$nsp = $this->bdd->proteger($nomStructure);
$requete = "INSERT INTO " . $this->table_structure . " (cs_nom)"
. " VALUES ($nsp)";
//echo "REQ INS: $requete\n";
$resultat = $this->bdd->executer($requete);
$idStructure = $this->bdd->recupererIdDernierAjout();
 
return $idStructure;
}
 
/**
* Crée une collection en la rattachant à la structure d'id $idStrucutre; la remplit
* avec les données issues de $ligne en se servant de $colonnesParNom pour accéder
* aux valeurs par clés textuelles; retourne l'identifiant numérique du novueau tuple
*/
protected function creerCollection($idStructure, $ligne, $colonnesParNom) {
//echo "Insertion ! : "; var_dump($ligne); echo "<br/>";
$nom = $this->bdd->proteger($ligne[$colonnesParNom['cc_nom']]);
$desc = $this->bdd->proteger($ligne[$colonnesParNom['cc_description']]);
$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']]);
$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)";
//echo "REQ INS: $requete\n";
$resultat = $this->bdd->executer($requete);
$idCollection = $this->bdd->recupererIdDernierAjout();
return $idCollection;
}
 
/**
* 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
*/
protected function creerCollectionBota($ligne, $colonnesBotaParNom) {
//echo "Insertion ! : "; var_dump($ligne); echo "<br/>";
$id = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_id_collection']]);
$ceg = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_ce_etat_general']]);
$ne = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_nbre_echantillon']]);
$spec = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_specialite']]);
$ac = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_annotation_classement']]);
$ct = $this->bdd->proteger($ligne[$colonnesBotaParNom['ccb_ce_traitement']]);
$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']]);
$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)";
//echo "REQ INS: $requete\n";
$resultat = $this->bdd->executer($requete);
}
 
private function chargerPubli($fichier) {
// vérification existence fichier