Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2459 → Rev 2461

/trunk/jrest/services/ImportXLS.php
30,11 → 30,9
error_reporting(-1);
ini_set('html_errors', 0);
ini_set('xdebug.cli_color', 2);
date_default_timezone_set('Europe/Paris');
require_once 'lib/PHPExcel/Classes/PHPExcel.php';
require_once 'FormateurGroupeColonne.php';
 
date_default_timezone_set('Europe/Paris');
 
// nombre d'INSERT à cumuler par requête SQL
// (= nombre de lignes XLS à bufferiser)
//define('NB_LIRE_LIGNE_SIMUL', 30);
82,37 → 80,37
static function __anonyme_4(&$item, $key) { $item = self::quoteNonNull(trim($item)); }
 
static $ordre_BDD = Array(
"ce_utilisateur",
"prenom_utilisateur",
"nom_utilisateur",
"courriel_utilisateur",
"ordre",
"nom_sel",
"nom_sel_nn",
"nom_ret",
"nom_ret_nn",
"nt",
"famille",
"nom_referentiel",
"zone_geo",
"ce_zone_geo",
"date_observation",
"lieudit",
"station",
"milieu",
"mots_cles_texte",
"commentaire",
"transmission",
"date_creation",
"date_modification",
"date_transmission",
"latitude",
"longitude",
"altitude",
"abondance",
"certitude",
"phenologie",
"code_insee_calcule"
'ce_utilisateur',
'prenom_utilisateur',
'nom_utilisateur',
'courriel_utilisateur',
'ordre',
'nom_sel',
'nom_sel_nn',
'nom_ret',
'nom_ret_nn',
'nt',
'famille',
'nom_referentiel',
'zone_geo',
'ce_zone_geo',
'date_observation',
'lieudit',
'station',
'milieu',
'mots_cles_texte',
'commentaire',
'transmission',
'date_creation',
'date_modification',
'date_transmission',
'latitude',
'longitude',
'altitude',
'abondance',
'certitude',
'phenologie',
'code_insee_calcule'
);
 
// cf: initialiser_pdo_ordered_statements()
141,16 → 139,16
initialiser_colonnes_statiques() y merge les données d'identification utilisateur
*/
public $colonnes_statiques = array(
"ce_utilisateur" => NULL,
"prenom_utilisateur" => NULL,
"nom_utilisateur" => NULL,
"courriel_utilisateur" => NULL,
'ce_utilisateur' => NULL,
'prenom_utilisateur' => NULL,
'nom_utilisateur' => NULL,
'courriel_utilisateur' => NULL,
 
// fixes (fonction SQL)
// XXX future: mais pourraient varier dans le futur si la mise-à-jour
// d'observation est implémentée
"date_creation" => "now()",
"date_modification" => "now()",
'date_creation' => 'now()',
'date_modification' => 'now()',
);
 
public static $prefixe_colonnes_etendues = 'ext:';
165,11 → 163,7
// cache (pour traiterLocalisation() pour l'instant)
static $cache = Array('geo' => array());
 
function ImportXLS($config) {
parent::__construct($config);
}
 
function createElement($pairs) {
public function createElement($pairs) {
if (!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
exit('0');
}
507,25 → 501,33
}
 
static function stockerImages($enregistrements, $toutes_images, $ordre_ids) {
$idsImagesObs = array();
$valuesSql = array();
foreach ($toutes_images as $images_pour_obs) {
$obs = $enregistrements[$images_pour_obs['obs_pos']];
$id_obs = $ordre_ids[$obs['ordre']]; // id réel de l'observation correspondant à l'ordre
$transmission = $obs['transmission'];
$date_transmission = $obs['date_transmission'];
foreach ($images_pour_obs['images'] as $image) {
$idsImagesObs[] = sprintf('(%d,%d, NOW())', $image['id_image'], $id_obs);
$id_img = $image['id_image'];
$valuesSql[] = "($id_img, $id_obs, NOW(), $transmission, $date_transmission)";
}
}
 
if ($idsImagesObs) {
$clauseValues = implode(', ', $idsImagesObs);
// Utilisation de INSET pour faire des UPDATE multiples en une seule requête
$requete = 'INSERT INTO cel_images (id_image, ce_observation, date_liaison) '.
if ($valuesSql) {
$clauseValues = implode(', ', $valuesSql);
// Utilisation de INSERT pour faire des UPDATE multiples en une seule requête
$requete = 'INSERT INTO cel_images '.
'(id_image, ce_observation, date_liaison, transmission, date_transmission) '.
"VALUES $clauseValues ".
'ON DUPLICATE KEY UPDATE ce_observation = VALUES(ce_observation), date_liaison = NOW() '.
'ON DUPLICATE KEY UPDATE '.
'ce_observation = VALUES(ce_observation), '.
'date_liaison = NOW(), '.
'transmission = VALUES(transmission), '.
'date_transmission = VALUES(date_transmission) '.
' -- '.__FILE__.':'.__LINE__;
Cel::db()->requeter($requete);
Cel::db()->executer($requete);
}
return count($idsImagesObs);
return count($valuesSql);
}
 
/*
571,7 → 573,7
 
// Dans ce tableau, seules devraient apparaître les données variable pour chaque ligne.
// Dans ce tableau, l'ordre des clefs n'importe pas (cf: self::sortArrayByArray())
$enregistrement = Array(
$enregistrement = array(
"ordre" => $dernier_ordre,
 
"nom_sel" => $espece[C_NOM_SEL],
587,23 → 589,23
"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
 
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
"date_observation" => isset($ligne[C_DATE_OBSERVATION]) ? self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ref_ligne) : NULL,
"date_observation" => isset($ligne[C_DATE_OBSERVATION]) ? self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ref_ligne) : null,
 
"lieudit" => isset($ligne[C_LIEUDIT]) ? trim($ligne[C_LIEUDIT]) : NULL,
"station" => isset($ligne[C_STATION]) ? trim($ligne[C_STATION]) : NULL,
"milieu" => isset($ligne[C_MILIEU]) ? trim($ligne[C_MILIEU]) : NULL,
"lieudit" => isset($ligne[C_LIEUDIT]) ? trim($ligne[C_LIEUDIT]) : null,
"station" => isset($ligne[C_STATION]) ? trim($ligne[C_STATION]) : null,
"milieu" => isset($ligne[C_MILIEU]) ? trim($ligne[C_MILIEU]) : null,
 
"mots_cles_texte" => NULL, // TODO: foreign-key
// XXX: @ contre "Undefined index"
"commentaire" => isset($ligne[C_COMMENTAIRE]) ? trim($ligne[C_COMMENTAIRE]) : NULL,
"commentaire" => isset($ligne[C_COMMENTAIRE]) ? trim($ligne[C_COMMENTAIRE]) : null,
 
"transmission" => $transmission,
"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
"date_transmission" => $transmission ? date('Y-m-d H:i:s') : null, // pas de fonction SQL dans un PDO statement, <=> now()
 
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ref_ligne) : NULL,
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ref_ligne) : NULL,
"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : NULL, // TODO: guess alt from lon/lat
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(null, $ligne[C_LATITUDE], $referentiel, $ref_ligne) : null,
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], null, $referentiel, $ref_ligne) : null,
"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : null, // TODO: guess alt from lon/lat
 
// @ car potentiellement optionnelles ou toutes vides => pas d'index dans PHPExcel (tableau optimisé)
"abondance" => @$ligne[C_ABONDANCE],
1079,7 → 1081,7
);
}
 
// équivalent à Bdd2->proteger() (qui wrap PDO::quote),
// équivalent à Bdd->proteger() (qui wrap PDO::quote),
// sans transformer NULL en ""
static function quoteNonNull($chaine) {
if (is_null($chaine)) {