ss->assign("IMPORT_MODULE", $_REQUEST['import_module']); $has_header = ( isset( $_REQUEST['has_header']) ? 1 : 0 ); $sugar_config['import_max_records_per_file'] = ( empty($sugar_config['import_max_records_per_file']) ? 1000 : $sugar_config['import_max_records_per_file'] ); $this->ss->assign("CURRENT_STEP", $this->currentStep); // attempt to lookup a preexisting field map // use the custom one if specfied to do so in step 1 $mapping_file = new ImportMap(); $field_map = $mapping_file->set_get_import_wizard_fields(); $default_values = array(); $ignored_fields = array(); if ( !empty( $_REQUEST['source_id'])) { $GLOBALS['log']->fatal("Loading import map properties."); $mapping_file = new ImportMap(); $mapping_file->retrieve( $_REQUEST['source_id'],false); $_REQUEST['source'] = $mapping_file->source; $has_header = $mapping_file->has_header; if (isset($mapping_file->delimiter)) $_REQUEST['custom_delimiter'] = $mapping_file->delimiter; if (isset($mapping_file->enclosure)) $_REQUEST['custom_enclosure'] = htmlentities($mapping_file->enclosure); $field_map = $mapping_file->getMapping(); //print_r($field_map);die(); $default_values = $mapping_file->getDefaultValues(); $this->ss->assign("MAPNAME",$mapping_file->name); $this->ss->assign("CHECKMAP",'checked="checked" value="on"'); } else { // Try to see if we have a custom mapping we can use // based upon the where the records are coming from // and what module we are importing into $classname = 'ImportMap' . ucfirst($_REQUEST['source']); if ( file_exists("modules/Import/maps/{$classname}.php") ) require_once("modules/Import/maps/{$classname}.php"); elseif ( file_exists("custom/modules/Import/maps/{$classname}.php") ) require_once("custom/modules/Import/maps/{$classname}.php"); else { require_once("custom/modules/Import/maps/ImportMapOther.php"); $classname = 'ImportMapOther'; $_REQUEST['source'] = 'other'; } if ( class_exists($classname) ) { $mapping_file = new $classname; $ignored_fields = $mapping_file->getIgnoredFields($_REQUEST['import_module']); $field_map2 = $mapping_file->getMapping($_REQUEST['import_module']); $field_map = array_merge($field_map,$field_map2); } } $delimeter = $this->getRequestDelimiter(); $this->ss->assign("CUSTOM_DELIMITER", $delimeter); $this->ss->assign("CUSTOM_ENCLOSURE", ( !empty($_REQUEST['custom_enclosure']) ? $_REQUEST['custom_enclosure'] : "" )); //populate import locale values from import mapping if available, these values will be used througout the rest of the code path $uploadFileName = $_REQUEST['file_name']; // Now parse the file and look for errors $importFile = new ImportFile( $uploadFileName, $delimeter, html_entity_decode($_REQUEST['custom_enclosure'],ENT_QUOTES), FALSE); if ( !$importFile->fileExists() ) { $this->_showImportError($mod_strings['LBL_CANNOT_OPEN'],$_REQUEST['import_module'],'Step2'); return; } $charset = $importFile->autoDetectCharacterSet(); // retrieve first 3 rows $rows = array(); //Keep track of the largest row count found. $maxFieldCount = 0; for ( $i = 0; $i < 3; $i++ ) { $rows[] = $importFile->getNextRow(); $maxFieldCount = $importFile->getFieldCount() > $maxFieldCount ? $importFile->getFieldCount() : $maxFieldCount; } $ret_field_count = $maxFieldCount; // Bug 14689 - Parse the first data row to make sure it has non-empty data in it $isempty = true; if ( $rows[(int)$has_header] != false ) { foreach ( $rows[(int)$has_header] as $value ) { if ( strlen(trim($value)) > 0 ) { $isempty = false; break; } } } if ($isempty || $rows[(int)$has_header] == false) { $this->_showImportError($mod_strings['LBL_NO_LINES'],$_REQUEST['import_module'],'Step2'); return; } // save first row to send to step 4 $this->ss->assign("FIRSTROW", base64_encode(serialize($rows[0]))); // Now build template $this->ss->assign("TMP_FILE", $uploadFileName ); $this->ss->assign("SOURCE", $_REQUEST['source'] ); $this->ss->assign("TYPE", $_REQUEST['type'] ); $this->ss->assign("DELETE_INLINE_PNG", SugarThemeRegistry::current()->getImage('basic_search','align="absmiddle" alt="'.$app_strings['LNK_DELETE'].'" border="0"')); $this->ss->assign("PUBLISH_INLINE_PNG", SugarThemeRegistry::current()->getImage('advanced_search','align="absmiddle" alt="'.$mod_strings['LBL_PUBLISH'].'" border="0"')); $this->instruction = 'LBL_SELECT_MAPPING_INSTRUCTION'; $this->ss->assign('INSTRUCTION', $this->getInstruction()); $this->ss->assign("MODULE_TITLE", $this->getModuleTitle(false)); $this->ss->assign("STEP4_TITLE", strip_tags(str_replace("\n","",getClassicModuleTitle( $mod_strings['LBL_MODULE_NAME'], array($mod_strings['LBL_MODULE_NAME'],$mod_strings['LBL_STEP_4_TITLE']), false ))) ); $this->ss->assign("HEADER", $app_strings['LBL_IMPORT']." ". $mod_strings['LBL_MODULE_NAME']); // we export it as email_address, but import as email1 $field_map['email_address'] = 'email1'; // build each row; row count is determined by the the number of fields in the import file $columns = array(); $mappedFields = array(); // this should be populated if the request comes from a 'Back' button click $importColumns = $this->getImportColumns(); $column_sel_from_req = false; if (!empty($importColumns)) { $column_sel_from_req = true; } for($field_count = 0; $field_count < $ret_field_count; $field_count++) { // See if we have any field map matches $defaultValue = ""; // Bug 31260 - If the data rows have more columns than the header row, then just add a new header column if ( !isset($rows[0][$field_count]) ) $rows[0][$field_count] = ''; // See if we can match the import row to a field in the list of fields to import $firstrow_name = trim(str_replace(":","",$rows[0][$field_count])); if ($has_header && isset( $field_map[$firstrow_name] ) ) { $defaultValue = $field_map[$firstrow_name]; } elseif (isset($field_map[$field_count])) { $defaultValue = $field_map[$field_count]; } elseif (empty( $_REQUEST['source_id'])) { $defaultValue = trim($rows[0][$field_count]); } // build string of options $fields = $this->bean->get_importable_fields(); $options = array(); $defaultField = ''; global $current_language; $moduleStrings = return_module_language($current_language, $this->bean->module_dir); foreach ( $fields as $fieldname => $properties ) { // get field name if (!empty($moduleStrings['LBL_EXPORT_'.strtoupper($fieldname)]) ) { $displayname = str_replace(":","", $moduleStrings['LBL_EXPORT_'.strtoupper($fieldname)] ); } else if (!empty ($properties['vname'])) { $displayname = str_replace(":","",translate($properties['vname'] ,$this->bean->module_dir)); } else $displayname = str_replace(":","",translate($properties['name'] ,$this->bean->module_dir)); // see if this is required $req_mark = ""; $req_class = ""; if ( array_key_exists($fieldname, $this->bean->get_import_required_fields()) ) { $req_mark = ' ' . $app_strings['LBL_REQUIRED_SYMBOL']; $req_class = ' class="required" '; } // see if we have a match $selected = ''; if ($column_sel_from_req && isset($importColumns[$field_count])) { if ($fieldname == $importColumns[$field_count]) { $selected = ' selected="selected" '; $defaultField = $fieldname; $mappedFields[] = $fieldname; } } else { if ( !empty($defaultValue) && !in_array($fieldname,$mappedFields) && !in_array($fieldname,$ignored_fields) ) { if ( strtolower($fieldname) == strtolower($defaultValue) || strtolower($fieldname) == str_replace(" ","_",strtolower($defaultValue)) || strtolower($displayname) == strtolower($defaultValue) || strtolower($displayname) == str_replace(" ","_",strtolower($defaultValue)) ) { $selected = ' selected="selected" '; $defaultField = $fieldname; $mappedFields[] = $fieldname; } } } // get field type information $fieldtype = ''; if ( isset($properties['type']) && isset($mod_strings['LBL_IMPORT_FIELDDEF_' . strtoupper($properties['type'])]) ) $fieldtype = ' [' . $mod_strings['LBL_IMPORT_FIELDDEF_' . strtoupper($properties['type'])] . '] '; if ( isset($properties['comment']) ) $fieldtype .= ' - ' . $properties['comment']; $options[$displayname.$fieldname] = '\n'; } // get default field value $defaultFieldHTML = ''; if ( !empty($defaultField) ) { $defaultFieldHTML = getControl( $_REQUEST['import_module'], $defaultField, $fields[$defaultField], ( isset($default_values[$defaultField]) ? $default_values[$defaultField] : '' ) ); } if ( isset($default_values[$defaultField]) ) unset($default_values[$defaultField]); // Bug 27046 - Sort the column name picker alphabetically ksort($options); // to be displayed in UTF-8 format if (!empty($charset) && $charset != 'UTF-8') { if (isset($rows[1][$field_count])) { $rows[1][$field_count] = $locale->translateCharset($rows[1][$field_count], $charset); } } $cellOneData = isset($rows[0][$field_count]) ? $rows[0][$field_count] : ''; $cellTwoData = isset($rows[1][$field_count]) ? $rows[1][$field_count] : ''; $cellThreeData = isset($rows[2][$field_count]) ? $rows[2][$field_count] : ''; $columns[] = array( 'field_choices' => implode('',$options), 'default_field' => $defaultFieldHTML, 'cell1' => str_replace(""",'', htmlspecialchars($cellOneData)), 'cell2' => str_replace(""",'', htmlspecialchars($cellTwoData)), 'cell3' => str_replace(""",'', htmlspecialchars($cellThreeData)), 'show_remove' => false, ); } // add in extra defaulted fields if they are in the mapping record if ( count($default_values) > 0 ) { foreach ( $default_values as $field_name => $default_value ) { // build string of options $fields = $this->bean->get_importable_fields(); $options = array(); $defaultField = ''; foreach ( $fields as $fieldname => $properties ) { // get field name if (!empty ($properties['vname'])) $displayname = str_replace(":","",translate($properties['vname'] ,$this->bean->module_dir)); else $displayname = str_replace(":","",translate($properties['name'] ,$this->bean->module_dir)); // see if this is required $req_mark = ""; $req_class = ""; if ( array_key_exists($fieldname, $this->bean->get_import_required_fields()) ) { $req_mark = ' ' . $app_strings['LBL_REQUIRED_SYMBOL']; $req_class = ' class="required" '; } // see if we have a match $selected = ''; if ( strtolower($fieldname) == strtolower($field_name) && !in_array($fieldname,$mappedFields) && !in_array($fieldname,$ignored_fields) ) { $selected = ' selected="selected" '; $defaultField = $fieldname; $mappedFields[] = $fieldname; } // get field type information $fieldtype = ''; if ( isset($properties['type']) && isset($mod_strings['LBL_IMPORT_FIELDDEF_' . strtoupper($properties['type'])]) ) $fieldtype = ' [' . $mod_strings['LBL_IMPORT_FIELDDEF_' . strtoupper($properties['type'])] . '] '; if ( isset($properties['comment']) ) $fieldtype .= ' - ' . $properties['comment']; $options[$displayname.$fieldname] = '\n'; } // get default field value $defaultFieldHTML = ''; if ( !empty($defaultField) ) { $defaultFieldHTML = getControl( $_REQUEST['import_module'], $defaultField, $fields[$defaultField], $default_value ); } // Bug 27046 - Sort the column name picker alphabetically ksort($options); $columns[] = array( 'field_choices' => implode('',$options), 'default_field' => $defaultFieldHTML, 'show_remove' => true, ); $ret_field_count++; } } $this->ss->assign("COLUMNCOUNT",$ret_field_count); $this->ss->assign("rows",$columns); $this->ss->assign('datetimeformat', $GLOBALS['timedate']->get_cal_date_time_format()); // handle building index selector global $dictionary, $current_language; // show notes if ( $this->bean instanceof Person ) $module_key = "LBL_CONTACTS_NOTE_"; elseif ( $this->bean instanceof Company ) $module_key = "LBL_ACCOUNTS_NOTE_"; else $module_key = "LBL_".strtoupper($_REQUEST['import_module'])."_NOTE_"; $notetext = ''; for ($i = 1;isset($mod_strings[$module_key.$i]);$i++) { $notetext .= '