11,11 → 11,16 |
|
protected $table_publication = null; |
protected $table_auteur = null; |
protected $table_publication_a_auteur = null; |
|
protected $id_role_auteur = null; |
|
protected $colonnes_obligatoires = array(); |
protected $colonnes_acceptees = array(); |
|
protected $cache_auteur = array(); |
protected $auteurs_a_publis = array(); |
protected $publis_a_auteurs = array(); |
|
public function __construct($script_nom, $parametres) { |
parent::__construct($script_nom, $parametres); |
38,6 → 43,7 |
} |
|
// renvoi du résultat vers la sortie php |
// car le script est surtout destiné à être appelé par un web service |
echo $resultat; |
} |
|
57,6 → 63,9 |
$tables = Config::get('tables'); |
$this->table_publication = $tables['publication']; |
$this->table_auteur = $tables['auteur']; |
$this->table_publication_a_auteur = $tables['publication_a_auteur']; |
|
$this->id_role_auteur = $tables['id_role_auteur']; |
} |
|
private function charger($fichier) { |
78,6 → 87,11 |
throw new Exception($erreur); |
} |
|
|
//TODO: vérifier si les deux index ci dessous ne font pas double emploi |
|
// Création d'un index des colonnes qui seront importées dans la fiche en les associant |
// au numéro de colonne dans la feuille csv |
$index_colonnes_importees = array_intersect(array_keys($this->colonnes_acceptees), $colonnes); |
$colonnes_importees = array(); |
foreach($index_colonnes_importees as $index_colonne_importee) { |
91,6 → 105,8 |
foreach($index_colonnes_refusees as $colonne_refusee) { |
unset($index_colonnes_importees[$colonne_refusee]); |
} |
|
$roles_a_num_colonnes = array_flip($index_colonnes_importees); |
|
$lignes = array(); |
while($ligne = fgetcsv($pointeur, 0, ";")) { |
101,17 → 117,74 |
} |
} |
// Ajout du nom complet formaté de la publication |
$ligne_inseree[] = $this->bdd->proteger($this->formaterNomComplet($ligne, $index_colonnes_importees)); |
$nom_complet = $this->bdd->proteger($this->formaterNomComplet($ligne, $index_colonnes_importees)); |
$ligne_inseree[] = $nom_complet; |
$lignes[] = "(".implode(",", $ligne_inseree).")"; |
|
$this->stockerAuteursPourLiaisons($ligne[$roles_a_num_colonnes['auteur']], $nom_complet); |
} |
|
// Ajout de la colonne nom complet aux champs de la requête |
$colonnes_importees[] = 'cpu_fmt_nom_complet'; |
|
|
// le script renvoie le nombre de publications importées |
return $this->insererPublications($colonnes_importees, $lignes); |
$nb_publis_inserees = $this->insererPublications($colonnes_importees, $lignes); |
$nb_auteurs_lies = $this->insererLiensPublicationsAuteurs(); |
|
return $nb_publis_inserees; |
} |
|
private function stockerAuteursPourLiaisons($infos_auteurs, $nom_complet_publication) { |
// Découpage des différents auteurs |
$auteurs_tab = explode(',', $infos_auteurs); |
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])) { |
// 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 |
$this->auteurs_a_publi[$auteur][] = $nom_complet_publication; |
$this->publis_a_auteurs[$nom_complet_publication][] = $auteur; |
} |
} |
} |
|
protected function insererLiensPublicationsAuteurs() { |
|
$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']; |
|
// Pour chaque publication importée à laquelle est liée l'auteur |
// il peut avoir un ordre différent |
foreach($publis as $publi) { |
|
// l'ordre des auteurs commence à 1, les auteurs sont stockés dans l'ordre dans publis_a_auteurs |
$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) |
$sous_requete_id_publi = "SELECT cpu_id_publication FROM coel_publication ". |
"WHERE cpu_fmt_nom_complet IN (".$publi.") "; |
|
$requete_insertion = $requete." (". |
" (".$sous_requete_id_publi."), ". |
$this->bdd->proteger($id_auteur).", ". |
$this->id_role_auteur.", ". |
"NULL ,". |
$ordre_auteur.", ". |
"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 ? |
} |
|
protected function formaterNomComplet($ligne, $roles) { |
|
$roles = array_flip($roles); |
157,7 → 230,7 |
$requete = "INSERT INTO ".$this->table_publication." ". |
"(".implode(',', $colonnes).") ". |
"VALUES ".implode(","."\n", $publications)."\n"; |
|
|
return $this->bdd->executer($requete); |
} |
|
164,23 → 237,38 |
private function traiterChamp($valeur, $role) { |
switch($role) { |
case 'auteur': |
$valeur = $this->obtenirInfosAuteur($valeur); |
$valeur = $this->traiterChampAuteur($valeur); |
break; |
case 'editeur': |
$valeur = 'AUTRES##'.$valeur; |
$valeur = 'AUTRE##'.$valeur; |
break; |
} |
|
return $this->bdd->proteger($valeur); |
} |
|
private function traiterChampAuteur($auteur_intitule) { |
$auteurs_fmt = array(); |
$auteurs_tab = explode(',', $auteur_intitule); |
foreach($auteurs_tab as $auteur) { |
$auteurs_fmt[] = $this->obtenirInfosAuteur($auteur); |
} |
|
return implode(', ', $auteurs_fmt); |
} |
|
private function obtenirInfosAuteur($auteur_intitule) { |
$retour = $auteur_intitule; |
$retour = $auteur_intitule; |
// 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 |
$retour = !empty($this->cache_auteur[$auteur_intitule]['cp_id_personne']) ? |
$this->cache_auteur[$auteur_intitule]['cp_id_personne'] : |
$this->cache_auteur[$auteur_intitule]; |
} else { |
// Recherche de l'auteur sur un maximum du combinaisons possible des variations |
// de son nom et prénom |
$auteur = $this->fabriquerCombinaisonsAuteur($auteur_intitule); |
$auteur_req = "(".implode(', ', $auteur).")"; |
|
187,8 → 275,10 |
$requete = "SELECT cp_id_personne, cp_fmt_nom_complet FROM ".$this->table_auteur." WHERE cp_fmt_nom_complet IN ".$auteur_req; |
$infos_auteur = $this->bdd->recupererTous($requete); |
|
// Stockage en cache de la ligne de bdd si trouvé, |
// de la valeur brute sinon |
if(!empty($infos_auteur)) { |
$retour = $infos_auteur[0]['cp_id_personne']; |
$retour = $infos_auteur[0]['cp_fmt_nom_complet']; |
$this->cache_auteur[$auteur_intitule] = $infos_auteur[0]; |
} else { |
$retour = $auteur_intitule; |