2
0
forked from Wavyzz/dolibarr

Work on import module

This commit is contained in:
Laurent Destailleur
2009-10-13 17:23:26 +00:00
parent 4a11a0e335
commit 50553633e7
5 changed files with 228 additions and 70 deletions

View File

@@ -506,6 +506,8 @@ if ($step == 3 && $datatoimport)
print '<td>';
$text=$objmodelimport->getDriverDesc($format);
print $html->textwithpicto($objmodelimport->getDriverLabel($format),$text);
print '</td><td align="right" nowrap="nowrap" width="100"><a href="'.DOL_URL_ROOT.'/imports/emptyexample.php?format='.$key.'&datatoimport='.$datatoimport.'" target="_blank">'.$langs->trans("DownloadEmptyExample").'</a>';
print '</td></tr>';
print '</table>';
@@ -559,7 +561,14 @@ if ($step == 3 && $datatoimport)
$var=!$var;
print '<tr '.$bc[$var].'>';
print '<td width="16">'.img_mime($file).'</td>';
print '<td>'.$file.'</td>';
print '<td>';
$param='format='.$format.'&datatoimport='.$datatoimport;
$modulepart='import';
//$relativepath=$filetoimport;
print '<a href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&amp;file='.urlencode($relativepath).'&amp;step=3&amp;format='.$format.'&amp;datatoimport='.$datatoimport.'" target="_blank">';
print $file;
print '</a>';
print '</td>';
// Affiche taille fichier
print '<td align="right">'.dol_print_size(dol_filesize($newdir.'/'.$newfile)).'</td>';
// Affiche date fichier
@@ -610,7 +619,7 @@ if ($step == 4 && $datatoimport)
$i=1;
foreach($arrayrecord as $key => $val)
{
$fieldssource[$i]['example1']=dol_trunc($val,24);
$fieldssource[$i]['example1']=dol_trunc($val['val'],24);
$i++;
}
$obj->import_close_file();
@@ -717,14 +726,21 @@ if ($step == 4 && $datatoimport)
// File to import
print '<tr><td width="25%">'.$langs->trans("FileToImport").'</td>';
print '<td>'.$filetoimport.'</td></tr>';
print '<td>';
$param='format='.$format.'&datatoimport='.$datatoimport;
$modulepart='import';
//$relativepath=$filetoimport;
print '<a href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&amp;file='.urlencode($relativepath).'&amp;step=4&amp;format='.$format.'&amp;datatoimport='.$datatoimport.'" target="_blank">';
print $filetoimport;
print '</a>';
print '</td></tr>';
print '</table>';
print '<br>'."\n";
// List of import models
print '<!-- List of import models -->'."\n";
// List of source fields
print '<!-- List of source fields -->'."\n";
print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">';
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
print '<input type="hidden" name="action" value="select_model">';
@@ -1047,7 +1063,7 @@ if ($step == 5 && $datatoimport)
$i=1;
foreach($arrayrecord as $key => $val)
{
$fieldssource[$i]['example1']=dol_trunc($val,24);
$fieldssource[$i]['example1']=dol_trunc($val['val'],24);
$i++;
}
$obj->import_close_file();
@@ -1092,7 +1108,7 @@ if ($step == 5 && $datatoimport)
print '</td></tr>';
// Lot de donnees a importer
print '<tr><td width="25%">'.$langs->trans("DatasetToImport").'</td>';
print '<tr><td>'.$langs->trans("DatasetToImport").'</td>';
print '<td>';
print img_object($objimport->array_import_module[0]->getName(),$objimport->array_import_icon[0]).' ';
print $objimport->array_import_label[0];
@@ -1104,7 +1120,7 @@ if ($step == 5 && $datatoimport)
//print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnSourceFile").'</b></td></tr>';
// Source file format
print '<tr><td width="40%">'.$langs->trans("SourceFileFormat").'</td>';
print '<tr><td width="25%">'.$langs->trans("SourceFileFormat").'</td>';
print '<td>';
$text=$objmodelimport->getDriverDesc($format);
print $html->textwithpicto($objmodelimport->getDriverLabel($format),$text);
@@ -1112,7 +1128,13 @@ if ($step == 5 && $datatoimport)
// File to import
print '<tr><td>'.$langs->trans("FileToImport").'</td>';
print '<td>'.$filetoimport.'</td></tr>';
print '<td>';
$modulepart='import';
//$relativepath=$filetoimport;
print '<a href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&step=4'.$param.'" target="_blank">';
print $filetoimport;
print '</a>';
print '</td></tr>';
// Nb of fields
print '<tr><td>';
@@ -1135,10 +1157,11 @@ if ($step == 5 && $datatoimport)
//print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnTargetTables").'</b></td></tr>';
// Tables imported
print '<tr><td width="40%">';
print '<tr><td width="25%">';
print $langs->trans("TablesTarget");
print '</td><td>';
$listtables=array();
$sort_array_match_file_to_database=$array_match_file_to_database;
foreach($array_match_file_to_database as $code=>$label)
{
//var_dump($fieldssource);
@@ -1150,6 +1173,7 @@ if ($step == 5 && $datatoimport)
if (sizeof($listtables))
{
$newval='';
//ksort($listtables);
foreach ($listtables as $val)
{
if ($newval) print ', ';
@@ -1177,8 +1201,10 @@ if ($step == 5 && $datatoimport)
$listfields=array();
$i=0;
//print 'fieldsource='.$fieldssource;
//var_dump($array_match_file_to_database);
foreach($array_match_file_to_database as $code=>$label)
$sort_array_match_file_to_database=$array_match_file_to_database;
ksort($sort_array_match_file_to_database);
//var_dump($sort_array_match_file_to_database);
foreach($sort_array_match_file_to_database as $code=>$label)
{
$i++;
//var_dump($fieldssource);
@@ -1202,7 +1228,7 @@ if ($step == 5 && $datatoimport)
print '<center>';
if ($user->rights->import->run)
{
print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=6&'.$param.'">'.$langs->trans("RunSimulateImportFile").'</a>';
print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=6'.$param.'">'.$langs->trans("RunSimulateImportFile").'</a>';
}
else
{
@@ -1243,7 +1269,7 @@ if ($step == 6 && $datatoimport)
$i=1;
foreach($arrayrecord as $key => $val)
{
$fieldssource[$i]['example1']=dol_trunc($val,24);
$fieldssource[$i]['example1']=dol_trunc($val['val'],24);
$i++;
}
$obj->import_close_file();
@@ -1312,7 +1338,13 @@ if ($step == 6 && $datatoimport)
// File to import
print '<tr><td>'.$langs->trans("FileToImport").'</td>';
print '<td>'.$filetoimport.'</td></tr>';
print '<td>';
$modulepart='import';
//$relativepath=$filetoimport;
print '<a href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&step=4'.$param.'" target="_blank">';
print $filetoimport;
print '</a>';
print '</td></tr>';
// Nb of fields
print '<tr><td>';
@@ -1376,7 +1408,10 @@ if ($step == 6 && $datatoimport)
print $langs->trans("FieldsTarget").'</td><td>';
$listfields=array();
$i=0;
foreach($array_match_file_to_database as $code=>$label)
$sort_array_match_file_to_database=$array_match_file_to_database;
ksort($sort_array_match_file_to_database);
//var_dump($sort_array_match_file_to_database);
foreach($sort_array_match_file_to_database as $code=>$label)
{
$i++;
//var_dump($fieldssource);
@@ -1393,33 +1428,59 @@ if ($step == 6 && $datatoimport)
print '<br>';
// Launch import
$arrayofresult=array();
$arrayoferrors=array();
$arrayofwarnings=array();
$maxnboferrors=empty($conf->global->IMPORT_MAX_NB_OF_ERRORS)?100:$conf->global->IMPORT_MAX_NB_OF_ERRORS;
$maxnbofwarnings=empty($conf->global->IMPORT_MAX_NB_OF_WARNINGS)?100:$conf->global->IMPORT_MAX_NB_OF_WARNINGS;
$nboferrors=0;
$nbofwarnings=0;
$db->begin();
//var_dump($array_match_file_to_database);
// Open input file
$result=$obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport,$langs);
$pathfile=$conf->import->dir_temp.'/'.$filetoimport;
$result=$obj->import_open_file($pathfile,$langs);
if ($result > 0)
{
$i=1;
$sourcelinenb=0;
// Loop on each input file record
while ($arrayrecord=$obj->import_read_record())
{
$i++;
$result=$obj->import_insert($arrayrecord,$array_match_file_to_database,$objimport);
$arrayofresult[$result]++;
$sourcelinenb++;
$result=$obj->import_insert($arrayrecord,$array_match_file_to_database,$objimport,sizeof($fieldssource));
if (sizeof($obj->errors))
{
$arrayoferrors[$sourcelinenb]=$obj->errors;
}
if (sizeof($obj->warnings))
{
$arrayofwarnings[$sourcelinenb]=$obj->warnings;
}
}
// Close file
$obj->import_close_file();
}
else
{
print $langs->trans("ErrorFailedToOpenFile",$pathfile);
}
$db->rollback(); // We force rollback because this was just a simulation.
var_dump($arrayoferrors);
// Print result $arrayoferrors
foreach ($arrayoferrors as $key => $val)
{
//print $langs->trans("Result".$key)." ".$arrayofresult[$key].'<br>';
}
// Print $arrayofresult
// TODO
$importid=dol_print_date(dol_now('tzserver'),'%Y%m%d%H%M%S');
print '<br>';
print $langs->trans("NowClickToRunTheImport",$langs->transnoentitiesnoconv("RunImportFile")).'<br>';
print $langs->trans("DataLoadedWithId",$importid).'<br>';
print '</div>';
@@ -1460,7 +1521,7 @@ function show_elem($fieldssource,$i,$pos,$key,$var,$nostyle='')
print '<div style="padding: 0px 0px 0px 0px;" id="boxto_'.$pos.'">'."\n";
print '<table summary="boxtable'.$pos.'" width="100%" class="nobordernopadding">'."\n";
if ($pos && $pos > sizeof($fieldssource)) // NoFields
if ($pos && $pos > sizeof($fieldssource)) // No fields
{
print '<tr '.($nostyle?'':$bc[$var]).' height="20">';
print '<td class="nocellnopadding" width="16" style="font-weight: normal">';
@@ -1471,7 +1532,7 @@ function show_elem($fieldssource,$i,$pos,$key,$var,$nostyle='')
print '</td>';
print '</tr>';
}
elseif ($key == 'none')
elseif ($key == 'none') // Empty line
{
print '<tr '.($nostyle?'':$bc[$var]).' height="20">';
print '<td class="nocellnopadding" width="16" style="font-weight: normal">';
@@ -1492,7 +1553,7 @@ function show_elem($fieldssource,$i,$pos,$key,$var,$nostyle='')
print '</td>';
print '<td style="font-weight: normal">';
print $langs->trans("Field").' '.$pos;
if (! empty($fieldssource[$pos]['example1'])) print ' (<i>'.$fieldssource[$pos]['example1'].'</i>)';
if (! empty($fieldssource[$pos]['example1'])) print ' (<i>'.htmlentities($fieldssource[$pos]['example1']).'</i>)';
print '</td>';
print '</tr>';
}

View File

@@ -35,6 +35,9 @@ require_once(DOL_DOCUMENT_ROOT ."/includes/modules/import/modules_import.php");
class ImportCsv extends ModeleImports
{
var $id;
var $error;
var $errors=array();
var $label;
var $extension;
var $version;
@@ -192,6 +195,7 @@ class ImportCsv extends ModeleImports
/**
* \brief Return array of next record in input file.
* \return Array Array of field values. Data are UTF8 encoded.
* [0]=>(['val']=>val,['type']=>-1=null,0=blank,1=string)
*/
function import_read_record()
{
@@ -216,13 +220,29 @@ class ImportCsv extends ModeleImports
{
if (! empty($conf->global->IMPORT_CSV_FORCE_CHARSET)) // Forced charset
{
if (strtolower($conf->global->IMPORT_CSV_FORCE_CHARSET) == 'utf8') $newarrayres[$key]=$val;
else $newarrayres[$key]=utf8_encode($val);
if (strtolower($conf->global->IMPORT_CSV_FORCE_CHARSET) == 'utf8')
{
$newarrayres[$key]['val']=$val;
$newarrayres[$key]['type']=1;
}
else
{
$newarrayres[$key]['val']=utf8_encode($val);
$newarrayres[$key]['type']=1;
}
}
else // Autodetect format (UTF8 or ISO)
{
if (utf8_check($val)) $newarrayres[$key]=$val;
else $newarrayres[$key]=utf8_encode($val);
if (utf8_check($val))
{
$newarrayres[$key]['val']=$val;
$newarrayres[$key]['type']=1;
}
else
{
$newarrayres[$key]['val']=utf8_encode($val);
$newarrayres[$key]['type']=1;
}
}
}
@@ -247,12 +267,35 @@ class ImportCsv extends ModeleImports
* @param arrayrecord Array of field values
* @param array_match_file_to_database
* @param objimport
* @param maxfields Max number of fiels to use
* @return int <0 if KO, >0 if OK
*/
function import_insert($arrayrecord,$array_match_file_to_database,$objimport)
function import_insert($arrayrecord,$array_match_file_to_database,$objimport,$maxfields)
{
$error=0;
$warning=0;
$this->errors=array();
$this->warnings=array();
dol_syslog("import_csv.modules maxfields=".$maxfields);
//print "X".$maxfields;
var_dump($array_match_file_to_database);
var_dump($arrayrecord);
$sort_array_match_file_to_database=$array_match_file_to_database;
ksort($sort_array_match_file_to_database);
//var_dump($sort_array_match_file_to_database);
if (sizeof($arrayrecord) == 0 ||
(sizeof($arrayrecord) == 1 && empty($arrayrecord[0]['val'])))
{
print 'W';
$this->warnings[$warning]['lib']='Empty line';
$this->warnings[$warning]['type']='EMPTY';
$warning++;
}
else
{
// For each table to insert, me make a separate insert
foreach($objimport->array_import_tables[0] as $alias=>$tablename)
{
@@ -260,20 +303,57 @@ class ImportCsv extends ModeleImports
$sql='';
$listfields='';
$listvalues='';
foreach($array_match_file_to_database as $key => $val)
$i=0;
$errorforthistable=0;
foreach($sort_array_match_file_to_database as $key => $val)
{
if ($key <= $maxfields)
{
if ($listfields) { $listfields.=', '; $listvalues.=', '; }
$listfields.=$val;
$listvalues.='ee';
$newval='';
if ($arrayrecord[($key-1)]['type'] < 0)
{
$listvalues.="null";
}
else if ($arrayrecord[($key-1)]['type'] == 0)
{
$listvalues.="''";
}
else if ($arrayrecord[($key-1)]['type'] > 0)
{
$newval=$arrayrecord[($key-1)]['val'];
$listvalues.="'".$arrayrecord[($key-1)]['val']."'";
}
// Make some tests
// Required field is ok
if (eregi('\*',$objimport->array_import_fields[0][$val]) && empty($newval))
{
$this->errors[$error]['lib']='ErrorMissingMandatoryValue field nb '.$key.' target='.$val;
$this->errors[$error]['type']='NOTNULL';
$errorforthistable++;
$error++;
}
// Test format
// Other tests
// ...
}
$i++;
}
if (! $errorforthistable)
{
if ($listfields)
{
$sql='INSERT INTO '.$tablename.'('.$listfields.') VALUES('.$listvalues.')';
}
dol_syslog("import_csv.modules sql=".$sql);
//print '> '.join(',',$arrayrecord);
print 'sql='.$sql;
print '<br>'."\n";
//print 'sql='.$sql;
//print '<br>'."\n";
// Run insert request
if ($sql)
@@ -286,13 +366,21 @@ class ImportCsv extends ModeleImports
else
{
print 'E';
$this->error=$this->db->lasterror();
$this->errors[$error]['lib']='ErrorSQL '.$this->db->lasterror();
$this->errors[$error]['type']='SQL';
$error++;
}
}
}
else
{
dol_print_error('Ne doit pas arriver AAA');
}
}
}
}
return $error?-$error:1;
return 1;
}
}

View File

@@ -9,7 +9,7 @@ ImportableDatas=Importable dataset
SelectExportDataSet=Choose dataset you want to export...
SelectImportDataSet=Choose dataset you want to import...
SelectExportFields=Choose fields you want to export, or select a predefined export profil
SelectImportFields=Choose source file fields you want to import and their target field in database by moving them up and down with anchor %s,<br>or select a predefined import profil:
SelectImportFields=Choose source file fields you want to import and their target field in database by moving them up and down with anchor %s, or select a predefined import profil:
NotImportedFields=Fields of source file not imported
SaveExportModel=Save this export profile if you plan to reuse it later...
SaveImportModel=Save this import profile if you plan to reuse it later...
@@ -82,3 +82,7 @@ SomeMandatoryFieldHaveNoSource=Some mandatory fields have no source from data fi
InformationOnSourceFile=Informations on source file
InformationOnTargetTables=Informations on target fields
SelectAtLeastOneField=Switch at least one source field in the column of fields to export
SelectFormat=Choose this import file format
RunImportFile=Launch import file
NowClickToRunTheImport=Check result of import simulation. If everything is ok, launch the definitive import.
DataLoadedWithId=All data will be loaded with the following import id: <b>%s<b>

View File

@@ -82,3 +82,7 @@ SomeMandatoryFieldHaveNoSource=Certains champs obligatoires n'ont pas de champ s
InformationOnSourceFile=Informations sur le fichier source
InformationOnTargetTables=Informations sur les champs cibles
SelectAtLeastOneField=Basculer au moins un champ source dans la colonne des champs à exporter
SelectFormat=Choisir ce format de fichier import
RunImportFile=Lancer l'import en base
NowClickToRunTheImport=Vérifiez le résultat de la simulation. Si tout est ok, lancer l'import définitif en base.
DataLoadedWithId=Toutes les données seront importées avec l'id d'import suivant: <b>%s</b>

View File

@@ -2641,8 +2641,9 @@ function dol_nl2br($stringtoencode,$nl2brmode=0)
}
/**
* \brief This function is called to encode a string into a HTML string.
* All entities except &,<,> are converted. This permits to encode special chars to entities with no double encoded for already encoded HTML strings.
* \brief This function is called to encode a string into a HTML string but differs from htmlentities because
* all entities but &,<,> are converted. This permits to encode special chars to entities with no double
* encoding for already encoded HTML strings.
* This function also remove last CR/BR.
* \param stringtoencode String to encode
* \param nl2brmode 0=Adding br before \n, 1=Replacing \n by br (for use with FPDF writeHTMLCell function for example)