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