Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1676 → Rev 1677

/trunk/jrest/services/ImportXLS.php
68,11 → 68,11
function __anonyme_1($v) { return !$v['importable']; }
function __anonyme_2(&$v) { $v = $v['nom']; }
function __anonyme_3($cell) { return !is_null($cell); };
function __anonyme_4($item, $key, $obj) { $item = $obj->quoteNonNull(trim($item)); }
function __anonyme_5($item) { return is_null($item) ? '?' : $item; }
function __anonyme_6() { return NULL; }
 
class ImportXLS extends Cel {
static function __anonyme_4($item, $key, $obj) { $item = $obj->quoteNonNull(trim($item)); }
 
static $ordre_BDD = Array(
"ce_utilisateur",
224,6 → 224,9
 
$obs_ajouts = 0;
$obs_maj = 0;
$nb_images_ajoutees = 0;
$nb_mots_cle_ajoutes = 0;
 
$dernier_ordre = $this->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
$dernier_ordre = intval($dernier_ordre[0]['ordre']) + 1;
if(! $dernier_ordre) $dernier_ordre = 0;
246,9 → 249,9
// ici on appel la fonction qui fera effectivement l'insertion multiple
// à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
 
// TODO: passer $this, ne sert que pour appeler des méthodes public qui pourraient être statiques
// TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques
// notamment dans RechercheInfosTaxonBeta.php
list($enregistrements, $images) =
list($enregistrements, $images, $mots_cle) =
self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
if(! $enregistrements) break;
 
270,7 → 273,7
$donnees = array();
foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
 
/* debug ici: echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die;*/
/* debug ici: */ echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die;
 
$stmt->execute($donnees);
 
283,7 → 286,8
$obs_ajouts += count($enregistrements);
// $obs_ajouts += count($enregistrements['insert']);
// $obs_maj += count($enregistrements['update']);
$nb_images_ajoutees = self::stockerImages($this, $enregistrements, $images, $dernier_autoinc);
$nb_images_ajoutees += self::stockerImages($this, $enregistrements, $images, $dernier_autoinc);
$nb_mots_cle_ajoutes += self::stockerMotsCle($this, $enregistrements, $mots_cle, $dernier_autoinc);
}
 
restore_error_handler();
298,7 → 302,7
 
static function detectionEntete($entete) {
$colonnes_reconnues = Array();
$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard');
$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard'); // ,avance
foreach($entete as $k => $v) {
$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
foreach($cols as $col) {
353,25 → 357,38
if( ($enregistrement = self::chargerLigne($ligne, $dernier_ordre, $cel)) ) {
// $enregistrements[] = array_merge($colonnes_statiques, $enregistrement);
$enregistrements[] = $enregistrement;
$pos = count($enregistrements) - 1;
$last = &$enregistrements[$pos];
 
if(isset($enregistrement['_images'])) {
$pos = count($enregistrements) - 1;
$last = &$enregistrements[$pos];
// ne dépend pas de cel_obs, et seront insérées *après* les enregistrements
// mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
$toutes_images[] = Array("images" => $last['_images'],
"obs_pos" => $pos);
// ce champ n'a pas a faire partie de l'insertion dans cel_obs,
// ce champ n'a pas à faire partie de l'insertion dans cel_obs,
// mais est utile pour cel_obs_images
unset($last['_images']);
}
 
if(isset($enregistrement['_mots_cle'])) {
// ne dépend pas de cel_obs, et seront insérés *après* les enregistrements
// mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
$tous_mots_cle[] = Array("mots_cle" => $last['_mots_cle'],
"obs_pos" => $pos);
// la version inlinée des mots est enregistrées dans cel_obs
// mais cel_mots_cles_obs fait foi.
// XXX: postponer l'ajout de ces informations dans cel_obs *après* l'insertion effective
// des records dans cel_mots_cles_obs ?
$last[C_MOTS_CLES_TEXTE] = $last['_mots_cle']['inline_cel_obs'];
unset($last['_mots_cle']);
}
 
$dernier_ordre++;
}
}
 
// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
return Array($enregistrements, $toutes_images);
return Array($enregistrements, $toutes_images, $tous_mots_cle);
}
 
 
384,6 → 401,10
}
 
 
static function stockerMotsCle($cel, $enregistrements, $tous_mots_cle, $lastid) {
return count($tous_mots_cle);
}
 
static function stockerImages($cel, $enregistrements, $toutes_images, $lastid) {
$images_insert = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES %s ON DUPLICATE KEY UPDATE id_image = id_image';
$images_obs_assoc = Array();
482,6 → 503,8
// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel, $enregistrement);
 
if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel, $enregistrement);
 
return $enregistrement;
}
 
488,9 → 511,8
static function traiterImage($str, $cel, &$enregistrement) {
$liste_images = array_filter(explode("/", $str));
 
array_walk($liste_images,
'__anonyme_4',
$cel);
//array_walk($liste_images, '__anonyme_4', $cel);
array_walk($liste_images, array(__CLASS__, '__anonyme_4'), $cel);
$requete = sprintf(
"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
$cel->id_utilisateur,
501,7 → 523,28
if($resultat) $enregistrement['_images'] = $resultat;
}
 
static function traiterMotsCle($str, $cel, &$enregistrement) {
$liste_mots_cle = array_filter(explode(",", $str));
array_walk($liste_mots_cle, array(__CLASS__, '__anonyme_4'), $cel);
// TODO!!!! remplace > (pour les tests uniquement) par un = et supprimer le group by mot_cle
$requete = sprintf("SELECT id_mot_cle_obs, mot_cle FROM cel_mots_cles_obs WHERE id_utilisateur > %d ".
"AND mot_cle IN (\"%s\") ".
"GROUP BY mot_cle",
$cel->id_utilisateur,
implode('","', $liste_mots_cle));
 
$resultat_sql = $cel->requeter($requete);
if(!$resultat_sql) return;
 
$resultat = array();
foreach($resultat_sql as $v) $resultat[$v['id_mot_cle_obs']] = $v['mot_cle'];
 
$enregistrement['_mots_cle'] = array("inline_cel_obs" => implode(',', $liste_mots_cle),
"existing" => $resultat,
"to_insert" => $liste_mots_cle);
}
 
 
/* FONCTIONS de TRANSFORMATION de VALEUR DE CELLULE */
 
// TODO: PHP 5.3, utiliser date_parse_from_format()