‪TYPO3CMS  ‪main
FileBrowser.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\ServerRequestInterface;
23 use TYPO3\CMS\Core\Imaging\IconSize;
33 
40 {
41  public const ‪IDENTIFIER = 'file';
42  protected string ‪$identifier = ‪self::IDENTIFIER;
43 
44  protected ?string ‪$searchWord = null;
47 
51  protected function ‪initialize(ServerRequestInterface ‪$request): void
52  {
53  parent::initialize(‪$request);
54  $this->pageRenderer->loadJavaScriptModule('@typo3/filelist/browse-files.js');
55  }
56 
57  protected function ‪initVariables(ServerRequestInterface ‪$request): void
58  {
59  parent::initVariables(‪$request);
60 
61  $this->searchWord = trim((string)(‪$request->getParsedBody()['searchTerm'] ?? ‪$request->getQueryParams()['searchTerm'] ?? ''));
62 
63  $fileExtensions = ‪GeneralUtility::trimExplode('~', explode('|', $this->bparams)[3], true);
64  $allowed = preg_replace('/^allowed=/', '', $fileExtensions[0] ?? '', 1);
65  $disallowed = preg_replace('/^disallowed=/', '', $fileExtensions[1] ?? '', 1);
66 
67  $this->fileExtensionFilter = GeneralUtility::makeInstance(FileExtensionFilter::class);
68  if ($allowed !== '' && !str_contains($allowed, 'sys_file') && !str_contains($allowed, '*')) {
69  $this->fileExtensionFilter->setAllowedFileExtensions($allowed);
70  }
71  if ($disallowed !== '') {
72  $this->fileExtensionFilter->setDisallowedFileExtensions($disallowed);
73  }
74 
75  $this->resourceDisplayMatcher = GeneralUtility::makeInstance(Matcher::class);
76  $this->resourceDisplayMatcher->addMatcher(GeneralUtility::makeInstance(ResourceFolderTypeMatcher::class));
77  $this->resourceDisplayMatcher->addMatcher(
78  GeneralUtility::makeInstance(ResourceFileExtensionMatcher::class)
79  ->setExtensions($this->fileExtensionFilter->getAllowedFileExtensions() ?? ['*'])
80  ->setIgnoredExtensions($this->fileExtensionFilter->getDisallowedFileExtensions() ?? [])
81  );
82  $this->resourceSelectableMatcher = GeneralUtility::makeInstance(Matcher::class);
83  $this->resourceSelectableMatcher->addMatcher(
84  GeneralUtility::makeInstance(ResourceFileExtensionMatcher::class)
85  ->setExtensions($this->fileExtensionFilter->getAllowedFileExtensions() ?? ['*'])
86  ->setIgnoredExtensions($this->fileExtensionFilter->getDisallowedFileExtensions() ?? [])
87  );
88  }
89 
90  public function ‪render(): string
91  {
92  $this->‪initSelectedFolder();
93  $contentHtml = '';
94 
95  if ($this->selectedFolder instanceof ‪Folder) {
96  $markup = [];
97 
98  // Prepare search box, since the component should always be displayed, even if no files are available
99  $markup[] = '<div class="mb-4">';
100  $markup[] = GeneralUtility::makeInstance(RecordSearchBoxComponent::class)
101  ->setSearchWord($this->searchWord ?? '')
102  ->render($this->‪getRequest(), $this->‪createUri());
103  $markup[] = '</div>';
104 
105  // Create the filelist header bar
106  $markup[] = '<div class="row justify-content-between mb-2">';
107  $markup[] = ' <div class="col-auto">';
108  $markup[] = ' <div class="hidden t3js-multi-record-selection-actions">';
109  $markup[] = ' <strong>' . htmlspecialchars($this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.selection')) . '</strong>';
110  $markup[] = ' <button type="button" class="btn btn-default btn-sm" data-multi-record-selection-action="import" title="' . htmlspecialchars($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:importSelection')) . '">';
111  $markup[] = ' ' . $this->iconFactory->getIcon('actions-document-import-t3d', IconSize::SMALL);
112  $markup[] = ' ' . htmlspecialchars($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:importSelection'));
113  $markup[] = ' </button>';
114  $markup[] = ' </div>';
115  $markup[] = ' </div>';
116  $markup[] = ' <div class="col-auto">';
117  $markup[] = ' ' . $this->‪getViewModeButton();
118  $markup[] = ' </div>';
119  $markup[] = '</div>';
120 
121  // Create the filelist
122  $this->filelist->start(
123  $this->selectedFolder,
124  ‪MathUtility::forceIntegerInRange($this->currentPage, 1, 100000),
125  $this->‪getRequest()->getQueryParams()['sort'] ?? '',
126  ($this->‪getRequest()->getQueryParams()['reverse'] ?? '') === '1',
127  Mode::BROWSE
128  );
129  $this->filelist->setResourceDisplayMatcher($this->resourceDisplayMatcher);
130  $this->filelist->setResourceSelectableMatcher($this->resourceSelectableMatcher);
131  ‪$searchDemand = $this->searchWord !== ''
132  ? ‪FileSearchDemand::createForSearchTerm($this->searchWord)->withFolder($this->selectedFolder)->withRecursive()
133  : null;
134  $markup[] = $this->filelist->render(‪$searchDemand, $this->view);
135 
136  // Build the file upload and folder creation form
137  $folderUtilityRenderer = GeneralUtility::makeInstance(FolderUtilityRenderer::class, $this);
138  $markup[] = $folderUtilityRenderer->uploadForm($this->‪getRequest(), $this->selectedFolder, $this->fileExtensionFilter);
139  $markup[] = $folderUtilityRenderer->createFolder($this->‪getRequest(), $this->selectedFolder);
140 
141  $contentHtml = implode('', $markup);
142  }
143 
144  $contentOnly = (bool)($this->‪getRequest()->getQueryParams()['contentOnly'] ?? false);
145  $this->pageRenderer->setTitle($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:fileSelector'));
146  $this->view->assign('selectedFolder', $this->selectedFolder);
147  $this->view->assign('content', $contentHtml);
148  $this->view->assign('contentOnly', $contentOnly);
149 
150  $content = $this->view->render('ElementBrowser/Files');
151  if ($contentOnly) {
152  return $content;
153  }
154  $this->pageRenderer->setBodyContent('<body ' . $this->‪getBodyTagParameters() . '>' . $content);
155  return $this->pageRenderer->render();
156  }
157 }
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser\$identifier
‪string $identifier
Definition: FileBrowser.php:42
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser\initVariables
‪initVariables(ServerRequestInterface $request)
Definition: FileBrowser.php:57
‪TYPO3\CMS\Filelist\Matcher\ResourceFolderTypeMatcher
Definition: ResourceFolderTypeMatcher.php:27
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser\$fileExtensionFilter
‪FileExtensionFilter $fileExtensionFilter
Definition: FileBrowser.php:45
‪TYPO3\CMS\Filelist\Matcher\ResourceFileExtensionMatcher
Definition: ResourceFileExtensionMatcher.php:26
‪TYPO3\CMS\Filelist\ElementBrowser\AbstractResourceBrowser\initSelectedFolder
‪initSelectedFolder()
Definition: AbstractResourceBrowser.php:103
‪TYPO3\CMS\Filelist\ElementBrowser
Definition: AbstractResourceBrowser.php:18
‪TYPO3\CMS\Filelist\Matcher\Matcher
Definition: Matcher.php:24
‪TYPO3\CMS\Filelist\ElementBrowser\AbstractResourceBrowser\createUri
‪createUri(array $parameters=[])
Definition: AbstractResourceBrowser.php:169
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser\$searchDemand
‪FileSearchDemand $searchDemand
Definition: FileBrowser.php:46
‪TYPO3\CMS\Backend\ElementBrowser\AbstractElementBrowser\getBodyTagParameters
‪getBodyTagParameters()
Definition: AbstractElementBrowser.php:104
‪TYPO3\CMS\Core\Resource\Search\FileSearchDemand
Definition: FileSearchDemand.php:26
‪TYPO3\CMS\Core\Resource\Folder
Definition: Folder.php:38
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser\initialize
‪initialize(ServerRequestInterface $request)
Definition: FileBrowser.php:51
‪TYPO3\CMS\Backend\ElementBrowser\AbstractElementBrowser\getLanguageService
‪getLanguageService()
Definition: AbstractElementBrowser.php:156
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser\IDENTIFIER
‪const IDENTIFIER
Definition: FileBrowser.php:41
‪TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter
Definition: FileExtensionFilter.php:31
‪TYPO3\CMS\Filelist\Type\Mode
‪Mode
Definition: Mode.php:24
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser\$searchWord
‪string $searchWord
Definition: FileBrowser.php:44
‪TYPO3\CMS\Backend\ElementBrowser\AbstractElementBrowser\getRequest
‪getRequest()
Definition: AbstractElementBrowser.php:151
‪TYPO3\CMS\Backend\View\RecordSearchBoxComponent
Definition: RecordSearchBoxComponent.php:28
‪TYPO3\CMS\Filelist\ElementBrowser\AbstractResourceBrowser\getViewModeButton
‪getViewModeButton()
Definition: AbstractResourceBrowser.php:120
‪TYPO3\CMS\Backend\View\FolderUtilityRenderer
Definition: FolderUtilityRenderer.php:36
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:24
‪TYPO3\CMS\Core\Utility\MathUtility\forceIntegerInRange
‪static int forceIntegerInRange(mixed $theInt, int $min, int $max=2000000000, int $defaultValue=0)
Definition: MathUtility.php:34
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Resource\Search\FileSearchDemand\createForSearchTerm
‪static createForSearchTerm(string $searchTerm)
Definition: FileSearchDemand.php:70
‪TYPO3\CMS\Filelist\ElementBrowser\AbstractResourceBrowser
Definition: AbstractResourceBrowser.php:42
‪TYPO3\CMS\Backend\ElementBrowser\AbstractElementBrowser\$request
‪ServerRequestInterface $request
Definition: AbstractElementBrowser.php:65
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser
Definition: FileBrowser.php:40
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode(string $delim, string $string, bool $removeEmptyValues=false, int $limit=0)
Definition: GeneralUtility.php:822
‪TYPO3\CMS\Filelist\ElementBrowser\FileBrowser\render
‪render()
Definition: FileBrowser.php:90