Dict::S('UI:CSVImport:MappingSelectOne')); $aChoices[':none:'] = Dict::S('UI:CSVImport:MappingNotApplicable'); if ($bAdvancedMode) { $aChoices['id'] = Dict::S('UI:CSVImport:idField'); } foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode => $oAttDef) { if ($oAttDef->IsExternalKey()) { $aChoices[$sAttCode] = $oAttDef->GetLabel(); // Get fields of the external class that are considered as reconciliation keys $sTargetClass = $oAttDef->GetTargetClass(); foreach(MetaModel::ListAttributeDefs($sTargetClass) as $sTargetAttCode => $oTargetAttDef) { if (MetaModel::IsReconcKey($sTargetClass, $sTargetAttCode)) { $aChoices[$sAttCode.'->'.$sTargetAttCode] = $oAttDef->GetLabel().'->'.$oTargetAttDef->GetLabel(); } } } else if ($oAttDef->IsWritable()) { $aChoices[$sAttCode] = $oAttDef->GetLabel(); } } asort($aChoices); $sHtml = "\n"; return $sHtml; } require_once('../application/startup.inc.php'); session_start(); if (isset($_SESSION['auth_user'])) { $sAuthUser = $_SESSION['auth_user']; $sAuthPwd = $_SESSION['auth_pwd']; // Attempt to login, fails silently UserRights::Login($sAuthUser, $sAuthPwd); } else { // No session information echo "

No session information

\n"; } $oContext = new UserContext(); $sOperation = utils::ReadParam('operation', ''); switch($sOperation) { case 'parser_preview': $oPage = new ajax_page(""); $oPage->no_cache(); $sSeparator = utils::ReadParam('separator', ','); if ($sSeparator == 'tab') $sSeparator = "\t"; $sTextQualifier = utils::ReadParam('qualifier', '"'); $iLinesToSkip = utils::ReadParam('nb_lines_skipped', 0); $bFirstLineAsHeader = utils::ReadParam('header_line', true); $sData = stripslashes(utils::ReadParam('csvdata', true)); $oCSVParser = new CSVParser($sData, $sSeparator, $sTextQualifier); $aData = $oCSVParser->ToArray($iLinesToSkip); $iTarget = count($aData); if ($iTarget == 0) { $oPage->p(Dict::S('UI:CSVImport:NoData')); } else { $sMaxLen = (strlen(''.$iTarget) < 3) ? 3 : strlen(''.$iTarget); // Pad line numbers to the appropriate number of chars, but at least 3 $sFormat = '%0'.$sMaxLen.'d'; $oPage->p("

".Dict::S('UI:Title:DataPreview')."

\n"); $oPage->p("
\n"); $oPage->add(""); $iMaxIndex= 10; // Display maximum 10 lines for the preview $index = 1; foreach($aData as $aRow) { $sCSSClass = 'csv_row'.($index % 2); if ( ($bFirstLineAsHeader) && ($index == 1)) { $oPage->add("\n"); $iNbCols = count($aRow); } else { if ($index == 1) $iNbCols = count($aRow); $oPage->add("\n"); } $index++; if ($index > $iMaxIndex) break; } $oPage->add("
".sprintf($sFormat, $index).""); $oPage->add(implode('', $aRow)); $oPage->add("
".sprintf($sFormat, $index).""); $oPage->add(implode('', $aRow)); $oPage->add("
\n"); $oPage->add("
\n"); if($iNbCols == 1) { $oPage->p(' '.Dict::S('UI:CSVImport:ErrorOnlyOneColumn')); } else { $oPage->p(' '); } } break; case 'display_mapping_form': $oPage = new ajax_page(""); $oPage->no_cache(); $sSeparator = utils::ReadParam('separator', ','); $sTextQualifier = utils::ReadParam('qualifier', '"'); $iLinesToSkip = utils::ReadParam('nb_lines_skipped', 0); $bFirstLineAsHeader = utils::ReadParam('header_line', true); $sData = stripslashes(utils::ReadParam('csvdata', true)); $sClassName = utils::ReadParam('class_name', ''); $bAdvanced = utils::ReadParam('advanced', false); $oCSVParser = new CSVParser($sData, $sSeparator, $sTextQualifier); $aData = $oCSVParser->ToArray($iLinesToSkip); $iTarget = count($aData); if ($iTarget == 0) { $oPage->p(Dict::S('UI:CSVImport:NoData')); } else { $oPage->add(""); $index = 1; $aFirstLine = $aData[0]; // Use the first row to determine the number of columns $iStartLine = 0; $iNbColumns = count($aFirstLine); if ($bFirstLineAsHeader) { $iStartLine = 1; foreach($aFirstLine as $sField) { $aHeader[] = $sField; } } else { // Build some conventional name for the fields: field1...fieldn $index= 1; foreach($aFirstLine as $sField) { $aHeader[] = Dict::Format('UI:CSVImport:FieldName', $index); $index++; } } $oPage->add("
\n"); $oPage->add(''); $oPage->add(''); $oPage->add(''); foreach($aHeader as $sField) { $oPage->add(''); $oPage->add(""); $oPage->add(''); $oPage->add(''); $oPage->add(''); $oPage->add(''); $oPage->add(''); $oPage->add(''); $index++; } $oPage->add("
'.Dict::S('UI:CSVImport:HeaderFields').''.Dict::S('UI:CSVImport:HeaderMappings').' '.Dict::S('UI:CSVImport:HeaderSearch').''.Dict::S('UI:CSVImport:DataLine1').''.Dict::S('UI:CSVImport:DataLine2').'
$sField'.GetMappingForField($sClassName, $sField, $index, $bAdvanced).' '.(isset($aData[$iStartLine][$index-1]) ? htmlentities($aData[$iStartLine][$index-1], ENT_QUOTES, 'UTF-8') : ' ').''.(isset($aData[$iStartLine+1][$index-1]) ? htmlentities($aData[$iStartLine+1][$index-1], ENT_QUOTES, 'UTF-8') : ' ').'
\n"); $aReconciliationKeys = MetaModel::GetReconcKeys($sClassName); $sDefaultKeys = '"'.implode('", "',$aReconciliationKeys).'"'; $oPage->add_ready_script( <<AddCondition('id', 0); // Make sure we create an empty set $oSet = new CMDBObjectSet($oSearch); $sResult = cmdbAbstractObject::GetSetAsCSV($oSet); //$aCSV = explode("\n", $sCSV); // If there are more than one line, let's assume that the first line is a comment and skip it. //if (count($aCSV) > 1) //{ // $sResult = $aCSV[0]; //} //else //{ // $sResult = $sCSV; //} $sClassDisplayName = MetaModel::GetName($sClassName); $sDisposition = utils::ReadParam('disposition', 'inline'); if ($sDisposition == 'attachment') { $oPage = new CSVPage(""); $oPage->add_header("Content-disposition: attachment; filename=\"{$sClassDisplayName}.csv\""); $oPage->no_cache(); $oPage->add($sResult); } else { $oPage = new ajax_page(""); $oPage->no_cache(); $oPage->add('


'.$sClassDisplayName.'.csv

'); $oPage->add('

'); } break; } $oPage->output(); ?>