pageRenderer->loadJavaScriptModule('@typo3/filelist/browse-files.js'); } protected function initVariables(ServerRequestInterface $request): void { parent::initVariables($request); $this->searchWord = trim((string)($request->getParsedBody()['searchTerm'] ?? $request->getQueryParams()['searchTerm'] ?? '')); $fileExtensions = $this->browserParameters->getFileExtensions(); $this->fileExtensionFilter = GeneralUtility::makeInstance(FileExtensionFilter::class); if ($fileExtensions['allowed'] !== []) { $this->fileExtensionFilter->setAllowedFileExtensions(implode(',', $fileExtensions['allowed'])); } if ($fileExtensions['disallowed'] !== []) { $this->fileExtensionFilter->setDisallowedFileExtensions(implode(',', $fileExtensions['disallowed'])); } $this->resourceDisplayMatcher = GeneralUtility::makeInstance(Matcher::class); $this->resourceDisplayMatcher->addMatcher(GeneralUtility::makeInstance(ResourceFolderTypeMatcher::class)); $this->resourceDisplayMatcher->addMatcher( GeneralUtility::makeInstance( AndMatcher::class, GeneralUtility::makeInstance(ResourceFileExtensionMatcher::class) ->setExtensions($this->fileExtensionFilter->getAllowedFileExtensions() ?? ['*']) ->setIgnoredExtensions($this->fileExtensionFilter->getDisallowedFileExtensions() ?? []), new class (GeneralUtility::makeInstance(EventDispatcherInterface::class)) implements MatcherInterface { public function __construct(private readonly EventDispatcherInterface $eventDispatcher) {} public function supports(mixed $item): bool { return $item instanceof ResourceInterface; } public function match(mixed $item): bool { return $this->eventDispatcher->dispatch(new IsFileSelectableEvent($item))->isFileSelectable(); } } ) ); $this->resourceSelectableMatcher = GeneralUtility::makeInstance(Matcher::class); $this->resourceSelectableMatcher->addMatcher( GeneralUtility::makeInstance(ResourceFileExtensionMatcher::class) ->setExtensions($this->fileExtensionFilter->getAllowedFileExtensions() ?? ['*']) ->setIgnoredExtensions($this->fileExtensionFilter->getDisallowedFileExtensions() ?? []) ); } public function render(): string { $this->initSelectedFolder(); $contentHtml = ''; if ($this->selectedFolder instanceof Folder) { $markup = []; // Prepare search box, since the component should always be displayed, even if no files are available $markup[] = '
'; $markup[] = GeneralUtility::makeInstance(RecordSearchBoxComponent::class) ->setSearchWord($this->searchWord ?? '') ->render($this->getRequest(), $this->createUri()); $markup[] = '
'; // Create the filelist $this->filelist->start( $this->selectedFolder, MathUtility::forceIntegerInRange($this->currentPage, 1, 100000), $this->sortField, $this->sortDirection, Mode::BROWSE ); // Only add selected columns if the feature is enabled if ($this->getBackendUser()->getTSConfig()['options.']['file_list.']['displayColumnSelector'] ?? true) { $this->filelist->setColumnsToRender($this->getBackendUser()->getModuleData('list/displayFields')['_FILE'] ?? []); } // Create the filelist header bar $markup[] = '
'; $markup[] = '
'; $markup[] = ' '; $markup[] = '
'; $markup[] = '
'; $markup[] = ' ' . $this->getSortingModeButtons(); $markup[] = ' ' . $this->getViewModeButton(); $markup[] = '
'; $markup[] = '
'; $this->filelist->setResourceDisplayMatcher($this->resourceDisplayMatcher); $this->filelist->setResourceSelectableMatcher($this->resourceSelectableMatcher); $searchDemand = $this->searchWord !== '' ? FileSearchDemand::createForSearchTerm($this->searchWord)->withFolder($this->selectedFolder)->withRecursive() : null; $markup[] = $this->filelist->render($searchDemand, $this->view); // Build the file upload and folder creation form $resourceUtilityRenderer = GeneralUtility::makeInstance(ResourceUtilityRenderer::class, $this); $markup[] = $resourceUtilityRenderer->uploadForm($this->getRequest(), $this->selectedFolder, $this->fileExtensionFilter); $markup[] = $resourceUtilityRenderer->addOnlineMedia($this->getRequest(), $this->selectedFolder, $this->fileExtensionFilter); $markup[] = $resourceUtilityRenderer->createFolder($this->getRequest(), $this->selectedFolder); $contentHtml = implode('', $markup); } $contentOnly = (bool)($this->getRequest()->getQueryParams()['contentOnly'] ?? false); $this->pageRenderer->setTitle($this->getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:fileSelector')); $this->view->assign('selectedFolder', $this->selectedFolder); $this->view->assign('content', $contentHtml); $this->view->assign('contentOnly', $contentOnly); $content = $this->view->render('ElementBrowser/Files'); if ($contentOnly) { return $content; } $this->pageRenderer->setBodyContent('getBodyTagParameters() . '>' . $content); return $this->pageRenderer->render($this->getRequest()); } }