Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1873 → Rev 1874

/branches/v1.8-narince/scripts/modules/import/Import.php
45,6 → 45,7
// renvoi du résultat vers la sortie php
// car le script est surtout destiné à être appelé par un web service
echo $resultat;
exit;
}
private function initialiserScript() {
61,7 → 62,7
$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'];
72,7 → 73,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);
}
83,7 → 84,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);
}
137,13 → 138,14
private function stockerAuteursPourLiaisons($infos_auteurs, $nom_complet_publication) {
// Découpage des différents auteurs
$auteurs_tab = explode(',', $infos_auteurs);
$auteurs_tab = array_filter($auteurs_tab);
foreach($auteurs_tab as $auteur) {
// si les infos auteurs sont un tableau dans le cache alors son id existe bien en base de données
if(is_array($this->cache_auteur[$auteur])) {
// si les infos auteurs sont un tableau dans le cache alors son id existe bien en base de données
if(is_array($this->cache_auteur[$auteur])) {
// ajout d'une correspondance entre le nom complet de la publi et l'auteur (pour liaison ultérieure)
// et vice versa, ce qui permet facilement de retrouver à quel auteur est lié quelle publi dans les deux sens
// et vice versa, ce qui permet facilement de retrouver à quel auteur est lié quelle publi dans les deux sens
$this->auteurs_a_publi[$auteur][] = $nom_complet_publication;
$this->publis_a_auteurs[$nom_complet_publication][] = $auteur;
$this->publis_a_auteurs[$nom_complet_publication][] = $auteur;
}
}
}
153,7 → 155,7
$champs = 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(",", $champs).") VALUES ";
foreach($this->auteurs_a_publi as $auteur => $publis) {
$id_auteur = $this->cache_auteur[$auteur]['cp_id_personne'];
166,7 → 168,7
$ordre_auteur = array_search($auteur, $this->publis_a_auteurs[$publi]) + 1;
// Le nom complet de la publication est normalement unique et donc peut servir à retrouver
// les publications qui ont été insérées par lot (sans en récupérer l'id)
// les publications qui ont été insérées par lot (sans en récupérer l'id)
$sous_requete_id_publi = "SELECT cpu_id_publication FROM coel_publication ".
"WHERE cpu_fmt_nom_complet IN (".$publi.") ";
179,7 → 181,7
"NULL".
") ";
$insertion = $this->bdd->executer($requete_insertion);
}
}
}
// TODO: quoi faire en ce qui concerne l'insertion des auteurs ?
// et le nombre inséré, les éventuels échecs de la requête ?
227,11 → 229,23
}
private function insererPublications(&$colonnes, &$publications) {
$requete = "INSERT INTO ".$this->table_publication." ".
"(".implode(',', $colonnes).") ".
"VALUES ".implode(","."\n", $publications)."\n";
// Une insertion par tranche de 1000 permet d'insérer sans avoir de mysql
// timeout qui nécessite de réveiller la connexion de temps en temps.
// TODO: transactions ?
$tranches_publis = array_chunk($publications, 1000);
$nb_publis_inserees = 0;
foreach($tranches_publis as $tranche) {
$requete = "INSERT INTO ".$this->table_publication." ".
"(".implode(',', $colonnes).") ".
"VALUES ".implode(","."\n", $tranche)."\n";
$nb_publis_inserees += $this->bdd->executer($requete);
}
 
return $this->bdd->executer($requete);
return $nb_publis_inserees;
}
private function traiterChamp($valeur, $role) {
251,15 → 265,17
$auteurs_fmt = array();
$auteurs_tab = explode(',', $auteur_intitule);
foreach($auteurs_tab as $auteur) {
$auteurs_fmt[] = $this->obtenirInfosAuteur($auteur);
if(!empty(trim($auteur))) {
$auteurs_fmt[] = $this->obtenirInfosAuteur($auteur);
}
}
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ée s'il existe en bdd ou sinon
// le nom qui a été donné dans la feuille csv
286,7 → 302,7
}
}
return $retour;
return $retour;
}
private function fabriquerCombinaisonsAuteur($auteur) {
349,27 → 365,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;
}
}
?>