| Line 9... |
Line 9... |
| 9 |
protected $parametres_autorises = array(
|
9 |
protected $parametres_autorises = array(
|
| 10 |
'-n' => array(true, false, 'Nom du fichier à importer.'));
|
10 |
'-n' => array(true, false, 'Nom du fichier à importer.'));
|
| Line 11... |
Line 11... |
| 11 |
|
11 |
|
| 12 |
protected $table_publication = null;
|
12 |
protected $table_publication = null;
|
| - |
|
13 |
protected $table_auteur = null;
|
| - |
|
14 |
protected $table_publication_a_auteur = null;
|
| - |
|
15 |
|
| Line 13... |
Line 16... |
| 13 |
protected $table_auteur = null;
|
16 |
protected $id_role_auteur = null;
|
| 14 |
|
17 |
|
| Line 15... |
Line 18... |
| 15 |
protected $colonnes_obligatoires = array();
|
18 |
protected $colonnes_obligatoires = array();
|
| - |
|
19 |
protected $colonnes_acceptees = array();
|
| - |
|
20 |
|
| Line 16... |
Line 21... |
| 16 |
protected $colonnes_acceptees = array();
|
21 |
protected $cache_auteur = array();
|
| 17 |
|
22 |
protected $auteurs_a_publis = array();
|
| 18 |
protected $cache_auteur = array();
|
23 |
protected $publis_a_auteurs = array();
|
| 19 |
|
24 |
|
| Line 36... |
Line 41... |
| 36 |
} catch (Exception $erreur) {
|
41 |
} catch (Exception $erreur) {
|
| 37 |
$this->traiterErreur($erreur->getMessage());
|
42 |
$this->traiterErreur($erreur->getMessage());
|
| 38 |
}
|
43 |
}
|
| Line 39... |
Line 44... |
| 39 |
|
44 |
|
| - |
|
45 |
// renvoi du résultat vers la sortie php
|
| 40 |
// renvoi du résultat vers la sortie php
|
46 |
// car le script est surtout destiné à être appelé par un web service
|
| 41 |
echo $resultat;
|
47 |
echo $resultat;
|
| Line 42... |
Line 48... |
| 42 |
}
|
48 |
}
|
| 43 |
|
49 |
|
| Line 55... |
Line 61... |
| 55 |
$this->colonnes_acceptees = Config::get('champs');
|
61 |
$this->colonnes_acceptees = Config::get('champs');
|
| Line 56... |
Line 62... |
| 56 |
|
62 |
|
| 57 |
$tables = Config::get('tables');
|
63 |
$tables = Config::get('tables');
|
| 58 |
$this->table_publication = $tables['publication'];
|
64 |
$this->table_publication = $tables['publication'];
|
| - |
|
65 |
$this->table_auteur = $tables['auteur'];
|
| - |
|
66 |
$this->table_publication_a_auteur = $tables['publication_a_auteur'];
|
| - |
|
67 |
|
| 59 |
$this->table_auteur = $tables['auteur'];
|
68 |
$this->id_role_auteur = $tables['id_role_auteur'];
|
| Line 60... |
Line 69... |
| 60 |
}
|
69 |
}
|
| Line 61... |
Line 70... |
| 61 |
|
70 |
|
| Line 76... |
Line 85... |
| 76 |
$erreur = "Le fichier ne contient pas les colonnes obligatoires : ".implode(',', array_keys($this->colonnes_obligatoires))."\n";
|
85 |
$erreur = "Le fichier ne contient pas les colonnes obligatoires : ".implode(',', array_keys($this->colonnes_obligatoires))."\n";
|
| 77 |
$erreur .= "ou bien n'est pas séparé par le caractère ';' ";
|
86 |
$erreur .= "ou bien n'est pas séparé par le caractère ';' ";
|
| 78 |
throw new Exception($erreur);
|
87 |
throw new Exception($erreur);
|
| 79 |
}
|
88 |
}
|
| Line -... |
Line 89... |
| - |
|
89 |
|
| - |
|
90 |
|
| - |
|
91 |
//TODO: vérifier si les deux index ci dessous ne font pas double emploi
|
| - |
|
92 |
|
| - |
|
93 |
// Création d'un index des colonnes qui seront importées dans la fiche en les associant
|
| 80 |
|
94 |
// au numéro de colonne dans la feuille csv
|
| 81 |
$index_colonnes_importees = array_intersect(array_keys($this->colonnes_acceptees), $colonnes);
|
95 |
$index_colonnes_importees = array_intersect(array_keys($this->colonnes_acceptees), $colonnes);
|
| 82 |
$colonnes_importees = array();
|
96 |
$colonnes_importees = array();
|
| 83 |
foreach($index_colonnes_importees as $index_colonne_importee) {
|
97 |
foreach($index_colonnes_importees as $index_colonne_importee) {
|
| 84 |
$colonnes_importees[] = $this->colonnes_acceptees[$index_colonne_importee];
|
98 |
$colonnes_importees[] = $this->colonnes_acceptees[$index_colonne_importee];
|
| Line 89... |
Line 103... |
| 89 |
// pour y apporter des traitement spécifiques
|
103 |
// pour y apporter des traitement spécifiques
|
| 90 |
$index_colonnes_importees = $colonnes;
|
104 |
$index_colonnes_importees = $colonnes;
|
| 91 |
foreach($index_colonnes_refusees as $colonne_refusee) {
|
105 |
foreach($index_colonnes_refusees as $colonne_refusee) {
|
| 92 |
unset($index_colonnes_importees[$colonne_refusee]);
|
106 |
unset($index_colonnes_importees[$colonne_refusee]);
|
| 93 |
}
|
107 |
}
|
| - |
|
108 |
|
| - |
|
109 |
$roles_a_num_colonnes = array_flip($index_colonnes_importees);
|
| Line 94... |
Line 110... |
| 94 |
|
110 |
|
| 95 |
$lignes = array();
|
111 |
$lignes = array();
|
| 96 |
while($ligne = fgetcsv($pointeur, 0, ";")) {
|
112 |
while($ligne = fgetcsv($pointeur, 0, ";")) {
|
| 97 |
$ligne_inseree = array();
|
113 |
$ligne_inseree = array();
|
| 98 |
foreach($ligne as $index => &$valeur) {
|
114 |
foreach($ligne as $index => &$valeur) {
|
| 99 |
if(!in_array($index, $index_colonnes_refusees)) {
|
115 |
if(!in_array($index, $index_colonnes_refusees)) {
|
| 100 |
$ligne_inseree[] = $this->traiterChamp($valeur, $index_colonnes_importees[$index]);
|
116 |
$ligne_inseree[] = $this->traiterChamp($valeur, $index_colonnes_importees[$index]);
|
| 101 |
}
|
117 |
}
|
| 102 |
}
|
118 |
}
|
| 103 |
// Ajout du nom complet formaté de la publication
|
119 |
// Ajout du nom complet formaté de la publication
|
| - |
|
120 |
$nom_complet = $this->bdd->proteger($this->formaterNomComplet($ligne, $index_colonnes_importees));
|
| 104 |
$ligne_inseree[] = $this->bdd->proteger($this->formaterNomComplet($ligne, $index_colonnes_importees));
|
121 |
$ligne_inseree[] = $nom_complet;
|
| - |
|
122 |
$lignes[] = "(".implode(",", $ligne_inseree).")";
|
| - |
|
123 |
|
| 105 |
$lignes[] = "(".implode(",", $ligne_inseree).")";
|
124 |
$this->stockerAuteursPourLiaisons($ligne[$roles_a_num_colonnes['auteur']], $nom_complet);
|
| Line 106... |
Line 125... |
| 106 |
}
|
125 |
}
|
| 107 |
|
126 |
|
| 108 |
// Ajout de la colonne nom complet aux champs de la requête
|
127 |
// Ajout de la colonne nom complet aux champs de la requête
|
| 109 |
$colonnes_importees[] = 'cpu_fmt_nom_complet';
|
128 |
$colonnes_importees[] = 'cpu_fmt_nom_complet';
|
| 110 |
|
129 |
|
| - |
|
130 |
// le script renvoie le nombre de publications importées
|
| - |
|
131 |
$nb_publis_inserees = $this->insererPublications($colonnes_importees, $lignes);
|
| - |
|
132 |
$nb_auteurs_lies = $this->insererLiensPublicationsAuteurs();
|
| - |
|
133 |
|
| - |
|
134 |
return $nb_publis_inserees;
|
| - |
|
135 |
}
|
| - |
|
136 |
|
| - |
|
137 |
private function stockerAuteursPourLiaisons($infos_auteurs, $nom_complet_publication) {
|
| - |
|
138 |
// Découpage des différents auteurs
|
| - |
|
139 |
$auteurs_tab = explode(',', $infos_auteurs);
|
| - |
|
140 |
foreach($auteurs_tab as $auteur) {
|
| - |
|
141 |
// si les infos auteurs sont un tableau dans le cache alors son id existe bien en base de données
|
| - |
|
142 |
if(is_array($this->cache_auteur[$auteur])) {
|
| - |
|
143 |
// ajout d'une correspondance entre le nom complet de la publi et l'auteur (pour liaison ultérieure)
|
| - |
|
144 |
// et vice versa, ce qui permet facilement de retrouver à quel auteur est lié quelle publi dans les deux sens
|
| - |
|
145 |
$this->auteurs_a_publi[$auteur][] = $nom_complet_publication;
|
| - |
|
146 |
$this->publis_a_auteurs[$nom_complet_publication][] = $auteur;
|
| - |
|
147 |
}
|
| - |
|
148 |
}
|
| - |
|
149 |
}
|
| - |
|
150 |
|
| - |
|
151 |
protected function insererLiensPublicationsAuteurs() {
|
| - |
|
152 |
|
| - |
|
153 |
$champs = array('cpuap_id_publication', 'cpuap_id_personne', 'cpuap_id_role', 'cpuap_ce_truk_type', 'cpuap_ordre', 'cpuap_ce_meta');
|
| - |
|
154 |
$requete = "INSERT IGNORE INTO ".$this->table_publication_a_auteur." ".
|
| - |
|
155 |
"(".implode(",", $champs).") VALUES ";
|
| - |
|
156 |
|
| - |
|
157 |
foreach($this->auteurs_a_publi as $auteur => $publis) {
|
| - |
|
158 |
|
| - |
|
159 |
$id_auteur = $this->cache_auteur[$auteur]['cp_id_personne'];
|
| - |
|
160 |
|
| - |
|
161 |
// Pour chaque publication importée à laquelle est liée l'auteur
|
| - |
|
162 |
// il peut avoir un ordre différent
|
| - |
|
163 |
foreach($publis as $publi) {
|
| - |
|
164 |
|
| - |
|
165 |
// l'ordre des auteurs commence à 1, les auteurs sont stockés dans l'ordre dans publis_a_auteurs
|
| - |
|
166 |
$ordre_auteur = array_search($auteur, $this->publis_a_auteurs[$publi]) + 1;
|
| - |
|
167 |
|
| - |
|
168 |
// Le nom complet de la publication est normalement unique et donc peut servir à retrouver
|
| - |
|
169 |
// les publications qui ont été insérées par lot (sans en récupérer l'id)
|
| - |
|
170 |
$sous_requete_id_publi = "SELECT cpu_id_publication FROM coel_publication ".
|
| - |
|
171 |
"WHERE cpu_fmt_nom_complet IN (".$publi.") ";
|
| - |
|
172 |
|
| - |
|
173 |
$requete_insertion = $requete." (".
|
| - |
|
174 |
" (".$sous_requete_id_publi."), ".
|
| - |
|
175 |
$this->bdd->proteger($id_auteur).", ".
|
| - |
|
176 |
$this->id_role_auteur.", ".
|
| - |
|
177 |
"NULL ,".
|
| - |
|
178 |
$ordre_auteur.", ".
|
| - |
|
179 |
"NULL".
|
| - |
|
180 |
") ";
|
| - |
|
181 |
$insertion = $this->bdd->executer($requete_insertion);
|
| - |
|
182 |
}
|
| - |
|
183 |
}
|
| 111 |
// le script renvoie le nombre de publications importées
|
184 |
// TODO: quoi faire en ce qui concerne l'insertion des auteurs ?
|
| Line 112... |
Line 185... |
| 112 |
return $this->insererPublications($colonnes_importees, $lignes);
|
185 |
// et le nombre inséré, les éventuels échecs de la requête ?
|
| Line 113... |
Line 186... |
| 113 |
}
|
186 |
}
|
| Line 155... |
Line 228... |
| 155 |
|
228 |
|
| 156 |
private function insererPublications(&$colonnes, &$publications) {
|
229 |
private function insererPublications(&$colonnes, &$publications) {
|
| 157 |
$requete = "INSERT INTO ".$this->table_publication." ".
|
230 |
$requete = "INSERT INTO ".$this->table_publication." ".
|
| 158 |
"(".implode(',', $colonnes).") ".
|
231 |
"(".implode(',', $colonnes).") ".
|
| 159 |
"VALUES ".implode(","."\n", $publications)."\n";
|
232 |
"VALUES ".implode(","."\n", $publications)."\n";
|
| 160 |
|
233 |
|
| 161 |
return $this->bdd->executer($requete);
|
234 |
return $this->bdd->executer($requete);
|
| Line 162... |
Line 235... |
| 162 |
}
|
235 |
}
|
| 163 |
|
236 |
|
| 164 |
private function traiterChamp($valeur, $role) {
|
237 |
private function traiterChamp($valeur, $role) {
|
| 165 |
switch($role) {
|
238 |
switch($role) {
|
| 166 |
case 'auteur':
|
239 |
case 'auteur':
|
| 167 |
$valeur = $this->obtenirInfosAuteur($valeur);
|
240 |
$valeur = $this->traiterChampAuteur($valeur);
|
| 168 |
break;
|
241 |
break;
|
| 169 |
case 'editeur':
|
242 |
case 'editeur':
|
| 170 |
$valeur = 'AUTRES##'.$valeur;
|
243 |
$valeur = 'AUTRE##'.$valeur;
|
| Line 171... |
Line 244... |
| 171 |
break;
|
244 |
break;
|
| 172 |
}
|
245 |
}
|
| - |
|
246 |
|
| - |
|
247 |
return $this->bdd->proteger($valeur);
|
| - |
|
248 |
}
|
| - |
|
249 |
|
| - |
|
250 |
private function traiterChampAuteur($auteur_intitule) {
|
| - |
|
251 |
$auteurs_fmt = array();
|
| - |
|
252 |
$auteurs_tab = explode(',', $auteur_intitule);
|
| - |
|
253 |
foreach($auteurs_tab as $auteur) {
|
| - |
|
254 |
$auteurs_fmt[] = $this->obtenirInfosAuteur($auteur);
|
| - |
|
255 |
}
|
| Line 173... |
Line 256... |
| 173 |
|
256 |
|
| 174 |
return $this->bdd->proteger($valeur);
|
257 |
return implode(', ', $auteurs_fmt);
|
| - |
|
258 |
}
|
| 175 |
}
|
259 |
|
| - |
|
260 |
private function obtenirInfosAuteur($auteur_intitule) {
|
| - |
|
261 |
$retour = $auteur_intitule;
|
| 176 |
|
262 |
// Si on déjà recherché et trouvé (ou non l'auteur)
|
| 177 |
private function obtenirInfosAuteur($auteur_intitule) {
|
263 |
if(isset($this->cache_auteur[$auteur_intitule])) {
|
| 178 |
$retour = $auteur_intitule;
|
264 |
// On renvoie son nom complet formatée s'il existe en bdd ou sinon
|
| 179 |
if(isset($this->cache_auteur[$auteur_intitule])) {
|
265 |
// le nom qui a été donné dans la feuille csv
|
| - |
|
266 |
$retour = !empty($this->cache_auteur[$auteur_intitule]['cp_id_personne']) ?
|
| - |
|
267 |
$this->cache_auteur[$auteur_intitule]['cp_id_personne'] :
|
| 180 |
$retour = !empty($this->cache_auteur[$auteur_intitule]['cp_id_personne']) ?
|
268 |
$this->cache_auteur[$auteur_intitule];
|
| 181 |
$this->cache_auteur[$auteur_intitule]['cp_id_personne'] :
|
269 |
} else {
|
| Line 182... |
Line 270... |
| 182 |
$this->cache_auteur[$auteur_intitule];
|
270 |
// Recherche de l'auteur sur un maximum du combinaisons possible des variations
|
| 183 |
} else {
|
271 |
// de son nom et prénom
|
| Line -... |
Line 272... |
| - |
|
272 |
$auteur = $this->fabriquerCombinaisonsAuteur($auteur_intitule);
|
| - |
|
273 |
$auteur_req = "(".implode(', ', $auteur).")";
|
| 184 |
$auteur = $this->fabriquerCombinaisonsAuteur($auteur_intitule);
|
274 |
|
| 185 |
$auteur_req = "(".implode(', ', $auteur).")";
|
275 |
$requete = "SELECT cp_id_personne, cp_fmt_nom_complet FROM ".$this->table_auteur." WHERE cp_fmt_nom_complet IN ".$auteur_req;
|
| 186 |
|
276 |
$infos_auteur = $this->bdd->recupererTous($requete);
|
| 187 |
$requete = "SELECT cp_id_personne, cp_fmt_nom_complet FROM ".$this->table_auteur." WHERE cp_fmt_nom_complet IN ".$auteur_req;
|
277 |
|
| 188 |
$infos_auteur = $this->bdd->recupererTous($requete);
|
278 |
// Stockage en cache de la ligne de bdd si trouvé,
|
| 189 |
|
279 |
// de la valeur brute sinon
|
| 190 |
if(!empty($infos_auteur)) {
|
280 |
if(!empty($infos_auteur)) {
|