ソースを参照

Merge pull request #19677 from Hystepik/develop#1

NEW : Import with select boxes
Laurent Destailleur 3 年 前
コミット
8b7e790130
3 ファイル変更142 行追加54 行削除
  1. 136 52
      htdocs/imports/import.php
  2. 3 1
      htdocs/langs/en_US/exports.lang
  3. 3 1
      htdocs/langs/fr_FR/exports.lang

+ 136 - 52
htdocs/imports/import.php

@@ -136,13 +136,14 @@ $step				= (GETPOST('step') ? GETPOST('step') : 1);
 $import_name = GETPOST('import_name');
 $hexa				= GETPOST('hexa');
 $importmodelid = GETPOST('importmodelid');
-$excludefirstline = (GETPOST('excludefirstline') ? GETPOST('excludefirstline') : 1);
+$excludefirstline = (GETPOST('excludefirstline') ? GETPOST('excludefirstline') : 2);
 $endatlinenb		= (GETPOST('endatlinenb') ? GETPOST('endatlinenb') : '');
 $updatekeys			= (GETPOST('updatekeys', 'array') ? GETPOST('updatekeys', 'array') : array());
 $separator			= (GETPOST('separator', 'nohtml') ? GETPOST('separator', 'nohtml') : (!empty($conf->global->IMPORT_CSV_SEPARATOR_TO_USE) ? $conf->global->IMPORT_CSV_SEPARATOR_TO_USE : ','));
 $enclosure			= (GETPOST('enclosure', 'nohtml') ? GETPOST('enclosure', 'nohtml') : '"');
 $separator_used     = str_replace('\t', "\t", $separator);
 
+
 $objimport = new Import($db);
 $objimport->load_arrays($user, ($step == 1 ? '' : $datatoimport));
 
@@ -160,7 +161,7 @@ foreach ($fieldsarray as $elem) {
 	$tabelem = explode('=', $elem, 2);
 	$key = $tabelem[0];
 	$val = (isset($tabelem[1]) ? $tabelem[1] : '');
-	if ($key && $val) {
+	if ($key && $val && ($key > 0 && $step != 4)) {
 		$array_match_file_to_database[$key] = $val;
 	}
 }
@@ -325,13 +326,16 @@ if ($action == 'saveorder') {
 	$pos = 0;
 	foreach ($fieldsarray as $fieldnb) {	// For each elem in list. fieldnb start from 1 to ...
 		// Get name of database fields at position $pos and put it into $namefield
-		$posbis = 0; $namefield = '';
+		$posbis = 0;
+
+		$namefield = '';
 		foreach ($fieldstarget as $key => $val) {	// key:   val:
 			//dol_syslog('AjaxImport key='.$key.' val='.$val);
 			if ($posbis < $pos) {
 				$posbis++;
 				continue;
 			}
+
 			// We found the key of targets that is at position pos
 			$namefield = $key;
 			//dol_syslog('AjaxImport Field name found for file field nb '.$fieldnb.'='.$namefield);
@@ -1004,7 +1008,7 @@ if ($step == 4 && $datatoimport) {
 	$lefti = 1;
 	foreach ($array_match_file_to_database as $key => $val) {
 		$var = !$var;
-		show_elem($fieldssource, $key, $val, $var); // key is field number in source file
+		show_elem($fieldssource, $key, $val, $var, 1, '', $listofkeys); // key is field number in source file
 		//print '> '.$lefti.'-'.$key.'-'.$val;
 		$listofkeys[$key] = 1;
 		$fieldsplaced[$key] = 1;
@@ -1023,7 +1027,7 @@ if ($step == 4 && $datatoimport) {
 	while ($lefti <= $num) {
 		$var = !$var;
 		$newkey = getnewkey($fieldssource, $listofkeys);
-		show_elem($fieldssource, $newkey, '', $var); // key start after field number in source file
+		show_elem($fieldssource, $newkey, '', $var, 1, '', $listofkeys); // key start after field number in source file
 		//print '> '.$lefti.'-'.$newkey;
 		$listofkeys[$key] = 1;
 		$lefti++;
@@ -1037,11 +1041,14 @@ if ($step == 4 && $datatoimport) {
 	print '</td><td width="50%">';
 
 	// List of target fields
-	$height = '24px'; //needs px for css height attribute below
+	//	$height = '24px'; //needs px for css height attribute below
+	$height = '30px';
 	$i = 0;
 	$mandatoryfieldshavesource = true;
-
+	$fieldselect = 1;
 	print '<table width="100%" class="nobordernopadding">';
+	$pos = 1;
+
 	foreach ($fieldstarget as $code => $label) {
 		print '<tr class="oddeven" style="height:'.$height.'">';
 
@@ -1051,7 +1058,7 @@ if ($step == 4 && $datatoimport) {
 		$tablealias = preg_replace('/(\..*)$/i', '', $code);
 		$tablename = $objimport->array_import_tables[0][$tablealias];
 
-		$entityicon = $entitytoicon[$entity] ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ...
+		$entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ...
 		$entitylang = $entitytolang[$entity] ? $entitytolang[$entity] : $objimport->array_import_label[0]; // $entitylang must be a translation key to describe object the field is related to, like 'Company', 'Contact', 'MyModyle', ...
 
 		print '<td class="nowraponall" style="font-weight: normal">=>'.img_object('', $entityicon).' '.$langs->trans($entitylang).'</td>';
@@ -1071,7 +1078,7 @@ if ($step == 4 && $datatoimport) {
 		print '</td>';
 		// Info field
 		print '<td class="nowraponall" style="font-weight:normal; text-align:right">';
-		$filecolumn = $array_match_database_to_file[$code];
+		$filecolumn = !empty($array_match_database_to_file[$code])?$array_match_database_to_file[$code]:0;
 		// Source field info
 		$htmltext = '<b><u>'.$langs->trans("FieldSource").'</u></b><br>';
 		if ($filecolumn > count($fieldssource)) {
@@ -1091,7 +1098,7 @@ if ($step == 4 && $datatoimport) {
 		}
 		// Source required
 		$htmltext .= $langs->trans("SourceRequired").': <b>'.yn(preg_match('/\*$/', $label)).'</b><br>';
-		$example = $objimport->array_import_examplevalues[0][$code];
+		$example = !empty($objimport->array_import_examplevalues[0][$code])?$objimport->array_import_examplevalues[0][$code]:"";
 		// Example
 		if (empty($objimport->array_import_convertvalue[0][$code])) {	// If source file does not need convertion
 			if ($example) {
@@ -1129,6 +1136,7 @@ if ($step == 4 && $datatoimport) {
 		print '</td>';
 
 		print '</tr>';
+		$fieldselect++;
 	}
 	print '</table>';
 
@@ -1147,7 +1155,7 @@ if ($step == 4 && $datatoimport) {
 		if (empty($fieldsplaced[$key])) {
 			//
 			$nbofnotimportedfields++;
-			show_elem($fieldssource, $key, '', $var, 'nostyle');
+			show_elem($fieldssource, $key, '', $var, 0, 'nostyle', $listofkeys);
 			//print '> '.$lefti.'-'.$key;
 			$listofkeys[$key] = 1;
 			$lefti++;
@@ -1156,7 +1164,7 @@ if ($step == 4 && $datatoimport) {
 
 	// Print one more empty field
 	$newkey = getnewkey($fieldssource, $listofkeys);
-	show_elem($fieldssource, $newkey, '', $var, 'nostyle');
+	show_elem($fieldssource, $newkey, '', $var, 1, 'nostyle', $listofkeys);
 	//print '> '.$lefti.'-'.$newkey;
 	$listofkeys[$newkey] = 1;
 	$nbofnotimportedfields++;
@@ -1169,7 +1177,7 @@ if ($step == 4 && $datatoimport) {
 	$i = 0;
 	while ($i < $nbofnotimportedfields) {
 		// Print empty cells
-		show_elem('', '', 'none', $var, 'nostyle');
+		show_elem('', '', 'none', $var, 0, 'nostyle', $listofkeys);
 		$i++;
 	}
 	print '</td></tr>';
@@ -1180,35 +1188,51 @@ if ($step == 4 && $datatoimport) {
 
 	if ($conf->use_javascript_ajax) {
 		print '<script type="text/javascript">';
-		print 'jQuery(function() {
-                    jQuery("#left, #right").sortable({
-                        /* placeholder: \'ui-state-highlight\', */
-                        handle: \'.boxhandle\',
-                        revert: \'invalid\',
-                        items: \'.box\',
-                        containment: \'.fiche\',
-                        connectWith: \'.connectedSortable\',
-                        stop: function(event, ui) {
-                            updateOrder();
-                        }
-                    });
-                });
-        ';
+
+		// print 'jQuery(function() {
+		// 			jQuery("#left, #right").sortable({
+		// 				/* placeholder: \'ui-state-highlight\', */
+		// 				handle: \'.boxhandle\',
+		// 				revert: \'invalid\',
+		// 				items: \'.box\',
+		// 				containment: \'.fiche\',
+		// 				connectWith: \'.connectedSortable\',
+		// 				stop: function(event, ui) {
+		// 					updateOrder();
+		// 				}
+		// 			});
+		// 		});
+		// ';
+
+		print '$(".import_select").on("change",function(){
+			updateOrder2();
+		})';
+
 		print "\n";
-		print 'function updateOrder(){'."\n";
-		print 'var left_list = cleanSerialize(jQuery("#left").sortable("serialize" ));'."\n";
-		//print 'var right_list = cleanSerialize(jQuery("#right").sortable("serialize" ));'."\n";
-		print 'var boxorder = \'A:\' + left_list;'."\n";
-		//print 'var boxorder = \'A:\' + left_list + \'-B:\' + right_list;'."\n";
-		//print 'alert(\'boxorder=\' + boxorder);';
-		//print 'var userid = \''.$user->id.'\';'."\n";
-		//print 'var datatoimport = "'.$datatoimport.'";'."\n";
-		// print 'jQuery.ajax({ url: "ajaximport.php?step=4&boxorder=" + boxorder + "&userid=" + userid + "&datatoimport=" + datatoimport,
-		//                    async: false
-		//        });'."\n";
-		// Now reload page
+		// print 'function updateOrder(){'."\n";
+		// print 'var left_list = cleanSerialize(jQuery("#left").sortable("serialize" ));'."\n";
+		// //print 'var right_list = cleanSerialize(jQuery("#right").sortable("serialize" ));'."\n";
+		// print 'var boxorder = \'A:\' + left_list;'."\n";
+		// //print 'var boxorder = \'A:\' + left_list + \'-B:\' + right_list;'."\n";
+		// //print 'alert(\'boxorder=\' + boxorder);';
+		// //print 'var userid = \''.$user->id.'\';'."\n";
+		// //print 'var datatoimport = "'.$datatoimport.'";'."\n";
+		// // print 'jQuery.ajax({ url: "ajaximport.php?step=4&boxorder=" + boxorder + "&userid=" + userid + "&datatoimport=" + datatoimport,
+		// //                    async: false
+		// //        });'."\n";
+		// // Now reload page
+		// print 'var newlocation= \''.$_SERVER["PHP_SELF"].'?step=4'.$param.'&action=saveorder&token='.newToken().'&boxorder=\' + boxorder;'."\n";
+		// //print 'alert(newlocation);';
+		// print 'window.location.href=newlocation;'."\n";
+		// print '}'."\n";
+
+		print 'function updateOrder2(){'."\n";
+		print 'var tmpboxorder = \'A:\''."\n";
+		print '$(".import_select").each(function(){'."\n";
+		print 'tmpboxorder = tmpboxorder + $(this).val() + \',\'';
+		print '});'."\n";
+		print 'boxorder = tmpboxorder.slice(0,-1)'."\n";
 		print 'var newlocation= \''.$_SERVER["PHP_SELF"].'?step=4'.$param.'&action=saveorder&token='.newToken().'&boxorder=\' + boxorder;'."\n";
-		//print 'alert(newlocation);';
 		print 'window.location.href=newlocation;'."\n";
 		print '}'."\n";
 		print '</script>'."\n";
@@ -1471,6 +1495,20 @@ if ($step == 5 && $datatoimport) {
 	if ($action == 'launchsimu') {
 		print ' &nbsp; <a href="'.$_SERVER["PHP_SELF"].'?step=5'.$param.'">'.$langs->trans("Modify").'</a>';
 	}
+	if ($excludefirstline == 2) {
+		print $form->textwithpicto("", $langs->trans("WarningFirstImportedLine", $excludefirstline), 1, 'warning', "warningexcludefirstline");
+		print '<script>
+			$( document ).ready(function() {
+				$("input[name=\'excludefirstline\']").on("change",function(){
+					if($(this).val() <= 1){
+						$(".warningexcludefirstline").hide();
+					}else{
+						$(".warningexcludefirstline").show();
+					}
+				})
+			});
+		</script>';
+	}
 	print '</td></tr>';
 
 	// Keys for data UPDATE (not INSERT of new data)
@@ -2093,18 +2131,21 @@ $db->close();
 /**
  * Function to put the movable box of a source field
  *
- * @param	array	$fieldssource	List of source fields
- * @param	int		$pos			Pos
- * @param	string	$key			Key
- * @param	boolean	$var			Line style (odd or not)
- * @param	int		$nostyle		Hide style
+ * @param	array	$fieldssource	 List of source fields
+ * @param	int		$pos			 Pos
+ * @param	string	$key			 Key
+ * @param	boolean	$var			 Line style (odd or not)
+ * @param	boolean $isimportedfield Verify if it's an imported field
+ * @param	int		$nostyle		 Hide style
+ * @param	array   $listofkeys      List of keys for select boxes
  * @return	void
  */
-function show_elem($fieldssource, $pos, $key, $var, $nostyle = '')
+function show_elem($fieldssource, $pos, $key, $var, $isimportedfield, $nostyle = '', &$listofkeys = array())
 {
 	global $langs, $bc;
 
-	$height = '24px';
+	//	$height = '24px';
+		$height = '30px';
 
 	if ($key == 'none') {
 		//stop multiple duplicate ids with no number
@@ -2121,7 +2162,7 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '')
 	if ($pos && $pos > count($fieldssource)) {	// No fields
 		print '<tr'.($nostyle ? '' : ' '.$bc[$var]).' style="height:'.$height.'">';
 		print '<td class="nocellnopadding" width="16" style="font-weight: normal">';
-		print img_picto(($pos > 0 ? $langs->trans("MoveField", $pos) : ''), 'grip_title', 'class="boxhandle" style="cursor:move;"');
+		//print img_picto(($pos > 0 ? $langs->trans("MoveField", $pos) : ''), 'grip_title', 'class="boxhandle" style="cursor:move;"');
 		print '</td>';
 		print '<td style="font-weight: normal">';
 		print $langs->trans("NoFields");
@@ -2136,22 +2177,65 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '')
 		print '&nbsp;';
 		print '</td>';
 		print '</tr>';
+	} elseif (empty($isimportedfield)) {
+		$example = !empty($fieldssource[$pos]['example1'])?$fieldssource[$pos]['example1']:"";
+		if ($example) {
+			if (!utf8_check($example)) {
+				$example = utf8_encode($example);
+			}
+			print '<tr'.($nostyle ? '' : ' '.$bc[$var]).' style="height:'.$height.'">';
+			print '<td class="nocellnopadding" width="16" style="font-weight: normal">';
+			print '&nbsp;';
+			print '</td>';
+			print '<td style="font-weight: normal">';
+			print $langs->trans("EmptyField").':&nbsp;';
+			print ' (<i>'.$example.'</i>)';
+			print '</td>';
+			print '</tr>';
+		}
 	} else {
 		// Print field of source file
 		print '<tr'.($nostyle ? '' : ' '.$bc[$var]).' style="height:'.$height.'">';
 		print '<td class="nocellnopadding" width="16" style="font-weight: normal">';
 		// The image must have the class 'boxhandle' beause it's value used in DOM draggable objects to define the area used to catch the full object
-		print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"');
+		//print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"');
 		print '</td>';
-		print '<td class="nowraponall" style="font-weight: normal">';
-		print $langs->trans("Field").' '.$pos;
-		$example = $fieldssource[$pos]['example1'];
+		print '<td class="nowraponall" width="100" style="font-weight: normal">';
+		$example = !empty($fieldssource[$pos]['example1'])?$fieldssource[$pos]['example1']:"";
+		if ($example != "") {
+			print $langs->trans("Field").' '.$pos.':&nbsp;';
+		} else {
+			print $langs->trans("EmptyField").':&nbsp;';
+		}
 		if ($example) {
 			if (!utf8_check($example)) {
 				$example = utf8_encode($example);
 			}
+		}
+		$nameselect = ($pos > 0) ? $pos : (-$pos);
+		print '<td class="nowraponall" style="font-weight: normal">';
+		print '<select class="import_select flat" style="width:100%;" autocomplete="off" name="selectfield_'.$nameselect.'">';
+		$valueemptyoption = ($pos < 0) ? $pos : (-$pos);
+		print '<option value="'.$valueemptyoption.'">&nbsp;</option>';
+		if ($example != "") {
+			print '<option selected value="'.$pos.'">';
 			print ' (<i>'.$example.'</i>)';
+			print '</option>';
 		}
+		foreach ($fieldssource as $newkey => $val) {
+			if (empty($listofkeys[$newkey])) {
+				$example = $fieldssource[$newkey]['example1'];
+				if ($example) {
+					if (!utf8_check($example)) {
+						$example = utf8_encode($example);
+					}
+					print '<option value="'.$newkey.'">';
+					print ' (<i>'.$example.'</i>)';
+					print '</option>';
+				}
+			}
+		}
+		print '</td>';
 		print '</td>';
 		print '</tr>';
 	}

+ 3 - 1
htdocs/langs/en_US/exports.lang

@@ -8,7 +8,7 @@ ImportableDatas=Importable dataset
 SelectExportDataSet=Choose dataset you want to export...
 SelectImportDataSet=Choose dataset you want to import...
 SelectExportFields=Choose the fields you want to export, or select a predefined export profile
-SelectImportFields=Choose the 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 profile:
+SelectImportFields=Choose the source file fields you want to import and their target field in database by choosing the fields with the select box, or select a predefined import profile:
 NotImportedFields=Fields of source file not imported
 SaveExportModel=Save your selections as an export profile/template (for reuse).
 SaveImportModel=Save this import profile (for reuse) ...
@@ -135,3 +135,5 @@ NbInsert=Number of inserted lines: %s
 NbUpdate=Number of updated lines: %s
 MultipleRecordFoundWithTheseFilters=Multiple records have been found with these filters: %s
 StocksWithBatch=Stocks and location (warehouse) of products with batch/serial number
+WarningFirstImportedLine=The first line(s) will not be imported with the current selection
+EmptyField=Empty field

+ 3 - 1
htdocs/langs/fr_FR/exports.lang

@@ -8,7 +8,7 @@ ImportableDatas=Lot de données importables
 SelectExportDataSet=Choisissez un lot prédéfini de données que vous désirez exporter…
 SelectImportDataSet=Choisissez un lot prédéfini de données que vous désirez importer…
 SelectExportFields=Choisissez les champs à exporter, ou choisissez un profil d'export prédéfini
-SelectImportFields=Choisissez les champs du fichier source à importer et leur destination dans la base en les déplaçant vers le haut ou vers le bas via l'ancre %s, ou choisissez un profil d'import prédéfini:
+SelectImportFields=Choisissez les champs du fichier source à importer et leur destination dans la base en utilisant les boîtes de sélection, ou choisissez un profil d'import prédéfini:
 NotImportedFields=Champs du fichier source non importés
 SaveExportModel=Enregistrer ce profil d'export (si vous désirez le réutiliser ultérieurement) …
 SaveImportModel=Enregistrer ce profil d'import (si vous désirez le réutiliser ultérieurement) …
@@ -135,3 +135,5 @@ NbInsert=Nombre de lignes insérées: %s
 NbUpdate=Nombre de lignes mises à jour: %s
 MultipleRecordFoundWithTheseFilters=Plusieurs enregistrements ont été trouvés avec ces filtres: %s
 StocksWithBatch=Stocks et entrepôts des produits avec numéro de lot/série
+WarningFirstImportedLine=Les première(s) ligne(s) ne seront pas importée(s) avec cette selection
+EmptyField=Champ vide