Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1675 Rev 1677
Line 66... Line 66...
66
 
66
 
67
// XXX: PHP 5.3
67
// XXX: PHP 5.3
68
function __anonyme_1($v) {	return !$v['importable']; }
68
function __anonyme_1($v) {	return !$v['importable']; }
69
function __anonyme_2(&$v) {	$v = $v['nom']; }
69
function __anonyme_2(&$v) {	$v = $v['nom']; }
70
function __anonyme_3($cell) { return !is_null($cell); };
-
 
71
function __anonyme_4($item, $key, $obj) { $item = $obj->quoteNonNull(trim($item)); }
70
function __anonyme_3($cell) { return !is_null($cell); };
72
function __anonyme_5($item) { return is_null($item) ? '?' : $item; }
71
function __anonyme_5($item) { return is_null($item) ? '?' : $item; }
Line 73... Line 72...
73
function __anonyme_6() { return NULL; }
72
function __anonyme_6() { return NULL; }
-
 
73
 
Line 74... Line 74...
74
 
74
class ImportXLS extends Cel  {
75
class ImportXLS extends Cel  {
75
	static function __anonyme_4($item, $key, $obj) { $item = $obj->quoteNonNull(trim($item)); }
76
 
76
 
77
	static $ordre_BDD = Array(
77
	static $ordre_BDD = Array(
Line 222... Line 222...
222
		$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL, FALSE, FALSE, TRUE);
222
		$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL, FALSE, FALSE, TRUE);
223
		$filtre->exclues = self::detectionEntete($donnees[1]);
223
		$filtre->exclues = self::detectionEntete($donnees[1]);
Line 224... Line 224...
224
 
224
 
225
		$obs_ajouts = 0;
225
		$obs_ajouts = 0;
-
 
226
		$obs_maj = 0;
-
 
227
		$nb_images_ajoutees = 0;
-
 
228
		$nb_mots_cle_ajoutes = 0;
226
		$obs_maj = 0;
229
 
227
		$dernier_ordre = $this->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
230
		$dernier_ordre = $this->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
228
		$dernier_ordre = intval($dernier_ordre[0]['ordre']) + 1;
231
		$dernier_ordre = intval($dernier_ordre[0]['ordre']) + 1;
Line 229... Line 232...
229
		if(! $dernier_ordre) $dernier_ordre = 0;
232
		if(! $dernier_ordre) $dernier_ordre = 0;
Line 244... Line 247...
244
			$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL, FALSE, FALSE, TRUE);
247
			$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL, FALSE, FALSE, TRUE);
Line 245... Line 248...
245
 
248
 
246
			// ici on appel la fonction qui fera effectivement l'insertion multiple
249
			// ici on appel la fonction qui fera effectivement l'insertion multiple
Line 247... Line 250...
247
			// à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
250
			// à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
248
 
251
 
249
			// TODO: passer $this, ne sert que pour appeler des méthodes public qui pourraient être statiques
252
			// TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques
250
			// notamment dans RechercheInfosTaxonBeta.php
253
			// notamment dans RechercheInfosTaxonBeta.php
251
			list($enregistrements, $images) =
254
			list($enregistrements, $images, $mots_cle) =
Line 252... Line 255...
252
				self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
255
				self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
253
			if(! $enregistrements) break;
256
			if(! $enregistrements) break;
Line 268... Line 271...
268
			$this->bdd->beginTransaction();
271
			$this->bdd->beginTransaction();
269
			$stmt = $this->bdd->prepare($sql_pattern);
272
			$stmt = $this->bdd->prepare($sql_pattern);
270
			$donnees = array();
273
			$donnees = array();
271
			foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
274
			foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
Line 272... Line 275...
272
 
275
 
Line 273... Line 276...
273
			/* debug ici: echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die;*/
276
			/* debug ici: */ echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die;
Line 274... Line 277...
274
 
277
 
275
			$stmt->execute($donnees);
278
			$stmt->execute($donnees);
Line 281... Line 284...
281
			if(! $dernier_autoinc) trigger_error("l'insertion semble avoir échoué", E_USER_NOTICE);
284
			if(! $dernier_autoinc) trigger_error("l'insertion semble avoir échoué", E_USER_NOTICE);
Line 282... Line 285...
282
 
285
 
283
			$obs_ajouts += count($enregistrements);
286
			$obs_ajouts += count($enregistrements);
284
			// $obs_ajouts += count($enregistrements['insert']);
287
			// $obs_ajouts += count($enregistrements['insert']);
285
			// $obs_maj += count($enregistrements['update']);
288
			// $obs_maj += count($enregistrements['update']);
-
 
289
			$nb_images_ajoutees += self::stockerImages($this, $enregistrements, $images, $dernier_autoinc);
286
			$nb_images_ajoutees = self::stockerImages($this, $enregistrements, $images, $dernier_autoinc);
290
			$nb_mots_cle_ajoutes += self::stockerMotsCle($this, $enregistrements, $mots_cle, $dernier_autoinc);
Line 287... Line 291...
287
		}
291
		}
Line 288... Line 292...
288
 
292
 
Line 296... Line 300...
296
		die("$summary");
300
		die("$summary");
297
	}
301
	}
Line 298... Line 302...
298
 
302
 
299
	static function detectionEntete($entete) {
303
	static function detectionEntete($entete) {
300
		$colonnes_reconnues = Array();
304
		$colonnes_reconnues = Array();
301
		$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard');
305
		$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard'); // ,avance
302
		foreach($entete as $k => $v) {
306
		foreach($entete as $k => $v) {
303
			$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
307
			$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
304
			foreach($cols as $col) {
308
			foreach($cols as $col) {
305
				$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
309
				$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
Line 351... Line 355...
351
			if(! array_filter($ligne, '__anonyme_3')) continue;
355
			if(! array_filter($ligne, '__anonyme_3')) continue;
Line 352... Line 356...
352
 
356
 
353
			if( ($enregistrement = self::chargerLigne($ligne, $dernier_ordre, $cel)) ) {
357
			if( ($enregistrement = self::chargerLigne($ligne, $dernier_ordre, $cel)) ) {
354
				// $enregistrements[] = array_merge($colonnes_statiques, $enregistrement);
358
				// $enregistrements[] = array_merge($colonnes_statiques, $enregistrement);
-
 
359
				$enregistrements[] = $enregistrement;
-
 
360
				$pos = count($enregistrements) - 1;
Line 355... Line 361...
355
				$enregistrements[] = $enregistrement;
361
				$last = &$enregistrements[$pos];
356
 
-
 
357
				if(isset($enregistrement['_images'])) {
-
 
358
					$pos = count($enregistrements) - 1;
362
 
359
					$last = &$enregistrements[$pos];
363
				if(isset($enregistrement['_images'])) {
360
					// ne dépend pas de cel_obs, et seront insérées *après* les enregistrements
364
					// ne dépend pas de cel_obs, et seront insérées *après* les enregistrements
361
					// mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
365
					// mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
362
					$toutes_images[] = Array("images" => $last['_images'],
366
					$toutes_images[] = Array("images" => $last['_images'],
363
											 "obs_pos" => $pos);
367
											 "obs_pos" => $pos);
364
					// ce champ n'a pas a faire partie de l'insertion dans cel_obs,
368
					// ce champ n'a pas à faire partie de l'insertion dans cel_obs,
365
					// mais est utile pour cel_obs_images
369
					// mais est utile pour cel_obs_images
Line -... Line 370...
-
 
370
					unset($last['_images']);
-
 
371
				}
-
 
372
 
-
 
373
				if(isset($enregistrement['_mots_cle'])) {
-
 
374
					// ne dépend pas de cel_obs, et seront insérés *après* les enregistrements
-
 
375
					// mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
-
 
376
					$tous_mots_cle[] = Array("mots_cle" => $last['_mots_cle'],
-
 
377
											 "obs_pos" => $pos);
-
 
378
					// la version inlinée des mots est enregistrées dans cel_obs
-
 
379
					// mais cel_mots_cles_obs fait foi.
-
 
380
					// XXX: postponer l'ajout de ces informations dans cel_obs *après* l'insertion effective
-
 
381
					// des records dans cel_mots_cles_obs ?
-
 
382
					$last[C_MOTS_CLES_TEXTE] = $last['_mots_cle']['inline_cel_obs'];
366
					unset($last['_images']);
383
					unset($last['_mots_cle']);
367
				}
384
				}
368
 
385
 
Line 369... Line 386...
369
				$dernier_ordre++;
386
				$dernier_ordre++;
370
			}
387
			}
371
		}
388
		}
Line 372... Line 389...
372
 
389
 
373
		// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
390
		// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
Line 382... Line 399...
382
			//$req .= implode(', ', $enregistrement) . "\n";
399
			//$req .= implode(', ', $enregistrement) . "\n";
383
		}
400
		}
384
	}
401
	}
Line -... Line 402...
-
 
402
 
-
 
403
 
-
 
404
	static function stockerMotsCle($cel, $enregistrements, $tous_mots_cle, $lastid) {
-
 
405
		return count($tous_mots_cle);
385
 
406
	}
386
 
407
 
387
	static function stockerImages($cel, $enregistrements, $toutes_images, $lastid) {
408
	static function stockerImages($cel, $enregistrements, $toutes_images, $lastid) {
Line 388... Line 409...
388
		$images_insert = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES %s ON DUPLICATE KEY UPDATE id_image = id_image';
409
		$images_insert = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES %s ON DUPLICATE KEY UPDATE id_image = id_image';
Line 480... Line 501...
480
		// passage de $enregistrement par référence, ainsi ['_images'] n'est défini
501
		// passage de $enregistrement par référence, ainsi ['_images'] n'est défini
481
		// que si des résultats sont trouvés
502
		// que si des résultats sont trouvés
482
		// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
503
		// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
483
		if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel, $enregistrement);
504
		if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel, $enregistrement);
Line -... Line 505...
-
 
505
 
-
 
506
		if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel, $enregistrement);
484
 
507
 
485
		return $enregistrement;
508
		return $enregistrement;
Line 486... Line 509...
486
	}
509
	}
487
 
510
 
Line 488... Line 511...
488
	static function traiterImage($str, $cel, &$enregistrement) {
511
	static function traiterImage($str, $cel, &$enregistrement) {
489
		$liste_images = array_filter(explode("/", $str));
512
		$liste_images = array_filter(explode("/", $str));
490
 
-
 
491
		array_walk($liste_images,
513
 
492
				   '__anonyme_4',
514
		//array_walk($liste_images, '__anonyme_4', $cel);
493
				   $cel);
515
		array_walk($liste_images, array(__CLASS__, '__anonyme_4'), $cel);
494
		$requete = sprintf(
516
		$requete = sprintf(
Line 495... Line 517...
495
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
517
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
Line 496... Line 518...
496
			$cel->id_utilisateur,
518
			$cel->id_utilisateur,
497
			implode('","', $liste_images));
519
			implode('","', $liste_images));
Line -... Line 520...
-
 
520
 
-
 
521
		$resultat = $cel->requeter($requete);
-
 
522
 
-
 
523
		if($resultat) $enregistrement['_images'] = $resultat;
-
 
524
	}
-
 
525
 
-
 
526
	static function traiterMotsCle($str, $cel, &$enregistrement) {
-
 
527
		$liste_mots_cle = array_filter(explode(",", $str));
-
 
528
		array_walk($liste_mots_cle, array(__CLASS__, '__anonyme_4'), $cel);
-
 
529
		// TODO!!!! remplace > (pour les tests uniquement) par un = et supprimer le group by mot_cle
-
 
530
		$requete = sprintf("SELECT id_mot_cle_obs, mot_cle FROM cel_mots_cles_obs WHERE id_utilisateur > %d ".
-
 
531
						   "AND mot_cle IN (\"%s\") ".
-
 
532
						   "GROUP BY mot_cle",
-
 
533
						   $cel->id_utilisateur,
-
 
534
						   implode('","', $liste_mots_cle));
-
 
535
 
-
 
536
		$resultat_sql = $cel->requeter($requete);
-
 
537
		if(!$resultat_sql) return;
-
 
538
 
-
 
539
		$resultat = array();
-
 
540
		foreach($resultat_sql as $v) $resultat[$v['id_mot_cle_obs']] = $v['mot_cle'];
Line 498... Line 541...
498
 
541
 
Line 499... Line 542...
499
		$resultat = $cel->requeter($requete);
542
		$enregistrement['_mots_cle'] = array("inline_cel_obs" => implode(',', $liste_mots_cle),
500
 
543
											 "existing" => $resultat,