‪TYPO3CMS  11.5
ImportController.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Http\Message\ResponseInterface;
21 use Psr\Http\Message\ServerRequestInterface;
23 use TYPO3\CMS\Backend\Utility\BackendUtility;
36 
43 {
44  protected const ‪NO_UPLOAD = 0;
45  protected const ‪UPLOAD_DONE = 1;
46  protected const ‪UPLOAD_FAILED = 2;
47 
51  protected ‪$routeName = 'tx_impexp_import';
52 
56  protected ‪$import;
57 
77  public function ‪mainAction(ServerRequestInterface $request): ResponseInterface
78  {
79  if ($this->‪getBackendUser()->isImportEnabled() === false) {
80  throw new \RuntimeException(
81  'Import module is disabled for non admin users and '
82  . 'userTsConfig options.impexp.enableImportForNonAdminUser is not enabled.',
83  1464435459
84  );
85  }
86 
87  $this->‪main($request);
88 
89  // Input data
90  $inData = $request->getParsedBody()['tx_impexp'] ?? $request->getQueryParams()['tx_impexp'] ?? [];
91  $inData = $this->‪preprocessInputData($inData);
92 
93  // Handle upload
94  $inData = $this->‪handleUpload($request, $inData);
95 
96  // Perform import
97  $inData = $this->‪importData($inData);
98 
99  // Prepare view
101  $this->‪makeForm();
102  $this->standaloneView->assign('inData', $inData);
103  $this->standaloneView->assign('isAdmin', $this->‪getBackendUser()->isAdmin());
104  $this->standaloneView->setTemplate('Import.html');
105  $this->moduleTemplate->setContent($this->standaloneView->render());
106 
107  return new ‪HtmlResponse($this->moduleTemplate->renderContent());
108  }
109 
110  protected function ‪preprocessInputData(array $inData): array
111  {
112  if ($inData['new_import'] ?? false) {
113  unset($inData['import_mode']);
114  }
115  return $inData;
116  }
117 
127  protected function ‪handleUpload(ServerRequestInterface $request, array $inData): array
128  {
129  if ($request->getMethod() !== 'POST') {
130  return $inData;
131  }
132 
133  $parsedBody = $request->getParsedBody() ?? [];
134 
135  if (empty($parsedBody)) {
136  // This happens if the post request was larger than allowed on the server.
137  $this->moduleTemplate->addFlashMessage(
138  $this->lang->getLL('importdata_upload_nodata'),
139  $this->lang->getLL('importdata_upload_error'),
141  );
142  return $inData;
143  }
144 
145  $uploadStatus = ‪self::NO_UPLOAD;
146 
147  if (isset($parsedBody['_upload'])) {
148  $file = $parsedBody['file'];
149  $conflictMode = empty($parsedBody['overwriteExistingFiles']) ? ‪DuplicationBehavior::CANCEL : ‪DuplicationBehavior::REPLACE;
150  $fileProcessor = GeneralUtility::makeInstance(ExtendedFileUtility::class);
151  $fileProcessor->setActionPermissions();
152  $fileProcessor->setExistingFilesConflictMode(‪DuplicationBehavior::cast($conflictMode));
153  $fileProcessor->start($file);
154  $result = $fileProcessor->processData();
155  // Finally: If upload went well, set the new file as the import file.
156  if (isset($result['upload'][0][0])) {
158  $uploadedFile = $result['upload'][0][0];
159  if (in_array($uploadedFile->getExtension(), ['t3d', 'xml'], true)) {
160  $inData['file'] = $uploadedFile->getCombinedIdentifier();
161  }
162  $this->standaloneView->assign('uploadedFile', $uploadedFile->getName());
163  $uploadStatus = ‪self::UPLOAD_DONE;
164  } else {
165  $uploadStatus = ‪self::UPLOAD_FAILED;
166  }
167  }
168 
169  $this->standaloneView->assign('uploadStatus', $uploadStatus);
170  return $inData;
171  }
172 
182  protected function ‪importData(array $inData): array
183  {
184  // Create import object and configure it:
185  $this->import = GeneralUtility::makeInstance(Import::class);
186  $this->import->setPid($this->id);
187  $this->import->setUpdate((bool)($inData['do_update'] ?? false));
188  $this->import->setImportMode((array)($inData['import_mode'] ?? null));
189  $this->import->setEnableLogging((bool)($inData['enableLogging'] ?? false));
190  $this->import->setGlobalIgnorePid((bool)($inData['global_ignore_pid'] ?? false));
191  $this->import->setForceAllUids((bool)($inData['force_all_UIDS'] ?? false));
192  $this->import->setShowDiff(!(bool)($inData['notShowDiff'] ?? false));
193  $this->import->setSoftrefInputValues((array)($inData['softrefInputValues'] ?? null));
194 
195  // Perform preview and import:
196  if (!empty($inData['file'])) {
197  $filePath = $this->‪getFilePathWithinFileMountBoundaries((string)$inData['file']);
198  try {
199  $this->import->loadFile($filePath, true);
200  $this->import->checkImportPrerequisites();
201  if ($inData['import_file'] ?? false) {
202  $this->import->importData();
203  BackendUtility::setUpdateSignal('updatePageTree');
204  }
205  } catch (\Exception $e) {
206  $this->moduleTemplate->addFlashMessage($e->getMessage(), '', ‪FlashMessage::ERROR);
207  }
208  }
209 
210  $this->standaloneView->assign('import', $this->import);
211  $this->standaloneView->assign('errors', $this->import->getErrorLog());
212  $this->standaloneView->assign('preview', $this->import->renderPreview());
213  return $inData;
214  }
215 
216  protected function ‪getFilePathWithinFileMountBoundaries(string $filePath): string
217  {
218  try {
219  $file = GeneralUtility::makeInstance(ResourceFactory::class)->getFileObjectFromCombinedIdentifier($filePath);
220  return $file->getForLocalProcessing(false);
221  } catch (\‪Exception $exception) {
222  return '';
223  }
224  }
225 
226  protected function ‪registerDocHeaderButtons(): void
227  {
228  parent::registerDocHeaderButtons();
229 
230  if ($this->pageInfo['uid'] ?? false) {
231  $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar();
232  $previewDataAttributes = ‪PreviewUriBuilder::create((int)$this->pageInfo['uid'])
233  ->withRootLine(BackendUtility::BEgetRootLine($this->pageInfo['uid']))
234  ->buildDispatcherDataAttributes();
235  $viewButton = $buttonBar->makeLinkButton()
236  ->setTitle($this->lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage'))
237  ->setHref('#')
238  ->setIcon($this->iconFactory->getIcon('actions-view-page', ‪Icon::SIZE_SMALL))
239  ->setDataAttributes($previewDataAttributes ?? []);
240  $buttonBar->addButton($viewButton);
241  }
242  }
243 
247  protected function ‪makeForm(): void
248  {
249  $selectOptions = [''];
250  foreach ($this->‪getExportFiles() as $file) {
251  $selectOptions[$file->getCombinedIdentifier()] = $file->getPublicUrl();
252  }
253 
254  $importFolder = $this->import->getOrCreateDefaultImportExportFolder();
255  if ($importFolder) {
256  $this->standaloneView->assign('importFolder', $importFolder->getCombinedIdentifier());
257  $this->standaloneView->assign(
258  'importFolderHint',
259  sprintf(
260  $this->lang->getLL('importdata_fromPathS'),
261  $importFolder->getCombinedIdentifier()
262  )
263  );
264  } else {
265  $this->standaloneView->assign(
266  'importFolderHint',
267  $this->lang->getLL('importdata_no_default_upload_folder')
268  );
269  }
270 
271  $this->standaloneView->assign('fileSelectOptions', $selectOptions);
272  }
273 
280  protected function ‪getExportFiles(): array
281  {
282  $exportFiles = [];
283 
284  $folder = $this->import->getOrCreateDefaultImportExportFolder();
285  if ($folder !== null) {
286  $filter = GeneralUtility::makeInstance(FileExtensionFilter::class);
287  $filter->setAllowedFileExtensions(['t3d', 'xml']);
288  $folder->getStorage()->addFileAndFolderNameFilter([$filter, 'filterFileList']);
289 
290  $exportFiles = $folder->getFiles();
291  }
292 
293  return $exportFiles;
294  }
295 
302  protected function ‪getFile(string $combinedIdentifier)
303  {
304  try {
305  $file = GeneralUtility::makeInstance(ResourceFactory::class)->getFileObjectFromCombinedIdentifier($combinedIdentifier);
306  } catch (\Exception $exception) {
307  $file = null;
308  }
309 
310  return $file;
311  }
312 }
‪TYPO3\CMS\Impexp\Controller\ImportController\mainAction
‪ResponseInterface mainAction(ServerRequestInterface $request)
Definition: ImportController.php:75
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Impexp\Controller\ImportExportController\main
‪main(ServerRequestInterface $request)
Definition: ImportExportController.php:127
‪TYPO3\CMS\Impexp\Controller\ImportController\importData
‪array importData(array $inData)
Definition: ImportController.php:180
‪TYPO3\CMS\Core\Resource\DuplicationBehavior
Definition: DuplicationBehavior.php:24
‪TYPO3\CMS\Impexp\Controller\ImportController\UPLOAD_FAILED
‪const UPLOAD_FAILED
Definition: ImportController.php:46
‪TYPO3\CMS\Core\Resource\DuplicationBehavior\CANCEL
‪const CANCEL
Definition: DuplicationBehavior.php:46
‪TYPO3\CMS\Impexp\Controller\ImportController\getExportFiles
‪File[] getExportFiles()
Definition: ImportController.php:278
‪TYPO3\CMS\Impexp\Controller
Definition: ExportController.php:18
‪TYPO3\CMS\Impexp\Controller\ImportController\getFile
‪File ProcessedFile null getFile(string $combinedIdentifier)
Definition: ImportController.php:300
‪TYPO3\CMS\Core\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Backend\Routing\PreviewUriBuilder\create
‪static static create(int $pageId, string $alternativeUri=null)
Definition: PreviewUriBuilder.php:75
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Impexp\Controller\ImportController\makeForm
‪makeForm()
Definition: ImportController.php:245
‪TYPO3\CMS\Impexp\Controller\ImportController\registerDocHeaderButtons
‪registerDocHeaderButtons()
Definition: ImportController.php:224
‪TYPO3\CMS\Core\Exception
‪TYPO3\CMS\Impexp\Controller\ImportController
Definition: ImportController.php:43
‪TYPO3\CMS\Core\Type\Enumeration\cast
‪static static cast($value)
Definition: Enumeration.php:186
‪TYPO3\CMS\Core\Utility\File\ExtendedFileUtility
Definition: ExtendedFileUtility.php:73
‪TYPO3\CMS\Impexp\Controller\ImportExportController
Definition: ImportExportController.php:43
‪TYPO3\CMS\Impexp\Import
Definition: Import.php:50
‪TYPO3\CMS\Core\Resource\ResourceFactory
Definition: ResourceFactory.php:41
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:24
‪TYPO3\CMS\Impexp\Controller\ImportController\preprocessInputData
‪preprocessInputData(array $inData)
Definition: ImportController.php:108
‪TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter
Definition: FileExtensionFilter.php:28
‪TYPO3\CMS\Core\Resource\ProcessedFile
Definition: ProcessedFile.php:45
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:26
‪TYPO3\CMS\Impexp\Controller\ImportController\handleUpload
‪array handleUpload(ServerRequestInterface $request, array $inData)
Definition: ImportController.php:125
‪TYPO3\CMS\Backend\Routing\PreviewUriBuilder
Definition: PreviewUriBuilder.php:32
‪TYPO3\CMS\Impexp\Controller\ImportController\UPLOAD_DONE
‪const UPLOAD_DONE
Definition: ImportController.php:45
‪TYPO3\CMS\Impexp\Controller\ImportController\$routeName
‪string $routeName
Definition: ImportController.php:50
‪TYPO3\CMS\Core\Resource\DuplicationBehavior\REPLACE
‪const REPLACE
Definition: DuplicationBehavior.php:39
‪TYPO3\CMS\Impexp\Controller\ImportController\NO_UPLOAD
‪const NO_UPLOAD
Definition: ImportController.php:44
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Impexp\Controller\ImportExportController\getBackendUser
‪BackendUserAuthentication getBackendUser()
Definition: ImportExportController.php:177
‪TYPO3\CMS\Core\Messaging\AbstractMessage\ERROR
‪const ERROR
Definition: AbstractMessage.php:31
‪TYPO3\CMS\Impexp\Controller\ImportController\$import
‪Import $import
Definition: ImportController.php:54
‪TYPO3\CMS\Core\Http\HtmlResponse
Definition: HtmlResponse.php:26
‪TYPO3\CMS\Impexp\Controller\ImportController\getFilePathWithinFileMountBoundaries
‪getFilePathWithinFileMountBoundaries(string $filePath)
Definition: ImportController.php:214