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[] = ' ' . htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.selection')) . '';
$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());
}
}