diff --git a/sources/Service/Import/CSVImportPageProcessor.php b/sources/Service/Import/CSVImportPageProcessor.php
index 0089a110f..1f75fa963 100644
--- a/sources/Service/Import/CSVImportPageProcessor.php
+++ b/sources/Service/Import/CSVImportPageProcessor.php
@@ -78,396 +78,396 @@ class CSVImportPageProcessor
* @throws ReflectionException
* @throws Exception
*/
- public static function ProcessData(
- mixed $iBoxSkipLines, mixed $iNbSkippedLines, mixed $sDateTimeFormat, mixed $sCustomDateTimeFormat, mixed $sClassName, WebPage $oPage, $aSynchroUpdate, mixed $sCSVData, mixed $sSeparator,
- mixed $sTextQualifier, bool $bHeaderLine, array $aResult, mixed $aSearchFields, mixed $aFieldsMapping,
- bool $bSimulate, mixed $sCSVDataTruncated, int $iCurrentStep, mixed $sEncoding, mixed $bAdvanced, mixed $sSynchroScope
- ): ?array
- {
- $iSkippedLines = 0;
- if ($iBoxSkipLines == 1) {
- $iSkippedLines = $iNbSkippedLines;
- }
- $sChosenDateFormat = ($sDateTimeFormat == 'default') ? (string)AttributeDateTime::GetFormat() : $sCustomDateTimeFormat;
+ public static function ProcessData(
+ mixed $iBoxSkipLines, mixed $iNbSkippedLines, mixed $sDateTimeFormat, mixed $sCustomDateTimeFormat, mixed $sClassName, WebPage $oPage, $aSynchroUpdate, mixed $sCSVData, mixed $sSeparator,
+ mixed $sTextQualifier, bool $bHeaderLine, array $aResult, mixed $aSearchFields, mixed $aFieldsMapping,
+ bool $bSimulate, mixed $sCSVDataTruncated, int $iCurrentStep, mixed $sEncoding, mixed $bAdvanced, mixed $sSynchroScope
+ ): ?array
+ {
+ $iSkippedLines = 0;
+ if ($iBoxSkipLines == 1) {
+ $iSkippedLines = $iNbSkippedLines;
+ }
+ $sChosenDateFormat = ($sDateTimeFormat == 'default') ? (string)AttributeDateTime::GetFormat() : $sCustomDateTimeFormat;
- if (!empty($sSynchroScope)) {
- $oSearch = DBObjectSearch::FromOQL($sSynchroScope);
- $sClassName = $oSearch->GetClass(); // If a synchronization scope is set, then the class is fixed !
- $oSet = new DBObjectSet($oSearch);
- $iCount = $oSet->Count();
- DisplaySynchroBanner($oPage, $sClassName, $iCount);
- } else {
- $sSynchroScope = '';
- $aSynchroUpdate = null;
- }
+ if (!empty($sSynchroScope)) {
+ $oSearch = DBObjectSearch::FromOQL($sSynchroScope);
+ $sClassName = $oSearch->GetClass(); // If a synchronization scope is set, then the class is fixed !
+ $oSet = new DBObjectSet($oSearch);
+ $iCount = $oSet->Count();
+ DisplaySynchroBanner($oPage, $sClassName, $iCount);
+ } else {
+ $sSynchroScope = '';
+ $aSynchroUpdate = null;
+ }
- // Parse the data set
- $oCSVParser = new CSVParser($sCSVData, $sSeparator, $sTextQualifier, MetaModel::GetConfig()->Get('max_execution_time_per_loop'));
- $aData = $oCSVParser->ToArray($iSkippedLines);
- $iRealSkippedLines = $iSkippedLines;
- if ($bHeaderLine) {
- $aResult[] = $sTextQualifier . implode($sTextQualifier . $sSeparator . $sTextQualifier, array_shift($aData)) . $sTextQualifier; // Remove the first line and store it in case of error
- $iRealSkippedLines++;
- }
+ // Parse the data set
+ $oCSVParser = new CSVParser($sCSVData, $sSeparator, $sTextQualifier, MetaModel::GetConfig()->Get('max_execution_time_per_loop'));
+ $aData = $oCSVParser->ToArray($iSkippedLines);
+ $iRealSkippedLines = $iSkippedLines;
+ if ($bHeaderLine) {
+ $aResult[] = $sTextQualifier . implode($sTextQualifier . $sSeparator . $sTextQualifier, array_shift($aData)) . $sTextQualifier; // Remove the first line and store it in case of error
+ $iRealSkippedLines++;
+ }
- // Format for the line numbers
- $sMaxLen = (strlen('' . count($aData)) < 3) ? 3 : strlen('' . count($aData)); // Pad line numbers to the appropriate number of chars, but at least 3
+ // Format for the line numbers
+ $sMaxLen = (strlen('' . count($aData)) < 3) ? 3 : strlen('' . count($aData)); // Pad line numbers to the appropriate number of chars, but at least 3
- // Compute the list of search/reconciliation criteria
- $aSearchKeys = [];
- foreach ($aSearchFields as $index => $sDummy) {
- $sSearchField = $aFieldsMapping[$index];
- $aMatches = [];
- if (preg_match('/(.+)->(.+)/', $sSearchField, $aMatches) > 0) {
- $sSearchField = $aMatches[1];
- $aSearchKeys[$aMatches[1]] = '';
- } else {
- $aSearchKeys[$sSearchField] = '';
- }
- if (!MetaModel::IsValidFilterCode($sClassName, $sSearchField)) {
- // Remove invalid or unmapped search fields
- $aSearchFields[$index] = null;
- unset($aSearchKeys[$sSearchField]);
- }
- }
+ // Compute the list of search/reconciliation criteria
+ $aSearchKeys = [];
+ foreach ($aSearchFields as $index => $sDummy) {
+ $sSearchField = $aFieldsMapping[$index];
+ $aMatches = [];
+ if (preg_match('/(.+)->(.+)/', $sSearchField, $aMatches) > 0) {
+ $sSearchField = $aMatches[1];
+ $aSearchKeys[$aMatches[1]] = '';
+ } else {
+ $aSearchKeys[$sSearchField] = '';
+ }
+ if (!MetaModel::IsValidFilterCode($sClassName, $sSearchField)) {
+ // Remove invalid or unmapped search fields
+ $aSearchFields[$index] = null;
+ unset($aSearchKeys[$sSearchField]);
+ }
+ }
- // Compute the list of fields and external keys to process
- $aExtKeys = [];
- $aAttributes = [];
- $aExternalKeysByColumn = [];
- foreach ($aFieldsMapping as $iNumber => $sAttCode) {
- $iIndex = $iNumber - 1;
- if (!empty($sAttCode) && ($sAttCode != ':none:') && ($sAttCode != 'finalclass')) {
- if (preg_match('/(.+)->(.+)/', $sAttCode, $aMatches) > 0) {
- $sAttribute = $aMatches[1];
- $sField = $aMatches[2];
- $aExtKeys[$sAttribute][$sField] = $iIndex;
- $aExternalKeysByColumn[$iIndex] = $sAttribute;
- } else {
- if ($sAttCode == 'id') {
- $aAttributes['id'] = $iIndex;
- } else {
- $oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
- if ($oAttDef->IsExternalKey()) {
- $aExtKeys[$sAttCode]['id'] = $iIndex;
- $aExternalKeysByColumn[$iIndex] = $sAttCode;
- } else {
- $aAttributes[$sAttCode] = $iIndex;
- }
- }
- }
- }
- }
+ // Compute the list of fields and external keys to process
+ $aExtKeys = [];
+ $aAttributes = [];
+ $aExternalKeysByColumn = [];
+ foreach ($aFieldsMapping as $iNumber => $sAttCode) {
+ $iIndex = $iNumber - 1;
+ if (!empty($sAttCode) && ($sAttCode != ':none:') && ($sAttCode != 'finalclass')) {
+ if (preg_match('/(.+)->(.+)/', $sAttCode, $aMatches) > 0) {
+ $sAttribute = $aMatches[1];
+ $sField = $aMatches[2];
+ $aExtKeys[$sAttribute][$sField] = $iIndex;
+ $aExternalKeysByColumn[$iIndex] = $sAttribute;
+ } else {
+ if ($sAttCode == 'id') {
+ $aAttributes['id'] = $iIndex;
+ } else {
+ $oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
+ if ($oAttDef->IsExternalKey()) {
+ $aExtKeys[$sAttCode]['id'] = $iIndex;
+ $aExternalKeysByColumn[$iIndex] = $sAttCode;
+ } else {
+ $aAttributes[$sAttCode] = $iIndex;
+ }
+ }
+ }
+ }
+ }
- $oMyChange = null;
- if (!$bSimulate) {
- // We're doing it for real, let's create a change
- $sUserString = CMDBChange::GetCurrentUserName() . ' (CSV)';
- CMDBObject::SetCurrentChangeFromParams($sUserString, CMDBChangeOrigin::CSV_INTERACTIVE);
- $oMyChange = CMDBObject::GetCurrentChange();
- }
+ $oMyChange = null;
+ if (!$bSimulate) {
+ // We're doing it for real, let's create a change
+ $sUserString = CMDBChange::GetCurrentUserName() . ' (CSV)';
+ CMDBObject::SetCurrentChangeFromParams($sUserString, CMDBChangeOrigin::CSV_INTERACTIVE);
+ $oMyChange = CMDBObject::GetCurrentChange();
+ }
- $oBulk = new BulkChange(
- $sClassName,
- $aData,
- $aAttributes,
- $aExtKeys,
- array_keys($aSearchKeys),
- empty($sSynchroScope) ? null : $sSynchroScope,
- $aSynchroUpdate,
- $sChosenDateFormat, // date format
- true // localize
- );
+ $oBulk = new BulkChange(
+ $sClassName,
+ $aData,
+ $aAttributes,
+ $aExtKeys,
+ array_keys($aSearchKeys),
+ empty($sSynchroScope) ? null : $sSynchroScope,
+ $aSynchroUpdate,
+ $sChosenDateFormat, // date format
+ true // localize
+ );
- $oPage->AddSubBlock(InputUIBlockFactory::MakeForHidden("csvdata_truncated", $sCSVDataTruncated, "csvdata_truncated"));
- $aRes = $oBulk->Process($oMyChange);
+ $oPage->AddSubBlock(InputUIBlockFactory::MakeForHidden("csvdata_truncated", $sCSVDataTruncated, "csvdata_truncated"));
+ $aRes = $oBulk->Process($oMyChange);
- $aColumns = [];
- $aColumns ["line"] = ["label" => "Line"];
- $aColumns ["status"] = ["label" => "Status"];
- $aColumns ["object"] = ["label" => "Object"];
- foreach ($aFieldsMapping as $sAttCode) {
- if (!empty($sAttCode) && ($sAttCode != ':none:') && ($sAttCode != 'finalclass')) {
- $aColumns[$sClassName . '/' . $sAttCode] = ["label" => MetaModel::GetLabel($sClassName, $sAttCode)];
- }
- }
- $aColumns["message"] = ["label" => "Message"];
+ $aColumns = [];
+ $aColumns ["line"] = ["label" => "Line"];
+ $aColumns ["status"] = ["label" => "Status"];
+ $aColumns ["object"] = ["label" => "Object"];
+ foreach ($aFieldsMapping as $sAttCode) {
+ if (!empty($sAttCode) && ($sAttCode != ':none:') && ($sAttCode != 'finalclass')) {
+ $aColumns[$sClassName . '/' . $sAttCode] = ["label" => MetaModel::GetLabel($sClassName, $sAttCode)];
+ }
+ }
+ $aColumns["message"] = ["label" => "Message"];
- $iErrors = 0;
- $iCreated = 0;
- $iModified = 0;
+ $iErrors = 0;
+ $iCreated = 0;
+ $iModified = 0;
- $aTableData = [];
- $sAppRootUrl = utils::GetAbsoluteUrlAppRoot();
+ $aTableData = [];
+ $sAppRootUrl = utils::GetAbsoluteUrlAppRoot();
- foreach ($aRes as $iLine => $aResRow) {
+ foreach ($aRes as $iLine => $aResRow) {
/** @var string[]|CellChangeSpec[] $aResRow */
- $aTableRow = [];
- $oStatus = $aResRow['__STATUS__'];
- $sUrl = '';
- $sMessage = '';
- $sCSSRowClass = '';
- $sCSSMessageClass = 'cell_ok';
- switch (get_class($oStatus)) {
- case 'RowStatus_NoChange':
- $sFinalClass = $aResRow['finalclass'];
- $oObj = MetaModel::GetObject($sFinalClass, $aResRow['id']->GetPureValue());
- $sUrl = $oObj->GetHyperlink();
- $sStatus = '
';
- $sCSSRowClass = 'ibo-csv-import--row-unchanged';
- break;
+ $aTableRow = [];
+ $oStatus = $aResRow['__STATUS__'];
+ $sUrl = '';
+ $sMessage = '';
+ $sCSSRowClass = '';
+ $sCSSMessageClass = 'cell_ok';
+ switch (get_class($oStatus)) {
+ case 'RowStatus_NoChange':
+ $sFinalClass = $aResRow['finalclass'];
+ $oObj = MetaModel::GetObject($sFinalClass, $aResRow['id']->GetPureValue());
+ $sUrl = $oObj->GetHyperlink();
+ $sStatus = '
';
+ $sCSSRowClass = 'ibo-csv-import--row-unchanged';
+ break;
- case 'RowStatus_Modify':
- $iModified++;
- $sFinalClass = $aResRow['finalclass'];
- $oObj = MetaModel::GetObject($sFinalClass, $aResRow['id']->GetPureValue());
- $sUrl = $oObj->GetHyperlink();
- $sStatus = '
';
- $sCSSRowClass = 'ibo-csv-import--row-modified';
- break;
+ case 'RowStatus_Modify':
+ $iModified++;
+ $sFinalClass = $aResRow['finalclass'];
+ $oObj = MetaModel::GetObject($sFinalClass, $aResRow['id']->GetPureValue());
+ $sUrl = $oObj->GetHyperlink();
+ $sStatus = '
';
+ $sCSSRowClass = 'ibo-csv-import--row-modified';
+ break;
- case 'RowStatus_Disappeared':
- $iModified++;
- $sFinalClass = $aResRow['finalclass'];
- $oObj = MetaModel::GetObject($sFinalClass, $aResRow['id']->GetPureValue());
- $sUrl = $oObj->GetHyperlink();
- $sStatus = '
';
- $sCSSRowClass = 'ibo-csv-import--row-modified';
- if ($bSimulate) {
- $sMessage = Dict::S('UI:CSVReport-Object-MissingToUpdate');
- } else {
- $sMessage = Dict::S('UI:CSVReport-Object-MissingUpdated');
- }
- break;
+ case 'RowStatus_Disappeared':
+ $iModified++;
+ $sFinalClass = $aResRow['finalclass'];
+ $oObj = MetaModel::GetObject($sFinalClass, $aResRow['id']->GetPureValue());
+ $sUrl = $oObj->GetHyperlink();
+ $sStatus = '
';
+ $sCSSRowClass = 'ibo-csv-import--row-modified';
+ if ($bSimulate) {
+ $sMessage = Dict::S('UI:CSVReport-Object-MissingToUpdate');
+ } else {
+ $sMessage = Dict::S('UI:CSVReport-Object-MissingUpdated');
+ }
+ break;
- case 'RowStatus_NewObj':
- $iCreated++;
- $sStatus = '
';
- $sCSSRowClass = 'ibo-csv-import--row-added';
- if ($bSimulate) {
- $sMessage = Dict::S('UI:CSVReport-Object-ToCreate');
- } else {
- $sFinalClass = $aResRow['finalclass'];
- $oObj = MetaModel::GetObject($sFinalClass, $aResRow['id']->GetPureValue());
- $sUrl = $oObj->GetHyperlink();
- $sMessage = Dict::S('UI:CSVReport-Object-Created');
- }
- break;
+ case 'RowStatus_NewObj':
+ $iCreated++;
+ $sStatus = '
';
+ $sCSSRowClass = 'ibo-csv-import--row-added';
+ if ($bSimulate) {
+ $sMessage = Dict::S('UI:CSVReport-Object-ToCreate');
+ } else {
+ $sFinalClass = $aResRow['finalclass'];
+ $oObj = MetaModel::GetObject($sFinalClass, $aResRow['id']->GetPureValue());
+ $sUrl = $oObj->GetHyperlink();
+ $sMessage = Dict::S('UI:CSVReport-Object-Created');
+ }
+ break;
- case 'RowStatus_Issue':
- $iErrors++;
- $sMessage = self::GetDivAlert($oStatus->GetDescription());
- $sStatus = '
' . sprintf($aDisplayFilters['unchanged'], $iUnchanged), '', "1", "show_unchanged", "checkbox");
- $oCheckBoxUnchanged->GetInput()->SetIsChecked(true);
- $oCheckBoxUnchanged->SetBeforeInput(false);
- $oCheckBoxUnchanged->GetInput()->AddCSSClass('ibo-input-checkbox');
- $oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oCheckBoxUnchanged));
- $oPage->add_ready_script("$('#show_unchanged').on('click', function(){ToggleRows('ibo-csv-import--row-unchanged')})");
+ $oCheckBoxUnchanged = InputUIBlockFactory::MakeForInputWithLabel('
' . sprintf($aDisplayFilters['unchanged'], $iUnchanged), '', "1", "show_unchanged", "checkbox");
+ $oCheckBoxUnchanged->GetInput()->SetIsChecked(true);
+ $oCheckBoxUnchanged->SetBeforeInput(false);
+ $oCheckBoxUnchanged->GetInput()->AddCSSClass('ibo-input-checkbox');
+ $oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oCheckBoxUnchanged));
+ $oPage->add_ready_script("$('#show_unchanged').on('click', function(){ToggleRows('ibo-csv-import--row-unchanged')})");
- $oCheckBoxUnchanged = InputUIBlockFactory::MakeForInputWithLabel('
' . sprintf($aDisplayFilters['modified'], $iModified), '', "1", "show_modified", "checkbox");
- $oCheckBoxUnchanged->GetInput()->SetIsChecked(true);
- $oCheckBoxUnchanged->SetBeforeInput(false);
- $oCheckBoxUnchanged->GetInput()->AddCSSClass('ibo-input-checkbox');
- $oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oCheckBoxUnchanged));
- $oPage->add_ready_script("$('#show_modified').on('click', function(){ToggleRows('ibo-csv-import--row-modified')})");
+ $oCheckBoxUnchanged = InputUIBlockFactory::MakeForInputWithLabel('
' . sprintf($aDisplayFilters['modified'], $iModified), '', "1", "show_modified", "checkbox");
+ $oCheckBoxUnchanged->GetInput()->SetIsChecked(true);
+ $oCheckBoxUnchanged->SetBeforeInput(false);
+ $oCheckBoxUnchanged->GetInput()->AddCSSClass('ibo-input-checkbox');
+ $oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oCheckBoxUnchanged));
+ $oPage->add_ready_script("$('#show_modified').on('click', function(){ToggleRows('ibo-csv-import--row-modified')})");
- $oCheckBoxUnchanged = InputUIBlockFactory::MakeForInputWithLabel('
' . sprintf($aDisplayFilters['added'], $iCreated), '', "1", "show_created", "checkbox");
- $oCheckBoxUnchanged->GetInput()->SetIsChecked(true);
- $oCheckBoxUnchanged->SetBeforeInput(false);
- $oCheckBoxUnchanged->GetInput()->AddCSSClass('ibo-input-checkbox');
- $oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oCheckBoxUnchanged));
- $oPage->add_ready_script("$('#show_created').on('click', function(){ToggleRows('ibo-csv-import--row-added')})");
+ $oCheckBoxUnchanged = InputUIBlockFactory::MakeForInputWithLabel('
' . sprintf($aDisplayFilters['added'], $iCreated), '', "1", "show_created", "checkbox");
+ $oCheckBoxUnchanged->GetInput()->SetIsChecked(true);
+ $oCheckBoxUnchanged->SetBeforeInput(false);
+ $oCheckBoxUnchanged->GetInput()->AddCSSClass('ibo-input-checkbox');
+ $oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oCheckBoxUnchanged));
+ $oPage->add_ready_script("$('#show_created').on('click', function(){ToggleRows('ibo-csv-import--row-added')})");
- $oCheckBoxUnchanged = InputUIBlockFactory::MakeForInputWithLabel(' ' . sprintf($aDisplayFilters['errors'], $iErrors) . '', '', "1", "show_errors", "checkbox");
- $oCheckBoxUnchanged->GetInput()->SetIsChecked(true);
- $oCheckBoxUnchanged->SetBeforeInput(false);
- $oCheckBoxUnchanged->GetInput()->AddCSSClass('ibo-input-checkbox');
- $oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oCheckBoxUnchanged));
- $oPage->add_ready_script("$('#show_errors').on('click', function(){ToggleRows('ibo-csv-import--row-error')})");
+ $oCheckBoxUnchanged = InputUIBlockFactory::MakeForInputWithLabel(' ' . sprintf($aDisplayFilters['errors'], $iErrors) . '', '', "1", "show_errors", "checkbox");
+ $oCheckBoxUnchanged->GetInput()->SetIsChecked(true);
+ $oCheckBoxUnchanged->SetBeforeInput(false);
+ $oCheckBoxUnchanged->GetInput()->AddCSSClass('ibo-input-checkbox');
+ $oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oCheckBoxUnchanged));
+ $oPage->add_ready_script("$('#show_errors').on('click', function(){ToggleRows('ibo-csv-import--row-error')})");
- $oPanel = PanelUIBlockFactory::MakeNeutral('');
- $oPanel->AddCSSClasses(['ibo-datatable-panel', 'mb-5']);
- $oForm->AddSubBlock($oPanel);
+ $oPanel = PanelUIBlockFactory::MakeNeutral('');
+ $oPanel->AddCSSClasses(['ibo-datatable-panel', 'mb-5']);
+ $oForm->AddSubBlock($oPanel);
- $oTable = DataTableUIBlockFactory::MakeForForm("csvImport", $aColumns, $aTableData);
- $oTable->AddOption('bFullscreen', true);
- $oPanel->AddSubBlock($oTable);
+ $oTable = DataTableUIBlockFactory::MakeForForm("csvImport", $aColumns, $aTableData);
+ $oTable->AddOption('bFullscreen', true);
+ $oPanel->AddSubBlock($oTable);
- if ($bSimulate) {
- $oForm->AddSubBlock(ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Restart'))->SetOnClickJsCode("CSVRestart()"));
- }
- $oForm->AddSubBlock(ButtonUIBlockFactory::MakeForSecondaryAction(Dict::S('UI:Button:Back'))->SetOnClickJsCode("CSVGoBack()"));
+ if ($bSimulate) {
+ $oForm->AddSubBlock(ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Restart'))->SetOnClickJsCode("CSVRestart()"));
+ }
+ $oForm->AddSubBlock(ButtonUIBlockFactory::MakeForSecondaryAction(Dict::S('UI:Button:Back'))->SetOnClickJsCode("CSVGoBack()"));
- $bShouldConfirm = false;
- if ($bSimulate) {
- // if there are *too many* changes, we should ask the user for a confirmation
- if (count($aRes) >= MetaModel::GetConfig()->Get('csv_import_min_object_confirmation')) {
- $fErrorsPercentage = (100.0 * $iErrors) / count($aRes);
- if ($fErrorsPercentage >= MetaModel::GetConfig()->Get('csv_import_errors_percentage')) {
- $sConfirmationMessage = Dict::Format('UI:CSVReport-Stats-Errors', $fErrorsPercentage);
- $bShouldConfirm = true;
- }
- $fCreatedPercentage = (100.0 * $iCreated) / count($aRes);
- if ($fCreatedPercentage >= MetaModel::GetConfig()->Get('csv_import_creations_percentage')) {
- $sConfirmationMessage = Dict::Format('UI:CSVReport-Stats-Created', $fCreatedPercentage);
- $bShouldConfirm = true;
- }
- $fModifiedPercentage = (100.0 * $iModified) / count($aRes);
- if ($fModifiedPercentage >= MetaModel::GetConfig()->Get('csv_import_modifications_percentage')) {
- $sConfirmationMessage = Dict::Format('UI:CSVReport-Stats-Modified', $fModifiedPercentage);
- $bShouldConfirm = true;
- }
+ $bShouldConfirm = false;
+ if ($bSimulate) {
+ // if there are *too many* changes, we should ask the user for a confirmation
+ if (count($aRes) >= MetaModel::GetConfig()->Get('csv_import_min_object_confirmation')) {
+ $fErrorsPercentage = (100.0 * $iErrors) / count($aRes);
+ if ($fErrorsPercentage >= MetaModel::GetConfig()->Get('csv_import_errors_percentage')) {
+ $sConfirmationMessage = Dict::Format('UI:CSVReport-Stats-Errors', $fErrorsPercentage);
+ $bShouldConfirm = true;
+ }
+ $fCreatedPercentage = (100.0 * $iCreated) / count($aRes);
+ if ($fCreatedPercentage >= MetaModel::GetConfig()->Get('csv_import_creations_percentage')) {
+ $sConfirmationMessage = Dict::Format('UI:CSVReport-Stats-Created', $fCreatedPercentage);
+ $bShouldConfirm = true;
+ }
+ $fModifiedPercentage = (100.0 * $iModified) / count($aRes);
+ if ($fModifiedPercentage >= MetaModel::GetConfig()->Get('csv_import_modifications_percentage')) {
+ $sConfirmationMessage = Dict::Format('UI:CSVReport-Stats-Modified', $fModifiedPercentage);
+ $bShouldConfirm = true;
+ }
- }
- $sConfirm = $bShouldConfirm ? 'true' : 'false';
- $oForm->AddSubBlock(ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:DoImport'))->SetOnClickJsCode("return DoSubmit($sConfirm)"));
+ }
+ $sConfirm = $bShouldConfirm ? 'true' : 'false';
+ $oForm->AddSubBlock(ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:DoImport'))->SetOnClickJsCode("return DoSubmit($sConfirm)"));
- } else {
- $oForm->AddSubBlock(ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Done'), "", "", true));
- }
+ } else {
+ $oForm->AddSubBlock(ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Done'), "", "", true));
+ }
- if ($bShouldConfirm) {
- $sYesButton = Dict::S('UI:Button:Ok');
- $sNoButton = Dict::S('UI:Button:Cancel');
- $oDlg = UIContentBlockUIBlockFactory::MakeStandard("dlg_confirmation")->SetHasForcedDiv(true);
- $oPage->AddSubBlock($oDlg);
- $oDlg->AddSubBlock(new Html($sConfirmationMessage));
- $oDlg->AddSubBlock(new Html(utils::EscapeHtml(Dict::S('UI:CSVImportConfirmMessage'))));
+ if ($bShouldConfirm) {
+ $sYesButton = Dict::S('UI:Button:Ok');
+ $sNoButton = Dict::S('UI:Button:Cancel');
+ $oDlg = UIContentBlockUIBlockFactory::MakeStandard("dlg_confirmation")->SetHasForcedDiv(true);
+ $oPage->AddSubBlock($oDlg);
+ $oDlg->AddSubBlock(new Html($sConfirmationMessage));
+ $oDlg->AddSubBlock(new Html(utils::EscapeHtml(Dict::S('UI:CSVImportConfirmMessage'))));
- $oDlgConfirm = UIContentBlockUIBlockFactory::MakeStandard("confirmation_chart")->SetHasForcedDiv(true);
- $oDlg->AddSubBlock($oDlgConfirm);
+ $oDlgConfirm = UIContentBlockUIBlockFactory::MakeStandard("confirmation_chart")->SetHasForcedDiv(true);
+ $oDlg->AddSubBlock($oDlgConfirm);
- $sDlgTitle = Dict::S('UI:CSVImportConfirmTitle');
+ $sDlgTitle = Dict::S('UI:CSVImportConfirmTitle');
- $oPage->add_ready_script(
- <<