Skip to content

Commit 73d01ae

Browse files
committed
Merge remote-tracking branch 'magento-l3/ACP2E-1620' into APR222023_PR_sarmistha
2 parents 175706d + 1720c0d commit 73d01ae

File tree

2 files changed

+206
-64
lines changed

2 files changed

+206
-64
lines changed

app/code/Magento/ImportExport/Controller/Adminhtml/ImportResult.php

Lines changed: 41 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -5,105 +5,95 @@
55
*/
66
namespace Magento\ImportExport\Controller\Adminhtml;
77

8-
use Magento\Backend\App\Action;
9-
use Magento\ImportExport\Model\Import\Entity\AbstractEntity;
8+
use Magento\Backend\App\Action\Context;
9+
use Magento\Framework\View\Element\AbstractBlock;
10+
use Magento\ImportExport\Helper\Report;
11+
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError;
1012
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
1113
use Magento\ImportExport\Model\History as ModelHistory;
1214
use Magento\Framework\Escaper;
1315
use Magento\Framework\App\ObjectManager;
16+
use Magento\ImportExport\Model\Import\RenderErrorMessages;
17+
use Magento\ImportExport\Model\Report\ReportProcessorInterface;
1418

1519
/**
1620
* Import controller
1721
*/
1822
abstract class ImportResult extends Import
1923
{
20-
const IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE = '*/history/download';
24+
public const IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE = '*/history/download';
2125

2226
/**
2327
* Limit view errors
2428
*/
25-
const LIMIT_ERRORS_MESSAGE = 100;
29+
public const LIMIT_ERRORS_MESSAGE = 100;
2630

2731
/**
28-
* @var \Magento\ImportExport\Model\Report\ReportProcessorInterface
32+
* @var ReportProcessorInterface
2933
*/
30-
protected $reportProcessor;
34+
protected ReportProcessorInterface $reportProcessor;
3135

3236
/**
33-
* @var \Magento\ImportExport\Model\History
37+
* @var ModelHistory
3438
*/
35-
protected $historyModel;
39+
protected ModelHistory $historyModel;
3640

3741
/**
38-
* @var \Magento\ImportExport\Helper\Report
42+
* @var Report
3943
*/
40-
protected $reportHelper;
44+
protected Report $reportHelper;
4145

4246
/**
4347
* @var Escaper|null
4448
*/
4549
protected $escaper;
4650

4751
/**
48-
* @param \Magento\Backend\App\Action\Context $context
49-
* @param \Magento\ImportExport\Model\Report\ReportProcessorInterface $reportProcessor
50-
* @param \Magento\ImportExport\Model\History $historyModel
51-
* @param \Magento\ImportExport\Helper\Report $reportHelper
52+
* @var RenderErrorMessages
53+
*/
54+
private RenderErrorMessages $renderErrorMessages;
55+
56+
/**
57+
* @param Context $context
58+
* @param ReportProcessorInterface $reportProcessor
59+
* @param ModelHistory $historyModel
60+
* @param Report $reportHelper
5261
* @param Escaper|null $escaper
62+
* @param RenderErrorMessages|null $renderErrorMessages
5363
*/
5464
public function __construct(
55-
\Magento\Backend\App\Action\Context $context,
56-
\Magento\ImportExport\Model\Report\ReportProcessorInterface $reportProcessor,
57-
\Magento\ImportExport\Model\History $historyModel,
58-
\Magento\ImportExport\Helper\Report $reportHelper,
59-
Escaper $escaper = null
65+
Context $context,
66+
ReportProcessorInterface $reportProcessor,
67+
ModelHistory $historyModel,
68+
Report $reportHelper,
69+
Escaper $escaper = null,
70+
?RenderErrorMessages $renderErrorMessages = null
6071
) {
6172
parent::__construct($context);
6273
$this->reportProcessor = $reportProcessor;
6374
$this->historyModel = $historyModel;
6475
$this->reportHelper = $reportHelper;
6576
$this->escaper = $escaper
6677
?? ObjectManager::getInstance()->get(Escaper::class);
78+
$this->renderErrorMessages = $renderErrorMessages ??
79+
ObjectManager::getInstance()->get(RenderErrorMessages::class);
6780
}
6881

6982
/**
7083
* Add Error Messages for Import
7184
*
72-
* @param \Magento\Framework\View\Element\AbstractBlock $resultBlock
85+
* @param AbstractBlock $resultBlock
7386
* @param ProcessingErrorAggregatorInterface $errorAggregator
7487
* @return $this
7588
*/
7689
protected function addErrorMessages(
77-
\Magento\Framework\View\Element\AbstractBlock $resultBlock,
90+
AbstractBlock $resultBlock,
7891
ProcessingErrorAggregatorInterface $errorAggregator
7992
) {
8093
if ($errorAggregator->getErrorsCount()) {
81-
$message = '';
82-
$counter = 0;
83-
$escapedMessages = [];
84-
foreach ($this->getErrorMessages($errorAggregator) as $error) {
85-
$escapedMessages[] = (++$counter) . '. ' . $this->escaper->escapeHtml($error);
86-
if ($counter >= self::LIMIT_ERRORS_MESSAGE) {
87-
break;
88-
}
89-
}
90-
if ($errorAggregator->hasFatalExceptions()) {
91-
foreach ($this->getSystemExceptions($errorAggregator) as $error) {
92-
$escapedMessages[] = $this->escaper->escapeHtml($error->getErrorMessage())
93-
. ' <a href="#" onclick="$(this).next().show();$(this).hide();return false;">'
94-
. __('Show more') . '</a><div style="display:none;">' . __('Additional data') . ': '
95-
. $this->escaper->escapeHtml($error->getErrorDescription()) . '</div>';
96-
}
97-
}
9894
try {
99-
$message .= implode('<br>', $escapedMessages);
10095
$resultBlock->addNotice(
101-
'<strong>' . __('Following Error(s) has been occurred during importing process:') . '</strong><br>'
102-
. '<div class="import-error-wrapper">' . __('Only the first 100 errors are shown. ')
103-
. '<a href="'
104-
. $this->createDownloadUrlImportHistoryFile($this->createErrorReport($errorAggregator))
105-
. '">' . __('Download full report') . '</a><br>'
106-
. '<div class="import-error-list">' . $message . '</div></div>'
96+
$this->renderErrorMessages->renderMessages($errorAggregator)
10797
);
10898
} catch (\Exception $e) {
10999
foreach ($this->getErrorMessages($errorAggregator) as $errorMessage) {
@@ -118,28 +108,23 @@ protected function addErrorMessages(
118108
/**
119109
* Get all Error Messages from Import Results
120110
*
121-
* @param \Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface $errorAggregator
111+
* @param ProcessingErrorAggregatorInterface $errorAggregator
122112
* @return array
123113
*/
124114
protected function getErrorMessages(ProcessingErrorAggregatorInterface $errorAggregator)
125115
{
126-
$messages = [];
127-
$rowMessages = $errorAggregator->getRowsGroupedByErrorCode([], [AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]);
128-
foreach ($rowMessages as $errorCode => $rows) {
129-
$messages[] = $errorCode . ' ' . __('in row(s):') . ' ' . implode(', ', $rows);
130-
}
131-
return $messages;
116+
return $this->renderErrorMessages->getErrorMessages($errorAggregator);
132117
}
133118

134119
/**
135120
* Get System Generated Exception
136121
*
137122
* @param ProcessingErrorAggregatorInterface $errorAggregator
138-
* @return \Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError[]
123+
* @return ProcessingError[]
139124
*/
140125
protected function getSystemExceptions(ProcessingErrorAggregatorInterface $errorAggregator)
141126
{
142-
return $errorAggregator->getErrorsByCode([AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]);
127+
return $this->renderErrorMessages->getSystemExceptions($errorAggregator);
143128
}
144129

145130
/**
@@ -150,15 +135,7 @@ protected function getSystemExceptions(ProcessingErrorAggregatorInterface $error
150135
*/
151136
protected function createErrorReport(ProcessingErrorAggregatorInterface $errorAggregator)
152137
{
153-
$this->historyModel->loadLastInsertItem();
154-
$sourceFile = $this->reportHelper->getReportAbsolutePath($this->historyModel->getImportedFile());
155-
$writeOnlyErrorItems = true;
156-
if ($this->historyModel->getData('execution_time') == ModelHistory::IMPORT_VALIDATION) {
157-
$writeOnlyErrorItems = false;
158-
}
159-
$fileName = $this->reportProcessor->createReport($sourceFile, $errorAggregator, $writeOnlyErrorItems);
160-
$this->historyModel->addErrorReportFile($fileName);
161-
return $fileName;
138+
return $this->renderErrorMessages->createErrorReport($errorAggregator);
162139
}
163140

164141
/**
@@ -169,6 +146,6 @@ protected function createErrorReport(ProcessingErrorAggregatorInterface $errorAg
169146
*/
170147
protected function createDownloadUrlImportHistoryFile($fileName)
171148
{
172-
return $this->getUrl(self::IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE, ['filename' => $fileName]);
149+
return $this->renderErrorMessages->createDownloadUrlImportHistoryFile($fileName);
173150
}
174151
}
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\ImportExport\Model\Import;
9+
10+
use Magento\Backend\Model\UrlInterface;
11+
use Magento\Framework\App\ObjectManager;
12+
use Magento\Framework\Escaper;
13+
use Magento\ImportExport\Helper\Report;
14+
use Magento\ImportExport\Model\History as ModelHistory;
15+
use Magento\ImportExport\Model\Import\Entity\AbstractEntity;
16+
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError;
17+
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
18+
use Magento\ImportExport\Model\Report\ReportProcessorInterface;
19+
use Magento\ImportExport\Controller\Adminhtml\ImportResult;
20+
21+
/**
22+
* Import Render Error Messages Service model.
23+
*/
24+
class RenderErrorMessages
25+
{
26+
/**
27+
* @var ReportProcessorInterface
28+
*/
29+
private ReportProcessorInterface $reportProcessor;
30+
31+
/**
32+
* @var ModelHistory
33+
*/
34+
private ModelHistory $historyModel;
35+
36+
/**
37+
* @var Report
38+
*/
39+
private Report $reportHelper;
40+
41+
/**
42+
* @var Escaper|mixed
43+
*/
44+
private mixed $escaper;
45+
46+
/**
47+
* @var UrlInterface
48+
*/
49+
private mixed $backendUrl;
50+
51+
/**
52+
* @param ReportProcessorInterface $reportProcessor
53+
* @param ModelHistory $historyModel
54+
* @param Report $reportHelper
55+
* @param Escaper|null $escaper
56+
* @param UrlInterface|null $backendUrl
57+
*/
58+
public function __construct(
59+
ReportProcessorInterface $reportProcessor,
60+
ModelHistory $historyModel,
61+
Report $reportHelper,
62+
?Escaper $escaper = null,
63+
?UrlInterface $backendUrl = null
64+
) {
65+
$this->reportProcessor = $reportProcessor;
66+
$this->historyModel = $historyModel;
67+
$this->reportHelper = $reportHelper;
68+
$this->escaper = $escaper
69+
?? ObjectManager::getInstance()->get(Escaper::class);
70+
$this->backendUrl = $backendUrl
71+
?? ObjectManager::getInstance()->get(UrlInterface::class);
72+
}
73+
74+
/**
75+
* Add Error Messages for Import
76+
*
77+
* @param ProcessingErrorAggregatorInterface $errorAggregator
78+
* @return string
79+
*/
80+
public function renderMessages(
81+
ProcessingErrorAggregatorInterface $errorAggregator
82+
): string {
83+
$message = '';
84+
$counter = 0;
85+
$escapedMessages = [];
86+
foreach ($this->getErrorMessages($errorAggregator) as $error) {
87+
$escapedMessages[] = (++$counter) . '. ' . $this->escaper->escapeHtml($error);
88+
if ($counter >= ImportResult::LIMIT_ERRORS_MESSAGE) {
89+
break;
90+
}
91+
}
92+
if ($errorAggregator->hasFatalExceptions()) {
93+
foreach ($this->getSystemExceptions($errorAggregator) as $error) {
94+
$escapedMessages[] = $this->escaper->escapeHtml($error->getErrorMessage())
95+
. ' <a href="#" onclick="$(this).next().show();$(this).hide();return false;">'
96+
. __('Show more') . '</a><div style="display:none;">' . __('Additional data') . ': '
97+
. $this->escaper->escapeHtml($error->getErrorDescription()) . '</div>';
98+
}
99+
}
100+
$message .= implode('<br>', $escapedMessages);
101+
return '<strong>' . __('Following Error(s) has been occurred during importing process:') . '</strong><br>'
102+
. '<div class="import-error-wrapper">' . __('Only the first 100 errors are shown. ')
103+
. '<a href="'
104+
. $this->createDownloadUrlImportHistoryFile($this->createErrorReport($errorAggregator))
105+
. '">' . __('Download full report') . '</a><br>'
106+
. '<div class="import-error-list">' . $message . '</div></div>';
107+
}
108+
109+
/**
110+
* Get all Error Messages from Import Results
111+
*
112+
* @param ProcessingErrorAggregatorInterface $errorAggregator
113+
* @return array
114+
*/
115+
public function getErrorMessages(ProcessingErrorAggregatorInterface $errorAggregator): array
116+
{
117+
$messages = [];
118+
$rowMessages = $errorAggregator->getRowsGroupedByErrorCode([], [AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]);
119+
foreach ($rowMessages as $errorCode => $rows) {
120+
$messages[] = $errorCode . ' ' . __('in row(s):') . ' ' . implode(', ', $rows);
121+
}
122+
return $messages;
123+
}
124+
125+
/**
126+
* Get System Generated Exception
127+
*
128+
* @param ProcessingErrorAggregatorInterface $errorAggregator
129+
* @return ProcessingError[]
130+
*/
131+
public function getSystemExceptions(ProcessingErrorAggregatorInterface $errorAggregator): array
132+
{
133+
return $errorAggregator->getErrorsByCode([AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]);
134+
}
135+
136+
/**
137+
* Generate Error Report File
138+
*
139+
* @param ProcessingErrorAggregatorInterface $errorAggregator
140+
* @return string
141+
*/
142+
public function createErrorReport(ProcessingErrorAggregatorInterface $errorAggregator): string
143+
{
144+
$this->historyModel->loadLastInsertItem();
145+
$sourceFile = $this->reportHelper->getReportAbsolutePath($this->historyModel->getImportedFile());
146+
$writeOnlyErrorItems = true;
147+
if ($this->historyModel->getData('execution_time') == ModelHistory::IMPORT_VALIDATION) {
148+
$writeOnlyErrorItems = false;
149+
}
150+
$fileName = $this->reportProcessor->createReport($sourceFile, $errorAggregator, $writeOnlyErrorItems);
151+
$this->historyModel->addErrorReportFile($fileName);
152+
return $fileName;
153+
}
154+
155+
/**
156+
* Get Import History Url
157+
*
158+
* @param string $fileName
159+
* @return string
160+
*/
161+
public function createDownloadUrlImportHistoryFile($fileName): string
162+
{
163+
return $this->backendUrl->getUrl(ImportResult::IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE, ['filename' => $fileName]);
164+
}
165+
}

0 commit comments

Comments
 (0)