parameterProvider = $parameterProvider; $this->uriBuilder = GeneralUtility::makeInstance(UriBuilder::class); } /** * For TBE: Makes a form for creating new folders in the file mount the user is browsing. * The folder creation request is sent to the tce_file.php script in the core which will handle the creation. * * @param Folder $folderObject Absolute filepath on server in which to create the new folder. * * @return string HTML for the create folder form. */ public function createFolder(ServerRequestInterface $request, Folder $folderObject) { $lang = $this->getLanguageService(); if (!$folderObject->checkActionPermission('write')) { // Do not show create folder form if it is denied return ''; } $formAction = (string)$this->uriBuilder->buildUriFromRoute('tce_file'); $markup = []; $markup[] = '
'; $markup[] = '

' . htmlspecialchars($lang->sL('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:create_folder.title')) . '

'; $markup[] = '
'; $markup[] = ''; $markup[] = ''; $markup[] = '
'; $markup[] = ''; // Make footer of upload form, including the submit button: $redirectValue = (string)$this->uriBuilder->buildUriFromRequest( $request, $this->parameterProvider->getUrlParameters( ['identifier' => $folderObject->getCombinedIdentifier()] ) ); $markup[] = ''; $markup[] = '
'; return implode(LF, $markup); } /** * For TBE: Creates a form for creating new text files. * * @param Folder $folderObject Folder object in which to create the text file. * * @return string HTML for the text file creation form. */ public function createRegularFile(ServerRequestInterface $request, Folder $folderObject): string { if (!$folderObject->checkActionPermission('write') || !$folderObject->getStorage()->checkUserActionPermission('add', 'File')) { return ''; } $markup = []; $lang = $this->getLanguageService(); $fileNameVerifier = GeneralUtility::makeInstance(FileNameValidator::class); $redirectValue = (string)$this->uriBuilder->buildUriFromRequest( $request, $this->parameterProvider->getUrlParameters( ['identifier' => $folderObject->getCombinedIdentifier()] ) ); // Create a list of allowed text file extensions $textFileExt = GeneralUtility::trimExplode(',', $GLOBALS['TYPO3_CONF_VARS']['SYS']['textfile_ext'], true); $allowedTextFileList = []; foreach ($textFileExt as $fileExt) { if ($fileNameVerifier->isValid('.' . $fileExt)) { $allowedTextFileList[] = '
  • ' . strtoupper(htmlspecialchars($fileExt)) . '
  • '; } } if (!empty($allowedTextFileList)) { $formAction = (string)$this->uriBuilder->buildUriFromRoute('tce_file'); $markup[] = '
    '; $markup[] = ''; $markup[] = ''; $markup[] = ''; $markup[] = '

    ' . htmlspecialchars($lang->sL('LLL:EXT:filelist/Resources/Private/Language/locallang.xlf:file_newfolder.php.newfile')) . '

    '; $markup[] = '
    '; $markup[] = ''; $markup[] = ''; $markup[] = '
    '; $markup[] = '
    '; $markup[] = htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.allowedEditableTextFileExtensions')); $markup[] = ''; $markup[] = '
    '; $markup[] = '
    '; } return implode(LF, $markup); } /** * For TBE: Creates a form for adding online media files (YouTube, Vimeo, etc.). * * @param Folder $folderObject Folder object in which to create the online media file. * @param FileExtensionFilter|null $fileExtensionFilter Optional filter for allowed/disallowed file extensions. * * @return string HTML for the online media form. */ public function addOnlineMedia(ServerRequestInterface $request, Folder $folderObject, ?FileExtensionFilter $fileExtensionFilter = null): string { if (!$folderObject->checkActionPermission('write') || !$folderObject->getStorage()->checkUserActionPermission('add', 'File')) { return ''; } $markup = []; $lang = $this->getLanguageService(); $fileNameVerifier = GeneralUtility::makeInstance(FileNameValidator::class); $onlineMediaHelperRegistry = GeneralUtility::makeInstance(OnlineMediaHelperRegistry::class); $redirectValue = (string)$this->uriBuilder->buildUriFromRequest( $request, $this->parameterProvider->getUrlParameters( ['identifier' => $folderObject->getCombinedIdentifier()] ) ); // Create a list of allowed online media file extensions $onlineMediaFileExt = $onlineMediaHelperRegistry->getSupportedFileExtensions(); $allowedOnlineMediaList = []; foreach ($onlineMediaFileExt as $fileExt) { if ($fileNameVerifier->isValid('.' . $fileExt) && ($fileExtensionFilter === null || $fileExtensionFilter->isAllowed($fileExt)) ) { $allowedOnlineMediaList[] = '
  • ' . strtoupper(htmlspecialchars($fileExt)) . '
  • '; } } if (!empty($allowedOnlineMediaList)) { $formAction = (string)$this->uriBuilder->buildUriFromRoute('online_media'); $markup[] = '
    '; $markup[] = ''; $markup[] = ''; $markup[] = '

    ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:online_media.new_media')) . '

    '; $markup[] = '
    '; $markup[] = ''; $markup[] = ''; $markup[] = '
    '; $markup[] = '
    '; $markup[] = htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:online_media.new_media.allowedProviders')); $markup[] = ''; $markup[] = '
    '; $markup[] = '
    '; } return implode(LF, $markup); } /** * For TBE: Creates a drag-uploader trigger button for file uploads. * Used in the element browser context with drag-uploader support. * * @param Folder $folderObject Folder object in which to upload files. * @param FileExtensionFilter|null $fileExtensionFilter Optional filter for allowed/disallowed file extensions. * * @return string HTML for the drag-uploader trigger. */ public function createDragUpload(Folder $folderObject, ?FileExtensionFilter $fileExtensionFilter = null, bool $checkFileBrowserPermission = false): string { if (!$folderObject->checkActionPermission('write') || !$folderObject->getStorage()->checkUserActionPermission('add', 'File')) { return ''; } if ($checkFileBrowserPermission && !($this->getBackendUser()->getTSConfig()['options.']['folderTree.']['uploadFieldsInLinkBrowser'] ?? true)) { return ''; } $lang = $this->getLanguageService(); $fileNameVerifier = GeneralUtility::makeInstance(FileNameValidator::class); // Determine allowed/disallowed file extensions $list = ['*']; $denyList = false; $allowedFileExtensionsList = []; if ($fileExtensionFilter !== null) { $resolvedFileExtensions = $fileExtensionFilter->getFilteredFileExtensions(); if (($resolvedFileExtensions['allowedFileExtensions'] ?? []) !== []) { $list = $resolvedFileExtensions['allowedFileExtensions']; } elseif (($resolvedFileExtensions['disallowedFileExtensions'] ?? []) !== []) { $denyList = true; $list = $resolvedFileExtensions['disallowedFileExtensions']; } } foreach ($list as $fileExt) { if (($fileExt === '*' && !$denyList) || $fileNameVerifier->isValid('.' . $fileExt)) { $allowedFileExtensionsList[] = '
  • ' . strtoupper(htmlspecialchars($fileExt)) . '
  • '; } } // Only render the form if there are allowed file extensions if (empty($allowedFileExtensionsList)) { return ''; } $markup = []; $markup[] = '
    '; $markup[] = '

    ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:file_upload.php.pagetitle')) . '

    '; $markup[] = ''; // Only show file extension info if there is an actual limitation (not just '*') if ($list !== ['*']) { $markup[] = '
    '; $markup[] = htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.' . ($denyList ? 'disallowedFileExtensions' : 'allowedFileExtensions'))); $markup[] = ''; $markup[] = '
    '; } $markup[] = '
    '; return implode(LF, $markup); } /** * Makes an upload form for uploading files to the file mount the user is browsing. * The files are uploaded to the tce_file.php script in the core which will handle the upload. * * @return string HTML for an upload form. */ public function uploadForm(ServerRequestInterface $request, Folder $folderObject, ?FileExtensionFilter $fileExtensionFilter = null) { if (!$folderObject->checkActionPermission('write')) { return ''; } $allowUpload = (bool)($this->getBackendUser()->getTSConfig()['options.']['folderTree.']['uploadFieldsInLinkBrowser'] ?? true); if (!$allowUpload) { return ''; } $lang = $this->getLanguageService(); $fileNameVerifier = GeneralUtility::makeInstance(FileNameValidator::class); // Determine allowed/disallowed file extensions $list = ['*']; $denyList = false; $allowedFileExtensionsList = []; if ($fileExtensionFilter !== null) { $resolvedFileExtensions = $fileExtensionFilter->getFilteredFileExtensions(); if (($resolvedFileExtensions['allowedFileExtensions'] ?? []) !== []) { $list = $resolvedFileExtensions['allowedFileExtensions']; } elseif (($resolvedFileExtensions['disallowedFileExtensions'] ?? []) !== []) { $denyList = true; $list = $resolvedFileExtensions['disallowedFileExtensions']; } } foreach ($list as $fileExt) { if (($fileExt === '*' && !$denyList) || $fileNameVerifier->isValid('.' . $fileExt)) { $allowedFileExtensionsList[] = '
  • ' . strtoupper(htmlspecialchars($fileExt)) . '
  • '; } } // Only render the form if there are allowed file extensions if (empty($allowedFileExtensionsList)) { return ''; } $formAction = (string)$this->uriBuilder->buildUriFromRoute('tce_file'); $combinedIdentifier = $folderObject->getCombinedIdentifier(); $redirectValue = (string)$this->uriBuilder->buildUriFromRequest($request, $this->parameterProvider->getUrlParameters(['identifier' => $combinedIdentifier])); $markup = []; $markup[] = '
    '; $markup[] = ''; $markup[] = ''; $markup[] = ''; $markup[] = '
    '; $markup[] = '
    '; $markup[] = '

    ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:file_upload.php.pagetitle')) . '

    '; $markup[] = '
    '; $markup[] = '
    '; $markup[] = '
    '; $markup[] = ' '; $markup[] = ' '; $markup[] = '
    '; $markup[] = '
    '; $markup[] = '
    '; $markup[] = '
    '; $markup[] = ''; $markup[] = ''; $markup[] = '
    '; $markup[] = '
    '; $markup[] = '
    '; // Only show file extension info if there is an actual limitation (not just '*') if ($list !== ['*']) { $markup[] = '
    '; $markup[] = htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.' . ($denyList ? 'disallowedFileExtensions' : 'allowedFileExtensions'))); $markup[] = ''; $markup[] = '
    '; } $markup[] = '
    '; return implode(LF, $markup); } protected function getLanguageService(): LanguageService { return $GLOBALS['LANG']; } protected function getBackendUser(): BackendUserAuthentication { return $GLOBALS['BE_USER']; } }