Subversion Repositories eFlore/Applications.coel

Rev

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

Rev 1865 Rev 1874
Line 43... Line 43...
43
		}
43
		}
Line 44... Line 44...
44
		
44
		
45
		// renvoi du résultat vers la sortie php
45
		// renvoi du résultat vers la sortie php
46
		// car le script est surtout destiné à être appelé par un web service
46
		// car le script est surtout destiné à être appelé par un web service
-
 
47
		echo $resultat;
47
		echo $resultat;
48
		exit;
Line 48... Line 49...
48
	}
49
	}
49
	
50
	
50
	private function initialiserScript() {
51
	private function initialiserScript() {
Line 59... Line 60...
59
		
60
		
60
		$this->colonnes_obligatoires= Config::get('champs_obligatoires');
61
		$this->colonnes_obligatoires= Config::get('champs_obligatoires');
Line 61... Line 62...
61
		$this->colonnes_acceptees = Config::get('champs');
62
		$this->colonnes_acceptees = Config::get('champs');
62
		
63
		
63
		$tables = Config::get('tables');
64
		$tables = Config::get('tables');
64
		$this->table_publication = $tables['publication'];
65
		$this->table_publication = $tables['publication'];
Line 65... Line 66...
65
		$this->table_auteur = $tables['auteur'];
66
		$this->table_auteur = $tables['auteur'];
66
		$this->table_publication_a_auteur = $tables['publication_a_auteur'];
67
		$this->table_publication_a_auteur = $tables['publication_a_auteur'];
Line 67... Line 68...
67
		
68
		
Line 68... Line 69...
68
		$this->id_role_auteur = $tables['id_role_auteur'];
69
		$this->id_role_auteur = $tables['id_role_auteur'];
69
	}
70
	}
70
 
71
 
71
	private function charger($fichier) {
72
	private function charger($fichier) {
72
		
73
		
Line 73... Line 74...
73
		// vérification existence fichier
74
		// vérification existence fichier
74
		if(!file_exists(Config::get('dossiertmp').$fichier)) {
75
		if(!file_exists(Config::get('dossiertmp').$fichier)) {
75
			$erreur = "Le fichier ".Config::get('dossiertmp').$fichier." n'existe pas.";
76
			$erreur = "Le fichier ".Config::get('dossiertmp').$fichier." n'existe pas.";
Line 76... Line 77...
76
			throw new Exception($erreur);
77
			throw new Exception($erreur);
77
		}
78
		}
78
		
79
		
79
		$pointeur = fopen(Config::get('dossiertmp').$fichier, "r");
80
		$pointeur = fopen(Config::get('dossiertmp').$fichier, "r");
80
		// Chargement de la première colonne (qui contient les noms de colonnes à importer
81
		// Chargement de la première colonne (qui contient les noms de colonnes à importer
81
		$colonnes = fgetcsv($pointeur, 0, ";");
82
		$colonnes = fgetcsv($pointeur, 0, ";");
Line 82... Line 83...
82
 
83
 
Line 135... Line 136...
135
	}
136
	}
Line 136... Line 137...
136
	
137
	
137
	private function stockerAuteursPourLiaisons($infos_auteurs, $nom_complet_publication) {
138
	private function stockerAuteursPourLiaisons($infos_auteurs, $nom_complet_publication) {
138
		// Découpage des différents auteurs 
139
		// Découpage des différents auteurs 
-
 
140
		$auteurs_tab = explode(',', $infos_auteurs);
139
		$auteurs_tab = explode(',', $infos_auteurs);
141
		$auteurs_tab = array_filter($auteurs_tab);
140
		foreach($auteurs_tab as $auteur) {
142
		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
143
			// 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])) {
144
			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)
145
				// 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
146
				// 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;
147
				$this->auteurs_a_publi[$auteur][] = $nom_complet_publication;
146
				$this->publis_a_auteurs[$nom_complet_publication][] = $auteur;
148
				$this->publis_a_auteurs[$nom_complet_publication][] = $auteur;
147
			}
149
			}
148
		}
150
		}
Line 149... Line 151...
149
	}
151
	}
Line 150... Line 152...
150
	
152
	
151
	protected function insererLiensPublicationsAuteurs() {
153
	protected function insererLiensPublicationsAuteurs() {
152
				
154
				
153
		$champs = array('cpuap_id_publication', 'cpuap_id_personne', 'cpuap_id_role', 'cpuap_ce_truk_type', 'cpuap_ordre', 'cpuap_ce_meta');
155
		$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." ".
156
		$requete = "INSERT IGNORE INTO ".$this->table_publication_a_auteur." ".
Line 155... Line 157...
155
					"(".implode(",", $champs).") VALUES "; 
157
					"(".implode(",", $champs).") VALUES "; 
Line 156... Line 158...
156
		
158
		
Line 164... Line 166...
164
				
166
				
165
				// l'ordre des auteurs commence à 1, les auteurs sont stockés dans l'ordre dans publis_a_auteurs
167
				// l'ordre des auteurs commence à 1, les auteurs sont stockés dans l'ordre dans publis_a_auteurs
Line 166... Line 168...
166
				$ordre_auteur = array_search($auteur, $this->publis_a_auteurs[$publi]) + 1;
168
				$ordre_auteur = array_search($auteur, $this->publis_a_auteurs[$publi]) + 1;
167
				
169
				
168
				// Le nom complet de la publication est normalement unique et donc peut servir à retrouver 
170
				// 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)
171
				// les publications qui ont été insérées par lot (sans en récupérer l'id)
Line 170... Line 172...
170
				$sous_requete_id_publi = "SELECT cpu_id_publication FROM coel_publication ".
172
				$sous_requete_id_publi = "SELECT cpu_id_publication FROM coel_publication ".
171
							"WHERE cpu_fmt_nom_complet IN (".$publi.") ";
173
							"WHERE cpu_fmt_nom_complet IN (".$publi.") ";
Line 177... Line 179...
177
										"NULL ,".
179
										"NULL ,".
178
										$ordre_auteur.", ".
180
										$ordre_auteur.", ".
179
										"NULL".
181
										"NULL".
180
									") ";
182
									") ";
181
				$insertion = $this->bdd->executer($requete_insertion);	
183
				$insertion = $this->bdd->executer($requete_insertion);	
182
			}	
184
			}	
183
		}
185
		}
184
		// TODO: quoi faire en ce qui concerne l'insertion des auteurs ?
186
		// TODO: quoi faire en ce qui concerne l'insertion des auteurs ?
185
		// et le nombre inséré, les éventuels échecs de la requête ?
187
		// et le nombre inséré, les éventuels échecs de la requête ?
186
	}
188
	}
Line 225... Line 227...
225
		
227
		
226
		return $fmt_nom_complet;
228
		return $fmt_nom_complet;
Line 227... Line 229...
227
	}
229
	}
-
 
230
	
-
 
231
	private function insererPublications(&$colonnes, &$publications) {
-
 
232
		
-
 
233
		// Une insertion par tranche de 1000 permet d'insérer sans avoir de mysql
-
 
234
		// timeout qui nécessite de réveiller la connexion de temps en temps.
-
 
235
		// TODO: transactions ?
-
 
236
		$tranches_publis = array_chunk($publications, 1000);
-
 
237
		$nb_publis_inserees = 0; 
-
 
238
		
228
	
239
		foreach($tranches_publis as $tranche) {
229
	private function insererPublications(&$colonnes, &$publications) {
240
		
230
		$requete = "INSERT INTO ".$this->table_publication." ".
241
			$requete = "INSERT INTO ".$this->table_publication." ".
-
 
242
					   	"(".implode(',', $colonnes).") ".
-
 
243
					   "VALUES ".implode(","."\n", $tranche)."\n";
-
 
244
			
Line 231... Line 245...
231
				   	"(".implode(',', $colonnes).") ".
245
			$nb_publis_inserees += $this->bdd->executer($requete);
232
				   "VALUES ".implode(","."\n", $publications)."\n";
246
		}
Line 233... Line 247...
233
 
247
 
234
		return $this->bdd->executer($requete);
248
		return $nb_publis_inserees;
235
	}
249
	}
Line 249... Line 263...
249
	
263
	
250
	private function traiterChampAuteur($auteur_intitule) {
264
	private function traiterChampAuteur($auteur_intitule) {
251
		$auteurs_fmt = array();
265
		$auteurs_fmt = array();
252
		$auteurs_tab = explode(',', $auteur_intitule);
266
		$auteurs_tab = explode(',', $auteur_intitule);
-
 
267
		foreach($auteurs_tab as $auteur) {
253
		foreach($auteurs_tab as $auteur) {
268
			if(!empty(trim($auteur))) {
-
 
269
				$auteurs_fmt[] = $this->obtenirInfosAuteur($auteur);
254
			$auteurs_fmt[] = $this->obtenirInfosAuteur($auteur);
270
			}
Line 255... Line 271...
255
		}
271
		}
256
		
272
		
257
		return implode(', ', $auteurs_fmt);
273
		return implode(', ', $auteurs_fmt);
258
	}
274
	}
259
	
275
	
260
	private function obtenirInfosAuteur($auteur_intitule) {
276
	private function obtenirInfosAuteur($auteur_intitule) {
261
		$retour = $auteur_intitule;
277
		$retour = $auteur_intitule;
262
		// Si on déjà recherché et trouvé (ou non l'auteur)
278
		// Si on déjà recherché et trouvé (ou non l'auteur)
263
		if(isset($this->cache_auteur[$auteur_intitule])) {
279
		if(isset($this->cache_auteur[$auteur_intitule])) {
264
			// On renvoie son nom complet formatée s'il existe en bdd ou sinon
280
			// On renvoie son nom complet formatée s'il existe en bdd ou sinon
265
			// le nom qui a été donné dans la feuille csv
281
			// le nom qui a été donné dans la feuille csv
Line 284... Line 300...
284
				$retour = $auteur_intitule;
300
				$retour = $auteur_intitule;
285
				$this->cache_auteur[$auteur_intitule] = $auteur_intitule;
301
				$this->cache_auteur[$auteur_intitule] = $auteur_intitule;
286
			}
302
			}
287
		}
303
		}
Line 288... Line 304...
288
		
304
		
289
		return $retour;
305
		return $retour;
Line 290... Line 306...
290
	}
306
	}
Line 291... Line 307...
291
			
307
			
Line 347... Line 363...
347
		}
363
		}
Line 348... Line 364...
348
 
364
 
349
		return $auteurs_formates;
365
		return $auteurs_formates;
Line 350... Line 366...
350
	}
366
	}
351
 
367
 
352
	// http://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays
368
	// http://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays
353
	function cartesian($input) {
369
	function cartesian($input) {
354
		// filter out empty values
370
		// filter out empty values
355
		$input = array_filter($input);
371
		$input = array_filter($input);
356
	
372
	
357
		$result = array(array());
373
		$result = array(array());
358
	
374
	
359
		foreach ($input as $key => $values) {
375
		foreach ($input as $key => $values) {
360
			$append = array();
376
			$append = array();
361
	
377
	
362
			foreach($result as $product) {
378
			foreach($result as $product) {
363
				foreach($values as $item) {
379
				foreach($values as $item) {
364
					$product[$key] = $item;
380
					$product[$key] = $item;
365
					$append[] = $product;
381
					$append[] = $product;
366
				}
382
				}
367
			}
383
			}
368
	
384
	
369
			$result = $append;
385
			$result = $append;
370
		}
386
		}
371
	
387
	
372
		return $result;
388
		return $result;
373
	}
389
	}
374
}
390
}