Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2155 Rev 2381
Line 150... Line 150...
150
	// XXX future: mais pourraient varier dans le futur si la mise-à-jour
150
	// XXX future: mais pourraient varier dans le futur si la mise-à-jour
151
	// d'observation est implémentée
151
	// d'observation est implémentée
152
	"date_creation" => "now()",
152
	"date_creation" => "now()",
153
	"date_modification" => "now()",
153
	"date_modification" => "now()",
154
    );
154
    );
-
 
155
    
-
 
156
    public static $prefixe_colonnes_etendues = 'ext:';
-
 
157
    public static $indexes_colonnes_etendues = Array();
-
 
158
    public static $gestion_champs_etendus = null;
Line 155... Line 159...
155
 
159
 
Line 156... Line 160...
156
    public $id_utilisateur = NULL;
160
    public $id_utilisateur = NULL;
157
 
161
 
Line 254... Line 258...
254
 
258
 
255
	$obs_ajouts = 0;
259
	$obs_ajouts = 0;
256
	$obs_maj = 0;
260
	$obs_maj = 0;
257
	$nb_images_ajoutees = 0;
261
	$nb_images_ajoutees = 0;
-
 
262
	$nb_mots_cle_ajoutes = 0;
Line 258... Line 263...
258
	$nb_mots_cle_ajoutes = 0;
263
	$nb_champs_etendus_inseres = 0;
259
 
264
 
260
	$dernier_ordre = Cel::db()->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
265
	$dernier_ordre = Cel::db()->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
Line 302... Line 307...
302
	    // var_dump($donnees, get_defined_constants(true)['user']);die;
307
	    // var_dump($donnees, get_defined_constants(true)['user']);die;
303
	    // ici on appel la fonction qui fera effectivement l'insertion multiple
308
	    // ici on appel la fonction qui fera effectivement l'insertion multiple
304
	    // à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
309
	    // à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
Line 305... Line 310...
305
 
310
 
306
	    // TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques
311
	    // TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques
307
	    list($enregistrements, $images, $mots_cle) =
312
	    list($enregistrements, $images, $mots_cle, $champs_etendus) =
308
		self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
313
		self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
Line 309... Line 314...
309
	    if(! $enregistrements) break;
314
	    if(! $enregistrements) break;
310
 
315
 
Line 342... Line 347...
342
	    
347
	    
Line 343... Line 348...
343
	    $ordre_ids = self::chargerCorrespondancesIdOrdre($this, $enregistrements);
348
	    $ordre_ids = self::chargerCorrespondancesIdOrdre($this, $enregistrements);
344
	    
349
	    
-
 
350
	    $nb_images_ajoutees += self::stockerImages($enregistrements, $images, $ordre_ids);
345
	    $nb_images_ajoutees += self::stockerImages($enregistrements, $images, $ordre_ids);
351
	    $nb_mots_cle_ajoutes += self::stockerMotsCle($enregistrements, $mots_cle, $dernier_autoinc);
Line 346... Line 352...
346
	    $nb_mots_cle_ajoutes += self::stockerMotsCle($enregistrements, $mots_cle, $dernier_autoinc);
352
	    $nb_champs_etendus_inseres += self::stockerChampsEtendus($champs_etendus, $ordre_ids, $this->config);
Line 347... Line 353...
347
	}
353
	}
Line 377... Line 383...
377
       Le détecter après coup est difficile et pourtant cette distinction est importante car le comportement
383
       Le détecter après coup est difficile et pourtant cette distinction est importante car le comportement
378
       d'array_merge() (réordonnancement des clefs numérique) n'est pas souhaitable dans le second cas. */
384
       d'array_merge() (réordonnancement des clefs numérique) n'est pas souhaitable dans le second cas. */
379
    static function detectionEntete($entete, $numeric_keys = FALSE) {
385
    static function detectionEntete($entete, $numeric_keys = FALSE) {
380
	$colonnes_reconnues = Array();
386
	$colonnes_reconnues = Array();
381
	$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard,avance');
387
	$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard,avance');
-
 
388
	
382
	foreach($entete as $k => $v) {
389
	foreach($entete as $k => $v) {
383
	    // traite les colonnes en faisant fi de la casse et des accents
390
	    // traite les colonnes en faisant fi de la casse et des accents
384
	    $entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
391
	    $entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
385
	    foreach($cols as $col) {
392
	    foreach($cols as $col) {
386
		$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
393
			$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
387
		$entete_officiel_abbrev = $col['abbrev'];
394
			$entete_officiel_abbrev = $col['abbrev'];
388
		if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
395
			if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
389
		    // debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n";
396
			    // debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n";
390
		    define("C_" . strtoupper($entete_officiel_abbrev), $k);
397
			    define("C_" . strtoupper($entete_officiel_abbrev), $k);
391
		    $colonnes_reconnues[$k] = 1;
398
			    $colonnes_reconnues[$k] = 1;
392
		    break;
399
			    break;
-
 
400
			}
-
 
401
 
-
 
402
			if(strpos($v, self::$prefixe_colonnes_etendues) === 0) {
-
 
403
				$colonnes_reconnues[$k] = 1;
-
 
404
				self::$indexes_colonnes_etendues[$k] = $v;
-
 
405
				break;
393
		}
406
			}
394
	    }
407
	    }
395
	}
408
	}
-
 
409
	
396
	// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
410
	// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
397
	// le tableau renvoyé par PHPExcel
411
	// le tableau renvoyé par PHPExcel
398
	// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
412
	// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
399
	// les utilisent
413
	// les utilisent
400
	foreach($cols as $col) {
414
	foreach($cols as $col) {
Line 453... Line 467...
453
    static function chargerLignes($cel, $lignes, $colonnes_statiques, &$dernier_ordre) {
467
    static function chargerLignes($cel, $lignes, $colonnes_statiques, &$dernier_ordre) {
454
	$enregistrement = NULL;
468
	$enregistrement = NULL;
455
	$enregistrements = Array();
469
	$enregistrements = Array();
456
	$toutes_images = Array();
470
	$toutes_images = Array();
457
	$tous_mots_cle = Array();
471
	$tous_mots_cle = Array();
-
 
472
	$tous_champs_etendus = array();
Line 458... Line 473...
458
 
473
 
-
 
474
	foreach($lignes as $ligne) {
459
	foreach($lignes as $ligne) {
475
		
460
	    // dans le cas de fgetcsv, on peut avoir des false additionnel (cf do/while l. 279)
476
	    // dans le cas de fgetcsv, on peut avoir des false additionnel (cf do/while l. 279)
Line 461... Line 477...
461
	    if($ligne === false) continue;
477
	    if($ligne === false) continue;
462
 
478
 
Line 491... Line 507...
491
		    // XXX: postponer l'ajout de ces informations dans cel_obs *après* l'insertion effective
507
		    // XXX: postponer l'ajout de ces informations dans cel_obs *après* l'insertion effective
492
		    // des records dans cel_mots_cles_obs ?
508
		    // des records dans cel_mots_cles_obs ?
493
		    unset($last['_mots_cle']);
509
		    unset($last['_mots_cle']);
494
		}
510
		}
Line -... Line 511...
-
 
511
 
-
 
512
		if(isset($enregistrement['_champs_etendus'])) {
-
 
513
			$tous_champs_etendus[] = Array("champs_etendus" => $last['_champs_etendus'],
-
 
514
					"ordre" => $dernier_ordre);
-
 
515
			unset($last['_champs_etendus']);
495
 
516
		}
496
		$dernier_ordre++;
517
		$dernier_ordre++;
497
	    }
518
	    }
Line 498... Line 519...
498
	}
519
	}
499
 
520
 
500
	// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
521
	// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
Line 501... Line 522...
501
	return Array($enregistrements, $toutes_images, $tous_mots_cle);
522
	return Array($enregistrements, $toutes_images, $tous_mots_cle, $tous_champs_etendus);
502
    }
523
    }
Line 621... Line 642...
621
	// que si des résultats sont trouvés
642
	// que si des résultats sont trouvés
622
	// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
643
	// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
623
	if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
644
	if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
Line 624... Line 645...
624
 
645
 
-
 
646
	if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
-
 
647
	
-
 
648
	$champs_etendus = self::traiterChampsEtendus($ligne, self::$indexes_colonnes_etendues);
-
 
649
	if(!empty($champs_etendus)) {
-
 
650
		$enregistrement["_champs_etendus"] = $champs_etendus;
Line 625... Line 651...
625
	if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
651
	}
626
 
652
 
-
 
653
	return $enregistrement;
-
 
654
    }
-
 
655
    
-
 
656
    static function traiterChampsEtendus(&$ligne, &$indexes_colonnes_etendues) {
-
 
657
    	$champs_etendus_indexes = array();
-
 
658
    	foreach($indexes_colonnes_etendues as $index_num => $label) {
-
 
659
    		if(isset($ligne[$index_num])) {
-
 
660
    			$champs_etendus_indexes[str_replace(self::$prefixe_colonnes_etendues, '', $label)] = $ligne[$index_num];
-
 
661
    		}
-
 
662
    	}
Line 627... Line 663...
627
	return $enregistrement;
663
    	return $champs_etendus_indexes;
628
    }
664
    }
Line 629... Line 665...
629
 
665
 
Line 1006... Line 1042...
1006
	$departement = trim($departement); // TODO
1042
	$departement = trim($departement); // TODO
Line 1007... Line 1043...
1007
 
1043
 
1008
	$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
1044
	$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
1009
	$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
1045
	$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
1010
    }
1046
    }
1011
 
1047
    
1012
    /*
1048
    
1013
      static function traiterLocalisation($ligne, Array &$localisation) {
1049
    public static function stockerChampsEtendus($champs_etendus, $ordre_ids, $config) {   	
1014
      $identifiant_commune = trim($ligne[C_ZONE_GEO]);
1050
    	// singleton du pauvre mais l'export est suffisamment inefficace pour s'en priver
1015
      if(!$identifiant_commune) {
1051
    	self::$gestion_champs_etendus = self::$gestion_champs_etendus == null ?
1016
      $departement = trim($ligne[C_CE_ZONE_GEO]);
1052
    										new GestionChampsEtendus($config, 'obs') : 
1017
      goto testdepartement;
-
 
1018
      }
-
 
1019
 
-
 
1020
 
-
 
1021
      $select = "SELECT DISTINCT nom, code  FROM cel_zones_geo";
1053
    										self::$gestion_champs_etendus;
1022
	
-
 
1023
      if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
-
 
1024
      // commune + departement : montpellier (34)
-
 
1025
      $nom_commune=$elements[1];
1054
    	
1026
      $code_commune=$elements[2];
1055
    	$champs_etendus_obs = array();
1027
      $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
1056
    	foreach($champs_etendus as $champ_etendu_a_obs) {
1028
      $select, self::quoteNonNull($nom_commune), self::quoteNonNull($code_commune.'%'));
-
 
1029
      }
1057
    		$id_obs = $ordre_ids[$champ_etendu_a_obs['ordre']]; // id réel de l'observation correspondant à l'ordre
1030
      elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
-
 
1031
      // Code insee seul  
1058
    		foreach($champ_etendu_a_obs['champs_etendus'] as $label => $champ) {
1032
      $code_insee_commune=$elements[1];
-
 
1033
      $requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
-
 
1034
      }
1059
				// XXX: insère t'on des valeurs vides ?
1035
      else {
-
 
1036
      // Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
1060
    			$valeur = $champ;    			
1037
      // on prend le risque ici de retourner une mauvaise Commune
-
 
1038
      $nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
-
 
1039
      $requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
-
 
1040
      }
1061
    			$cle = self::$gestion_champs_etendus->transformerLabelEnCle($label);
1041
	
-
 
1042
      $resultat_commune = Cel::db()->requeter($requete);
1062
    			
1043
      // TODO: levenstein sort ?
-
 
1044
 
1063
    			if (!empty($cle) && !empty($valeur)) {
1045
      // cas de la commune introuvable dans le référentiel
1064
    				$champ_etendu_a_inserer = new ChampEtendu();
1046
      // réinitialisation aux valeurs du fichier XLS
-
 
1047
      if(! $resultat_commune) {
1065
    				$champ_etendu_a_inserer->id = $id_obs;
1048
      $localisation[C_ZONE_GEO] = trim($ligne[C_ZONE_GEO]);
1066
    				$champ_etendu_a_inserer->cle = $cle;
1049
      $localisation[C_CE_ZONE_GEO] = trim($ligne[C_CE_ZONE_GEO]);
-
 
1050
      } else {
1067
    				$champ_etendu_a_inserer->label = empty($label) ? $cle : $label;
1051
      $localisation[C_ZONE_GEO] = $resultat_commune[0]['nom'];
-
 
1052
      $localisation[C_CE_ZONE_GEO] = $resultat_commune[0]['code'];
-
 
1053
      }
1068
    				$champ_etendu_a_inserer->valeur = $valeur;
1054
 
1069
    			
1055
      $departement = &$localisation[C_CE_ZONE_GEO];
1070
    				$champs_etendus_obs[] = $champ_etendu_a_inserer;
1056
 
1071
    			}
1057
      testdepartement:
-
 
1058
      if(strpos($departement, "INSEE-C:", 0) === 0) goto protectloc;
1072
    		}
1059
 
-
 
1060
      if(!is_numeric($departement)) goto protectloc; // TODO ?
-
 
1061
      if(strlen($departement) == 4) $departement = "INSEE-C:0" . $departement;
-
 
1062
      if(strlen($departement) == 5) $departement = "INSEE-C:" . $departement;
-
 
1063
      // if(strlen($departement) <= 9) return "INSEE-C:0" . $departement; // ? ... TODO
1073
    	}
1064
 
1074
    	
1065
      $departement = trim($departement); // TODO
-
 
1066
 
-
 
1067
      protectloc:
1075
    	$insertion = self::$gestion_champs_etendus->ajouterParLots($champs_etendus_obs);
1068
      $localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
1076
    	//TODO: que faire si l'insertion des champs étendus échoue ?
1069
      $localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
1077
    	return count($champs_etendus_obs);	 
1070
      }
-
 
1071
    */
-
 
Line 1072... Line 1078...
1072
 
1078
    }
Line 1073... Line 1079...
1073
 
1079
 
1074
    /* HELPERS */
1080
    /* HELPERS */