From d9ecd2347a3508c6afb6936b96c43e9990a1cb0b Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@users.sourceforge.net>
Date: Sat, 3 Oct 2009 12:08:48 +0000
Subject: [PATCH] Work on import module

---
 htdocs/exports/export.class.php               | 55 +++++++++------
 htdocs/exports/export.php                     | 70 +++++++++++++++----
 htdocs/imports/import.php                     |  2 +-
 .../modules/export/export_csv.modules.php     |  2 +-
 .../modules/export/export_excel.modules.php   | 23 +++---
 .../modules/export/export_tsv.modules.php     |  2 +-
 .../modules/import/import_csv.modules.php     |  2 +-
 htdocs/langs/en_US/exports.lang               |  3 +-
 htdocs/langs/fr_FR/exports.lang               |  3 +-
 9 files changed, 112 insertions(+), 50 deletions(-)

diff --git a/htdocs/exports/export.class.php b/htdocs/exports/export.class.php
index 7623bd2eceb..7388c2d3a6c 100644
--- a/htdocs/exports/export.class.php
+++ b/htdocs/exports/export.class.php
@@ -171,31 +171,16 @@ class Export
 		}
 	}
 
+
 	/**
-	 *      \brief      Lance la generation du fichier
-	 *      \param      user                User qui exporte
-	 *      \param      model               Modele d'export
-	 *      \param      datatoexport        Lot de donnee a exporter
-	 *      \param      array_selected      Tableau des champs a exporter
+	 *      \brief      Build the sql export request
+	 *      \param      indice				Indice of export
+	 *      \param      array_selected      Filter on array of fields to export
 	 *      \remarks    Les tableaux array_export_xxx sont deja chargees pour le bon datatoexport
 	 *                  aussi le parametre datatoexport est inutilise
 	 */
-	function build_file($user, $model, $datatoexport, $array_selected)
+	function build_sql($indice,$array_selected)
 	{
-		global $conf,$langs;
-
-		$indice=0;
-		asort($array_selected);
-
-		dol_syslog("Export::build_file $model, $datatoexport, $array_selected");
-
-		// Creation de la classe d'export du model ExportXXX
-		$dir = DOL_DOCUMENT_ROOT . "/includes/modules/export/";
-		$file = "export_".$model.".modules.php";
-		$classname = "Export".$model;
-		require_once($dir.$file);
-		$objmodel = new $classname($db);
-
 		// Build the sql request
 		$sql=$this->array_export_sql_start[$indice];
 		$i=0;
@@ -212,6 +197,36 @@ class Export
 		}
 		$sql.=$this->array_export_sql_end[$indice];
 
+		return $sql;
+	}
+
+	/**
+	 *      \brief      Build export file
+	 *      \param      user                User that export
+	 *      \param      model               Export format
+	 *      \param      datatoexport        Name of dataset to export
+	 *      \param      array_selected      Filter on array of fields to export
+	 *      \remarks    Les tableaux array_export_xxx sont deja chargees pour le bon datatoexport
+	 *                  aussi le parametre datatoexport est inutilise
+	 */
+	function build_file($user, $model, $datatoexport, $array_selected)
+	{
+		global $conf,$langs;
+
+		$indice=0;
+		asort($array_selected);
+
+		dol_syslog("Export::build_file $model, $datatoexport, $array_selected");
+
+		// Creation de la classe d'export du model ExportXXX
+		$dir = DOL_DOCUMENT_ROOT . "/includes/modules/export/";
+		$file = "export_".$model.".modules.php";
+		$classname = "Export".$model;
+		require_once($dir.$file);
+		$objmodel = new $classname($db);
+
+		$sql=$this->build_sql($indice,$array_selected);
+
 		// Run the sql
 		$this->sqlusedforexport=$sql;
 		dol_syslog("Export::build_file sql=".$sql);
diff --git a/htdocs/exports/export.php b/htdocs/exports/export.php
index 9812d4640a8..bd3281d1f8d 100644
--- a/htdocs/exports/export.php
+++ b/htdocs/exports/export.php
@@ -379,7 +379,7 @@ if ($step == 2 && $datatoexport)
     print '<tr class="liste_titre">';
 	print '<td>'.$langs->trans("Entities").'</td>';
     print '<td>'.$langs->trans("ExportableFields").'</td>';
-    print '<td width="12" align="middle">';
+    print '<td width="100" align="center">';
     print '<a title='.$langs->trans("All").' alt='.$langs->trans("All").' href="'.$_SERVER["PHP_SELF"].'?step=2&datatoexport='.$datatoexport.'&action=selectfield&field=all">'.$langs->trans("All")."</a>";
     print '/';
     print '<a title='.$langs->trans("None").' alt='.$langs->trans("None").' href="'.$_SERVER["PHP_SELF"].'?step=2&datatoexport='.$datatoexport.'&action=unselectfield&field=all">'.$langs->trans("None")."</a>";
@@ -389,6 +389,8 @@ if ($step == 2 && $datatoexport)
 
     // Champs exportables
     $fieldsarray=$objexport->array_export_fields[0];
+    // Select request if all fields are selected
+    $sqlmaxforexport=$objexport->build_sql(0,array());
 
 #    $this->array_export_module[0]=$module;
 #    $this->array_export_code[0]=$module->export_code[$r];
@@ -418,13 +420,27 @@ if ($step == 2 && $datatoexport)
             // Selected fields
             print '<td>&nbsp;</td>';
             print '<td align="center"><a href="'.$_SERVER["PHP_SELF"].'?step=2&datatoexport='.$datatoexport.'&action=unselectfield&field='.$code.'">'.img_left().'</a></td>';
-            print '<td>'.$langs->trans($label).' ('.$code.')</td>';
+            print '<td>';
+            $text=$langs->trans($label);
+            $tablename=getablenamefromfield($code,$sqlmaxforexport);
+            $htmltext =$langs->trans("Table").": <b>".$tablename."</b><br>";
+			$htmltext.=$langs->trans("Field").': <b>'.$code."</b><br>";
+			print $html->textwithpicto($text,$htmltext);
+			//print ' ('.$code.')';
+            print '</td>';
             $bit=1;
         }
         else
         {
         	// Fields not selected
-            print '<td>'.$langs->trans($label).' ('.$code.')</td>';
+            print '<td>';
+            $text=$langs->trans($label);
+           	$tablename=getablenamefromfield($code,$sqlmaxforexport);
+            $htmltext =$langs->trans("Table").": <b>".$tablename."</b><br>";
+			$htmltext.=$langs->trans("Field").': <b>'.$code."</b><br>";
+			print $html->textwithpicto($text,$htmltext);
+			//print ' ('.$code.')';
+            print '</td>';
             print '<td align="center"><a href="'.$_SERVER["PHP_SELF"].'?step=2&datatoexport='.$datatoexport.'&action=selectfield&field='.$code.'">'.img_right().'</a></td>';
             print '<td>&nbsp;</td>';
             $bit=0;
@@ -452,7 +468,7 @@ if ($step == 2 && $datatoexport)
 	}
 	else
 	{
-		print '<a class="butActionRefused" href="#">'.$langs->trans("NextStep").'</a>';
+		print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("SelectAtLeastOneField")).'">'.$langs->trans("NextStep").'</a>';
 	}
 
     print '</div>';
@@ -506,7 +522,7 @@ if ($step == 3 && $datatoexport)
     $list='';
     foreach($array_selected as $code=>$value)
     {
-        $list.=($list?',':'');
+        $list.=($list?', ':'');
         $list.=$langs->trans($objexport->array_export_fields[0][$code]);
     }
     print '<td>'.$list.'</td></tr>';
@@ -514,6 +530,9 @@ if ($step == 3 && $datatoexport)
     print '</table>';
     print '<br>';
 
+    // Select request if all fields are selected
+    $sqlmaxforexport=$objexport->build_sql(0,array());
+
     print $langs->trans("ChooseFieldsOrdersAndTitle").'<br>';
 
     print '<table class="noborder" width="100%">';
@@ -521,8 +540,8 @@ if ($step == 3 && $datatoexport)
     print '<td>'.$langs->trans("Entities").'</td>';
     print '<td>'.$langs->trans("ExportedFields").'</td>';
     print '<td align="right" colspan="2">'.$langs->trans("Position").'</td>';
-    print '<td>&nbsp;</td>';
-    print '<td>'.$langs->trans("FieldsTitle").'</td>';
+    //print '<td>&nbsp;</td>';
+    //print '<td>'.$langs->trans("FieldsTitle").'</td>';
     print '</tr>';
 
     $var=true;
@@ -537,7 +556,14 @@ if ($step == 3 && $datatoexport)
 
         print '<td>'.img_object('',$entityicon).' '.$langs->trans($entitylang).'</td>';
 
-        print '<td>'.$langs->trans($objexport->array_export_fields[0][$code]).' ('.$code.')</td>';
+        print '<td>';
+        $text=$langs->trans($objexport->array_export_fields[0][$code]);
+        $tablename=getablenamefromfield($code,$sqlmaxforexport);
+        $htmltext =$langs->trans("Table").": <b>".$tablename."</b><br>";
+		$htmltext.=$langs->trans("Field").': <b>'.$code."</b><br>";
+		print $html->textwithpicto($text,$htmltext);
+		//print ' ('.$code.')';
+        print '</td>';
 
         print '<td align="right" width="100">';
         print $value.' ';
@@ -546,9 +572,8 @@ if ($step == 3 && $datatoexport)
         if ($value > 1) print '<a href="'.$_SERVER["PHP_SELF"].'?step=3&datatoexport='.$datatoexport.'&action=upfield&field='.$code.'">'.img_up().'</a>';
         print '</td>';
 
-        print '<td>&nbsp;</td>';
-
-        print '<td>'.$langs->trans($objexport->array_export_fields[0][$code]).'</td>';
+        //print '<td>&nbsp;</td>';
+        //print '<td>'.$langs->trans($objexport->array_export_fields[0][$code]).'</td>';
 
         print '</tr>';
     }
@@ -684,7 +709,7 @@ if ($step == 4 && $datatoexport)
     $list='';
     foreach($array_selected as $code=>$label)
     {
-        $list.=($list?',':'');
+        $list.=($list?', ':'');
         $list.=$langs->trans($objexport->array_export_fields[0][$code]);
     }
     print '<td>'.$list.'</td></tr>';
@@ -763,4 +788,25 @@ print '<br>';
 $db->close();
 
 llxFooter('$Date$ - $Revision$');
+
+
+/**
+ * 	\brief		Return table name of an alias. For this, we look for the "tablename as alias" in sql string.
+ * 	\param		code				Alias.Fieldname
+ * 	\param		sqlmaxforexport		SQL request to parse
+ */
+function getablenamefromfield($code,$sqlmaxforexport)
+{
+	$newsql=$sqlmaxforexport;
+	$newsql=eregi_replace('^.* FROM ','',$newsql);
+	$newsql=eregi_replace(' WHERE .*$','',$newsql);
+	$alias=eregi_replace('\..*$','',$code);
+	//print $newsql.' '.$alias;
+	if (eregi('([a-zA-Z_]+) as '.$alias.'[, \)]',$newsql,$reg))
+	{
+		return $reg[1];
+	}
+	else return '';
+}
+
 ?>
diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php
index 3fd2ce94edb..74a2357ea9b 100644
--- a/htdocs/imports/import.php
+++ b/htdocs/imports/import.php
@@ -1232,7 +1232,7 @@ function show_elem($fieldssource,$i,$pos,$key,$var)
 		print '</td>';
 		print '<td style="font-weight: normal">';
 		print $langs->trans("Field").' '.$pos;
-		if (isset($fieldssource[$pos]['example1'])) print ' (<i>'.$fieldssource[$pos]['example1'].'</i>)';
+		if (! empty($fieldssource[$pos]['example1'])) print ' (<i>'.$fieldssource[$pos]['example1'].'</i>)';
 		print '</td>';
 	}
 	print '</tr>';
diff --git a/htdocs/includes/modules/export/export_csv.modules.php b/htdocs/includes/modules/export/export_csv.modules.php
index cd12da1be73..b4966fbfa28 100644
--- a/htdocs/includes/modules/export/export_csv.modules.php
+++ b/htdocs/includes/modules/export/export_csv.modules.php
@@ -63,7 +63,7 @@ class ExportCsv extends ModeleExports
 
 		$this->id='csv';                // Same value then xxx in file name export_xxx.modules.php
 		$this->label='Csv';             // Label of driver
-		$this->desc='<b>Comma Separated Value</b> file format (.csv). This is a text file format.<br>Fields are separated by separator [ '.$this->separator.' ]. If separator is found inside a field content, field is rounded by round character [ '.$this->enclosure.' ]. Escape character to escape round character is [ '.$this->escape.' ].';
+		$this->desc='<b>Comma Separated Value</b> file format (.csv).<br>This is a text file format where fields are separated by separator [ '.$this->separator.' ]. If separator is found inside a field content, field is rounded by round character [ '.$this->enclosure.' ]. Escape character to escape round character is [ '.$this->escape.' ].';
 		$this->extension='csv';         // Extension for generated file by this driver
 		$this->picto='mime/other';		// Picto
 		$ver=split(' ','$Revision$');
diff --git a/htdocs/includes/modules/export/export_excel.modules.php b/htdocs/includes/modules/export/export_excel.modules.php
index e0b3f9ebda1..ebf0e83baf7 100644
--- a/htdocs/includes/modules/export/export_excel.modules.php
+++ b/htdocs/includes/modules/export/export_excel.modules.php
@@ -1,5 +1,5 @@
 <?php
-/* Copyright (C) 2006-2008 Laurent Destailleur  <eldy@users.sourceforge.net>
+/* Copyright (C) 2006-2009 Laurent Destailleur  <eldy@users.sourceforge.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,11 +18,11 @@
  */
 
 /**
- \file       htdocs/includes/modules/export/export_excel.modules.php
- \ingroup    export
- \brief      Fichier de la classe permettant de g�n�rer les export au format Excel
- \author	    Laurent Destailleur
- \version    $Id$
+ *	\file       htdocs/includes/modules/export/export_excel.modules.php
+ *	\ingroup    export
+ *	\brief      Fichier de la classe permettant de g�n�rer les export au format Excel
+ *	\author	    Laurent Destailleur
+ *	\version    $Id$
  */
 
 require_once(DOL_DOCUMENT_ROOT."/includes/modules/export/modules_export.php");
@@ -32,10 +32,9 @@ require_once(PHP_WRITEEXCEL_PATH."/functions.writeexcel_utility.inc.php");
 
 
 /**
- \class      ExportExcel
- \brief      Classe permettant de g�n�rer les export au format Excel
+ *	\class      ExportExcel
+ *	\brief      Class to build export files with Excel format
  */
-
 class ExportExcel extends ModeleExports
 {
 	var $id;
@@ -53,8 +52,8 @@ class ExportExcel extends ModeleExports
 
 
 	/**
-	 \brief      Constructeur
-	 \param	    db      Handler acc�s base de donn�e
+	 *	\brief      Constructor
+	 *	\param	    db      databse handler
 	 */
 	function ExportExcel($db)
 	{
@@ -63,7 +62,7 @@ class ExportExcel extends ModeleExports
 
 		$this->id='excel';                  // Same value then xxx in file name export_xxx.modules.php
 		$this->label='Excel';               // Label of driver
-		$this->desc='Native <b>Excel 95</b> file format (.xls)';
+		$this->desc='<b>Excel</b> file format (.xls)<br>This is native Excel 95 format.';
 		$this->extension='xls';             // Extension for generated file by this driver
         $this->picto='mime/xls';					// Picto
 		$ver=split(' ','$Revision$');
diff --git a/htdocs/includes/modules/export/export_tsv.modules.php b/htdocs/includes/modules/export/export_tsv.modules.php
index 2fdb32c39a4..56d1238985e 100644
--- a/htdocs/includes/modules/export/export_tsv.modules.php
+++ b/htdocs/includes/modules/export/export_tsv.modules.php
@@ -58,7 +58,7 @@ class ExportTsv extends ModeleExports
 
         $this->id='tsv';                // Same value then xxx in file name export_xxx.modules.php
         $this->label='Tsv';             // Label of driver
-        $this->desc='<b>Tab Separated Value</b> file format (.tsv)';
+        $this->desc='<b>Tab Separated Value</b> file format (.tsv)<br>This is a text file format where fields are separated by separator [tab].';
         $this->extension='tsv';         // Extension for generated file by this driver
         $this->picto='mime/other';		// Picto
         $ver=split(' ','$Revision$');
diff --git a/htdocs/includes/modules/import/import_csv.modules.php b/htdocs/includes/modules/import/import_csv.modules.php
index ac361ba24bf..be7a3677058 100644
--- a/htdocs/includes/modules/import/import_csv.modules.php
+++ b/htdocs/includes/modules/import/import_csv.modules.php
@@ -63,7 +63,7 @@ class ImportCsv extends ModeleImports
 
         $this->id='csv';                // Same value then xxx in file name export_xxx.modules.php
         $this->label='Csv';             // Label of driver
-        $this->desc='<b>Comma Separated Value</b> file format (.csv). This is a text file format.<br>Fields are separated by separator [ '.$this->separator.' ]. If separator is found inside a field content, field is rounded by round character [ '.$this->enclosure.' ]. Escape character to escape round character is [ '.$this->escape.' ].';
+        $this->desc='<b>Comma Separated Value</b> file format (.csv).<br>This is a text file format where fields are separated by separator [ '.$this->separator.' ]. If separator is found inside a field content, field is rounded by round character [ '.$this->enclosure.' ]. Escape character to escape round character is [ '.$this->escape.' ].';
         $this->extension='csv';         // Extension for generated file by this driver
         $this->picto='mime/other';		// Picto
         $ver=split(' ','$Revision$');
diff --git a/htdocs/langs/en_US/exports.lang b/htdocs/langs/en_US/exports.lang
index 6a9f987c7dc..02b77f3d188 100644
--- a/htdocs/langs/en_US/exports.lang
+++ b/htdocs/langs/en_US/exports.lang
@@ -29,7 +29,7 @@ ChooseFieldsOrdersAndTitle=Choose fields order...
 FieldsOrder=Fields order
 FieldsTitle=Fields title
 ChooseExportFormat=Choose export format
-NowClickToGenerateToBuildExportFile=Now, click on "Generate" to build export file...
+NowClickToGenerateToBuildExportFile=Now, select file format in combo box and click on "Generate" to build export file...
 AvailableFormats=Available formats
 LibraryShort=Library
 LibraryUsed=Library used
@@ -81,3 +81,4 @@ FieldNeedSource=This fiels in database require a data from source file
 SomeMandatoryFieldHaveNoSource=Some mandatory fields have no source from data file
 InformationOnSourceFile=Informations on source file
 InformationOnTargetTables=Informations on target fields
+SelectAtLeastOneField=Switch at least one source field in the column of fields to export
\ No newline at end of file
diff --git a/htdocs/langs/fr_FR/exports.lang b/htdocs/langs/fr_FR/exports.lang
index 742b0e4ae82..8e94647a617 100644
--- a/htdocs/langs/fr_FR/exports.lang
+++ b/htdocs/langs/fr_FR/exports.lang
@@ -29,7 +29,7 @@ ChooseFieldsOrdersAndTitle=Choisissez l'ordre des champs...
 FieldsOrder=Ordre des champs
 FieldsTitle=Titre champs
 ChooseExportFormat=Choisissez le format d'export
-NowClickToGenerateToBuildExportFile=Maintenant, cliquez sur "Générer" pour générer le fichier export...
+NowClickToGenerateToBuildExportFile=Maintenant, sélectionner le format d'export dans la liste déroulante et cliquez sur "Générer" pour fabriquer le fichier export...
 AvailableFormats=Formats dispo.
 LibraryShort=Librairie
 LibraryUsed=Librairie utilisée
@@ -81,3 +81,4 @@ FieldNeedSource=Ce champ en base requiert obligatoirement une donnée source
 SomeMandatoryFieldHaveNoSource=Certains champs obligatoires n'ont pas de champ source issus du fichier
 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
\ No newline at end of file
-- 
GitLab