Subversion Repositories eFlore/Applications.coel

Rev

Rev 1857 | Rev 1875 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1857 Rev 1862
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)) {