55 'MOD_MENU' =>
'Using FileListController::$MOD_MENU is deprecated and will not be possible anymore in TYPO3 v10.0.',
56 'MOD_SETTINGS' =>
'Using FileListController::$MOD_SETTINGS is deprecated and will not be possible anymore in TYPO3 v10.0.',
57 'doc' =>
'Using FileListController::$doc is deprecated, property will be removed in TYPO3 v10.0.',
58 'id' =>
'Using FileListController::$id is deprecated and will not be possible anymore in TYPO3 v10.0.',
59 'pointer' =>
'Using FileListController::$pointer is deprecated and will not be possible anymore in TYPO3 v10.0.',
60 'table' =>
'Using FileListController::$table is deprecated, , property will be removed in TYPO3 v10.0.',
61 'imagemode' =>
'Using FileListController::$imagemode is deprecated and will not be possible anymore in TYPO3 v10.0.',
62 'cmd' =>
'Using FileListController::$cmd is deprecated and will not be possible anymore in TYPO3 v10.0.',
63 'filelist' =>
'Using FileListController::$filelist is deprecated and will not be possible anymore in TYPO3 v10.0.',
70 'menuConfig' =>
'Using FileListController::menuConfig() is deprecated and will not be possible anymore in TYPO3 v10.0.',
71 'initializeView' =>
'Using FileListController::initializeView() is deprecated and will not be possible anymore in TYPO3 v10.0.',
72 'initializeIndexAction' =>
'Using FileListController::initializeIndexAction() is deprecated and will not be possible anymore in TYPO3 v10.0.',
73 'indexAction' =>
'Using FileListController::indexAction() is deprecated and will not be possible anymore in TYPO3 v10.0.',
74 'missingFolderAction' =>
'Using FileListController::missingFolderAction() is deprecated and will not be possible anymore in TYPO3 v10.0.',
75 'searchAction' =>
'Using FileListController::searchAction() is deprecated and will not be possible anymore in TYPO3 v10.0.',
194 $this->doc = GeneralUtility::makeInstance(DocumentTemplate::class);
199 $this->
id = ($combinedIdentifier = GeneralUtility::_GP(
'id'));
200 $this->pointer = GeneralUtility::_GP(
'pointer');
201 $this->table = GeneralUtility::_GP(
'table');
202 $this->imagemode = GeneralUtility::_GP(
'imagemode');
203 $this->cmd = GeneralUtility::_GP(
'cmd');
207 if ($combinedIdentifier) {
209 $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
210 $storage = $resourceFactory->getStorageObjectFromCombinedIdentifier($combinedIdentifier);
211 $identifier = substr($combinedIdentifier, strpos($combinedIdentifier,
':') + 1);
212 if (!$storage->hasFolder($identifier)) {
213 $identifier = $storage->getFolderIdentifierFromFileIdentifier($identifier);
216 $this->folderObject = $resourceFactory->getFolderObjectFromCombinedIdentifier($storage->getUid() .
':' . $identifier);
218 if ($storage->getUid() === 0) {
219 throw new Exception\InsufficientFolderAccessPermissionsException(
220 'You are not allowed to access files outside your storages',
225 if ($this->folderObject && $storage->isProcessingFolder($this->folderObject)) {
226 $this->folderObject = $storage->getRootLevelFolder();
231 $fileStorage = reset($fileStorages);
233 $this->folderObject = $fileStorage->getRootLevelFolder();
235 throw new \RuntimeException(
'Could not find any folder to be displayed.', 1349276894);
239 if ($this->folderObject && !$this->folderObject->getStorage()->isWithinFileMountBoundaries($this->folderObject)) {
240 throw new \RuntimeException(
'Folder not accessible.', 1430409089);
242 }
catch (Exception\InsufficientFolderAccessPermissionsException $permissionException) {
243 $this->folderObject =
null;
244 $this->errorMessage = GeneralUtility::makeInstance(
253 }
catch (Exception $fileException) {
255 $this->folderObject =
null;
258 $fileStorage = reset($fileStorages);
259 if ($fileStorage instanceof \
TYPO3\CMS\Core\Resource\ResourceStorage) {
260 $this->folderObject = $fileStorage->getRootLevelFolder();
261 if (!$fileStorage->isWithinFileMountBoundaries($this->folderObject)) {
262 $this->folderObject =
null;
265 $this->errorMessage = GeneralUtility::makeInstance(
274 }
catch (\RuntimeException $e) {
275 $this->folderObject =
null;
276 $this->errorMessage = GeneralUtility::makeInstance(
278 $e->getMessage() .
' (' . $e->getCode() .
')',
279 $this->getLanguageService()->getLL(
'folderNotFoundTitle'),
284 if ($this->folderObject && !$this->folderObject->getStorage()->checkFolderActionPermission(
289 $this->folderObject =
null;
308 'displayThumbs' =>
'',
310 'bigControlPanel' =>
''
315 GeneralUtility::_GP(
'SET'),
328 parent::initializeView(
$view);
329 $pageRenderer = $this->view->getModuleTemplate()->getPageRenderer();
330 $pageRenderer->loadRequireJsModule(
'TYPO3/CMS/Filelist/FileListLocalisation');
331 $pageRenderer->loadRequireJsModule(
'TYPO3/CMS/Filelist/FileSearch');
332 $pageRenderer->loadRequireJsModule(
'TYPO3/CMS/Backend/ContextMenu');
343 $userTsConfig = $backendUser->getTSConfig();
344 if (($userTsConfig[
'options.'][
'file_list.'][
'enableDisplayBigControlPanel'] ??
'') ===
'activated') {
345 $this->MOD_SETTINGS[
'bigControlPanel'] =
true;
346 } elseif (($userTsConfig[
'options.'][
'file_list.'][
'enableDisplayBigControlPanel'] ??
'') ===
'deactivated') {
347 $this->MOD_SETTINGS[
'bigControlPanel'] =
false;
350 if (($userTsConfig[
'options.'][
'file_list.'][
'enableDisplayThumbnails'] ??
'') ===
'activated') {
351 $this->MOD_SETTINGS[
'displayThumbs'] =
true;
352 } elseif (($userTsConfig[
'options.'][
'file_list.'][
'enableDisplayThumbnails'] ??
'') ===
'deactivated') {
353 $this->MOD_SETTINGS[
'displayThumbs'] =
false;
356 if (($userTsConfig[
'options.'][
'file_list.'][
'enableClipBoard'] ??
'') ===
'activated') {
357 $this->MOD_SETTINGS[
'clipBoard'] =
true;
358 } elseif (($userTsConfig[
'options.'][
'file_list.'][
'enableClipBoard'] ??
'') ===
'deactivated') {
359 $this->MOD_SETTINGS[
'clipBoard'] =
false;
362 if (!isset($this->MOD_SETTINGS[
'displayThumbs'])) {
363 $this->MOD_SETTINGS[
'displayThumbs'] = $backendUser->uc[
'thumbnailsByDefault'];
365 if (!isset($this->MOD_SETTINGS[
'sort'])) {
367 $this->MOD_SETTINGS[
'sort'] =
'file';
368 $this->MOD_SETTINGS[
'reverse'] = 0;
376 $pageRenderer = $this->view->getModuleTemplate()->getPageRenderer();
380 if ($this->folderObject) {
383 $this->filelist = GeneralUtility::makeInstance(FileList::class, $this);
384 $this->filelist->thumbs =
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'thumbnails'] && $this->MOD_SETTINGS[
'displayThumbs'];
386 $this->filelist->clipObj = GeneralUtility::makeInstance(Clipboard::class);
387 $this->filelist->clipObj->fileMode =
true;
388 $this->filelist->clipObj->initializeClipboard();
389 $CB = GeneralUtility::_GET(
'CB');
390 if ($this->cmd ===
'setCB') {
391 $CB[
'el'] = $this->filelist->clipObj->cleanUpCBC(array_merge(
392 GeneralUtility::_POST(
'CBH'),
393 (array)GeneralUtility::_POST(
'CBC')
396 if (!$this->MOD_SETTINGS[
'clipBoard']) {
397 $CB[
'setP'] =
'normal';
399 $this->filelist->clipObj->setCmd($CB);
400 $this->filelist->clipObj->cleanCurrent();
402 $this->filelist->clipObj->endClipboard();
404 if ($this->cmd ===
'delete') {
405 $items = $this->filelist->clipObj->cleanUpCBC(GeneralUtility::_POST(
'CBC'),
'_FILE', 1);
406 if (!empty($items)) {
409 foreach ($items as $clipboardIdentifier => $combinedIdentifier) {
410 $FILE[
'delete'][] = [
'data' => $combinedIdentifier];
411 $this->filelist->clipObj->removeElement($clipboardIdentifier);
415 $fileProcessor = GeneralUtility::makeInstance(ExtendedFileUtility::class);
416 $fileProcessor->setActionPermissions();
417 $fileProcessor->setExistingFilesConflictMode($this->overwriteExistingFiles);
418 $fileProcessor->start($FILE);
419 $fileProcessor->processData();
421 $this->filelist->clipObj->cleanCurrent();
422 $this->filelist->clipObj->endClipboard();
427 $this->filelist->start(
430 $this->MOD_SETTINGS[
'sort'],
431 $this->MOD_SETTINGS[
'reverse'],
432 $this->MOD_SETTINGS[
'clipBoard'],
433 $this->MOD_SETTINGS[
'bigControlPanel']
436 $this->filelist->generateList();
438 $this->view->getModuleTemplate()->addJavaScriptCode(
440 'if (top.fsMod) top.fsMod.recentIds["file"] = "' . rawurlencode($this->
id) .
'";' . $this->filelist->CBfunctions() .
'
441 function jumpToUrl(URL) {
442 window.location.href = URL;
447 $pageRenderer->loadRequireJsModule(
'TYPO3/CMS/Filelist/FileDelete');
448 $pageRenderer->addInlineLanguageLabelFile(
'EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf',
'buttons');
451 if ($this->folderObject->getStorage()->checkUserActionPermission(
'add',
'File')
452 && $this->folderObject->checkActionPermission(
'write')
454 $pageRenderer->loadRequireJsModule(
'TYPO3/CMS/Backend/DragUploader');
455 $pageRenderer->addInlineLanguageLabelFile(
'EXT:core/Resources/Private/Language/locallang_core.xlf',
'file_upload');
456 $pageRenderer->addInlineLanguageLabelArray([
466 '_additional_info' => $this->filelist->getFolderInfo(),
467 'combined_identifier' => $this->folderObject->getCombinedIdentifier(),
469 $this->view->getModuleTemplate()->getDocHeaderComponent()->setMetaInformation($pageRecord);
472 $this->view->assign(
'listHtml', $this->filelist->HTMLcode);
474 $this->view->assign(
'checkboxes', [
475 'bigControlPanel' => [
476 'enabled' => ($userTsConfig[
'options.'][
'file_list.'][
'enableDisplayBigControlPanel'] ??
'') ===
'selectable',
480 'SET[bigControlPanel]',
481 $this->MOD_SETTINGS[
'bigControlPanel'] ??
'',
484 'id="bigControlPanel"'
488 'enabled' =>
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'thumbnails'] && ($userTsConfig[
'options.'][
'file_list.'][
'enableDisplayThumbnails'] ??
'') ===
'selectable',
492 'SET[displayThumbs]',
493 $this->MOD_SETTINGS[
'displayThumbs'] ??
'',
496 'id="checkDisplayThumbs"'
499 'enableClipBoard' => [
500 'enabled' => ($userTsConfig[
'options.'][
'file_list.'][
'enableClipBoard'] ??
'') ===
'selectable',
505 $this->MOD_SETTINGS[
'clipBoard'] ??
'',
508 'id="checkClipBoard"'
512 $this->view->assign(
'showClipBoard', (
bool)$this->MOD_SETTINGS[
'clipBoard']);
513 $this->view->assign(
'clipBoardHtml', $this->filelist->clipObj->printClipboard());
514 $this->view->assign(
'folderIdentifier', $this->folderObject->getCombinedIdentifier());
515 $this->view->assign(
'fileDenyPattern',
$GLOBALS[
'TYPO3_CONF_VARS'][
'BE'][
'fileDenyPattern']);
516 $this->view->assign(
'maxFileSize', GeneralUtility::getMaxUploadFileSize() * 1024);
526 if ($this->errorMessage) {
528 $this->controllerContext->getFlashMessageQueue(
'core.template.flashMessages')->addMessage($this->errorMessage);
539 if (empty($searchWord)) {
543 $files = $this->folderObject->searchFiles($searchDemand);
546 if (count($files) === 0) {
547 $this->controllerContext->getFlashMessageQueue(
'core.template.flashMessages')->addMessage(
555 foreach ($files as $file) {
556 $fileFacades[] = new \TYPO3\CMS\Filelist\FileFacade($file);
561 $uriBuilder = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Routing\UriBuilder::class);
563 $pageRenderer = $this->view->getModuleTemplate()->getPageRenderer();
564 $pageRenderer->addInlineSetting(
'ShowItem',
'moduleUrl', (
string)
$uriBuilder->buildUriFromRoute(
'show_item'));
565 $pageRenderer->loadRequireJsModule(
'TYPO3/CMS/Filelist/FileList');
567 $thumbnailConfiguration = GeneralUtility::makeInstance(ThumbnailConfiguration::class);
568 $this->view->assign(
'thumbnail', [
569 'width' => $thumbnailConfiguration->getWidth(),
570 'height' => $thumbnailConfiguration->getHeight(),
573 $this->view->assign(
'searchWord', $searchWord);
574 $this->view->assign(
'files', $fileFacades);
575 $this->view->assign(
'deleteUrl', (
string)
$uriBuilder->buildUriFromRoute(
'tce_file'));
576 $this->view->assign(
'settings', [
580 $pageRenderer->loadRequireJsModule(
'TYPO3/CMS/Filelist/FileDelete');
581 $pageRenderer->addInlineLanguageLabelFile(
'EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf',
'buttons');
592 $name = $this->folderObject->getName();
595 if ($this->folderObject->getIdentifier() ===
'/') {
596 $name = $this->folderObject->getStorage()->getName();
600 [$name => $this->folderObject]
614 $buttonBar = $this->view->getModuleTemplate()->getDocHeaderComponent()->getButtonBar();
617 $cshButton = $buttonBar->makeHelpButton()
618 ->setModuleName(
'xMOD_csh_corebe')
619 ->setFieldName(
'filelist_module');
620 $buttonBar->addButton($cshButton);
629 $buttonBar = $this->view->getModuleTemplate()->getDocHeaderComponent()->getButtonBar();
632 $iconFactory = $this->view->getModuleTemplate()->getIconFactory();
634 $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
638 $uriBuilder = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Routing\UriBuilder::class);
641 $refreshLink = GeneralUtility::linkThisScript(
643 'target' => rawurlencode($this->folderObject->getCombinedIdentifier()),
644 'imagemode' => $this->filelist->thumbs
647 $refreshButton = $buttonBar->makeLinkButton()
648 ->setHref($refreshLink)
649 ->setTitle($lang->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.reload'))
655 $currentStorage = $this->folderObject->getStorage();
656 $parentFolder = $this->folderObject->getParentFolder();
657 if ($parentFolder->getIdentifier() !== $this->folderObject->getIdentifier()
658 && $currentStorage->isWithinFileMountBoundaries($parentFolder)
660 $levelUpClick =
'top.document.getElementsByName("nav_frame")[0].contentWindow.Tree.highlightActiveItem("file","folder'
661 . GeneralUtility::md5int($parentFolder->getCombinedIdentifier()) .
'_"+top.fsMod.currentBank)';
662 $levelUpButton = $buttonBar->makeLinkButton()
663 ->setHref((
string)
$uriBuilder->buildUriFromRoute(
'file_FilelistList', [
'id' => $parentFolder->getCombinedIdentifier()]))
664 ->setOnClick($levelUpClick)
665 ->setTitle($lang->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.upOneLevel'))
669 }
catch (\Exception $e) {
674 $shortCutButton = $buttonBar->makeShortcutButton()->setModuleName(
'file_FilelistList');
679 if ($this->folderObject && $this->folderObject->getStorage()->checkUserActionPermission(
682 ) && $this->folderObject->checkActionPermission(
'write')
684 $uploadButton = $buttonBar->makeLinkButton()
688 'target' => $this->folderObject->getCombinedIdentifier(),
689 'returnUrl' => $this->filelist->listURL(),
692 ->setClasses(
't3js-drag-uploader-trigger')
693 ->setTitle($lang->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.upload'))
699 if ($this->folderObject && $this->folderObject->checkActionPermission(
'write')
700 && ($this->folderObject->getStorage()->checkUserActionPermission(
703 ) || $this->folderObject->checkActionPermission(
'add'))
705 $newButton = $buttonBar->makeLinkButton()
709 'target' => $this->folderObject->getCombinedIdentifier(),
710 'returnUrl' => $this->filelist->listURL(),
713 ->setTitle($lang->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.new'))
719 if ($this->filelist->clipObj instanceof Clipboard && $this->folderObject->checkActionPermission(
'write')) {
720 $elFromTable = $this->filelist->clipObj->elFromTable(
'_FILE');
721 if (!empty($elFromTable)) {
722 $addPasteButton =
true;
724 foreach ($elFromTable as $key => $element) {
725 $clipBoardElement = $resourceFactory->retrieveFileOrFolderObject($element);
726 if ($clipBoardElement instanceof Folder && $clipBoardElement->getStorage()->isWithinFolder(
731 $addPasteButton =
false;
733 $elToConfirm[$key] = $clipBoardElement->getName();
735 if ($addPasteButton) {
736 $confirmText = $this->filelist->clipObj
737 ->confirmMsgText(
'_FILE', $this->folderObject->getReadablePath(),
'into', $elToConfirm);
738 $pasteButton = $buttonBar->makeLinkButton()
739 ->setHref($this->filelist->clipObj
740 ->pasteUrl(
'_FILE', $this->folderObject->getCombinedIdentifier()))
741 ->setClasses(
't3js-modal-trigger')
742 ->setDataAttributes([
743 'severity' =>
'warning',
744 'content' => $confirmText,
745 'title' => $lang->getLL(
'clip_paste')
747 ->setTitle($lang->getLL(
'clip_paste'))
748 ->setIcon($iconFactory->getIcon(
'actions-document-paste-into',
Icon::SIZE_SMALL));