‪TYPO3CMS  9.5
FileLinkHandler.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
17 use Psr\Http\Message\ServerRequestInterface;
31 
37 {
43  protected ‪$linkParts = [];
44 
48  protected ‪$expectedClass = File::class;
49 
53  protected ‪$mode = 'file';
54 
58  protected ‪$expandFolder;
59 
69  public function ‪canHandleLink(array ‪$linkParts)
70  {
71  if (!‪$linkParts['url']) {
72  return false;
73  }
74  if (isset(‪$linkParts['url'][$this->mode]) && ‪$linkParts['url'][$this->mode] instanceof $this->expectedClass) {
75  $this->linkParts = ‪$linkParts;
76  return true;
77  }
78  return false;
79  }
80 
86  public function ‪formatCurrentUrl()
87  {
88  return $this->linkParts['url'][‪$this->mode]->getName();
89  }
90 
98  public function ‪render(ServerRequestInterface $request)
99  {
100  GeneralUtility::makeInstance(PageRenderer::class)->loadRequireJsModule('TYPO3/CMS/Recordlist/FileLinkHandler');
101 
103  $folderTree = GeneralUtility::makeInstance(ElementBrowserFolderTreeView::class);
104  $folderTree->setLinkParameterProvider($this);
105  $this->view->assign('tree', $folderTree->getBrowsableTree());
106 
107  $this->‪expandFolder = $request->getQueryParams()['expandFolder'] ?? null;
108  if (!empty($this->linkParts) && !isset($this->‪expandFolder)) {
109  $this->‪expandFolder = $this->linkParts['url'][‪$this->mode];
110  if ($this->‪expandFolder instanceof File) {
111  $this->‪expandFolder = $this->‪expandFolder->getParentFolder();
112  }
113  if ($this->‪expandFolder instanceof Folder) {
114  $this->‪expandFolder = $this->‪expandFolder->getCombinedIdentifier();
115  }
116  }
117 
118  // Create upload/create folder forms, if a path is given
119  $selectedFolder = $this->‪getSelectedFolder($this->‪expandFolder);
120 
121  // Build the file upload and folder creation form
122  if ($selectedFolder) {
123  $folderUtilityRenderer = GeneralUtility::makeInstance(FolderUtilityRenderer::class, $this);
124  $uploadForm = $this->mode === 'file' ? $folderUtilityRenderer->uploadForm($selectedFolder, []) : '';
125  $createFolder = $folderUtilityRenderer->createFolder($selectedFolder);
126 
127  $this->view->assign('uploadFileForm', $uploadForm);
128  $this->view->assign('createFolderForm', $createFolder);
129 
130  // Render the file or folderlist
131  if ($selectedFolder->checkActionPermission('read')) {
132  $this->view->assign('selectedFolder', $selectedFolder);
133  $parameters = $this->linkBrowser->getParameters();
134  $allowedExtensions = $parameters['params']['allowedExtensions'] ?? '';
135  $this->‪expandFolder($selectedFolder, $allowedExtensions);
136  }
137  }
138 
139  return $this->view->render(ucfirst($this->mode));
140  }
141 
148  public function ‪expandFolder(Folder $folder, $extensionList = '')
149  {
150  // Create header element; The folder from which files are listed.
151  $folderIcon = $this->iconFactory->getIconForResource($folder, ‪Icon::SIZE_SMALL)->render();
152  $this->view->assign('selectedFolderIcon', $folderIcon);
153  $this->view->assign('selectedFolderTitle', GeneralUtility::fixed_lgd_cs($folder->getIdentifier(), (int)$this->getBackendUser()->uc['titleLen']));
154  $this->view->assign('selectedFolderUrl', GeneralUtility::makeInstance(LinkService::class)->asString(['type' => ‪LinkService::TYPE_FOLDER, 'folder' => $folder]));
155  if ($this->mode === 'file') {
156  $this->view->assign('currentIdentifier', !empty($this->linkParts) ? $this->linkParts['url']['file']->getUid() : '');
157  } else {
158  $this->view->assign('currentIdentifier', !empty($this->linkParts) ? $this->linkParts['url']['folder']->getCombinedIdentifier() : '');
159  }
160 
161  // Get files from the folder:
162  $fileObjects = $this->‪getFolderContent($folder, $extensionList);
163  $itemsInSelectedFolder = [];
164  if (!empty($fileObjects)) {
165  foreach ($fileObjects as $fileOrFolderObject) {
166  $itemsInSelectedFolder[] = $this->‪renderItem($fileOrFolderObject);
167  }
168  }
169  $this->view->assign('itemsInSelectedFolder', $itemsInSelectedFolder);
170  }
171 
178  protected function ‪getFolderContent(Folder $folder, $extensionList)
179  {
180  if ($extensionList !== '') {
182  $filter = GeneralUtility::makeInstance(FileExtensionFilter::class);
183  $filter->setAllowedFileExtensions($extensionList);
184  $folder->setFileAndFolderNameFilters([[$filter, 'filterFileList']]);
185  }
186  return $folder->getFiles();
187  }
188 
197  protected function ‪renderItem(ResourceInterface $fileOrFolderObject)
198  {
199  if (!$fileOrFolderObject instanceof File) {
200  throw new \InvalidArgumentException('Expected File object, got "' . get_class($fileOrFolderObject) . '" object.', 1443651368);
201  }
202  // Get size and icon:
203  $size = GeneralUtility::formatSize(
204  $fileOrFolderObject->getSize(),
205  $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:byteSizeUnits')
206  );
207 
208  return [
209  'icon' => $this->iconFactory->getIconForResource($fileOrFolderObject, ‪Icon::SIZE_SMALL)->render(),
210  'uid' => $fileOrFolderObject->getUid(),
211  'size' => $size,
212  'name' => $fileOrFolderObject->getName(),
213  'url' => GeneralUtility::makeInstance(LinkService::class)->asString(['type' => ‪LinkService::TYPE_FILE, 'file' => $fileOrFolderObject]),
214  'title' => GeneralUtility::fixed_lgd_cs($fileOrFolderObject->getName(), (int)$this->getBackendUser()->uc['titleLen'])
215  ];
216  }
217 
221  public function ‪getBodyTagAttributes()
222  {
223  return [
224  'data-current-link' => GeneralUtility::makeInstance(LinkService::class)->asString(['type' => ‪LinkService::TYPE_FILE, 'file' => $this->linkParts['url']['file']])
225  ];
226  }
227 
233  public function ‪getUrlParameters(array $values)
234  {
235  $parameters = [
236  'expandFolder' => $values['identifier'] ?? ‪$this->expandFolder
237  ];
238  return array_merge($this->linkBrowser->getUrlParameters($values), $parameters);
239  }
240 
246  public function ‪isCurrentlySelectedItem(array $values)
247  {
248  return false;
249  }
250 
256  public function ‪getScriptUrl()
257  {
258  return $this->linkBrowser->getScriptUrl();
259  }
260 
267  protected function ‪getSelectedFolder($folderIdentifier = '')
268  {
269  $selectedFolder = false;
270  if ($folderIdentifier) {
271  try {
272  $fileOrFolderObject = ‪ResourceFactory::getInstance()->‪retrieveFileOrFolderObject($folderIdentifier);
273  if ($fileOrFolderObject instanceof Folder) {
274  // It's a folder
275  $selectedFolder = $fileOrFolderObject;
276  } elseif ($fileOrFolderObject instanceof FileInterface) {
277  // It's a file
278  try {
279  $selectedFolder = $fileOrFolderObject->‪getParentFolder();
280  } catch (\Exception $e) {
281  // Accessing the parent folder failed for some reason. e.g. permissions
282  }
283  }
284  } catch (\Exception $e) {
285  // No path is selected
286  }
287  }
288 
289  // If no folder is selected, get the user's default upload folder
290  if (!$selectedFolder) {
291  try {
292  $selectedFolder = $this->‪getBackendUser()->‪getDefaultUploadFolder();
293  } catch (\Exception $e) {
294  // The configured default user folder does not exist
295  }
296  }
297  return $selectedFolder;
298  }
299 }
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:29
‪TYPO3\CMS\Core\Resource\FileInterface
Definition: FileInterface.php:21
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:25
‪TYPO3\CMS\Backend\Tree\View\ElementBrowserFolderTreeView
Definition: ElementBrowserFolderTreeView.php:31
‪TYPO3\CMS\Core\Resource\ResourceFactory\getInstance
‪static ResourceFactory getInstance()
Definition: ResourceFactory.php:39
‪TYPO3\CMS\Core\Page\PageRenderer
Definition: PageRenderer.php:35
‪TYPO3\CMS\Core\Resource\Folder
Definition: Folder.php:34
‪TYPO3\CMS\Core\Resource\ResourceFactory
Definition: ResourceFactory.php:33
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:23
‪TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter
Definition: FileExtensionFilter.php:28
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication\getDefaultUploadFolder
‪TYPO3 CMS Core Resource Folder bool getDefaultUploadFolder($pid=null, $table=null, $field=null)
Definition: BackendUserAuthentication.php:2000
‪TYPO3\CMS\Core\Resource\Folder\getFiles
‪TYPO3 CMS Core Resource File[] getFiles($start=0, $numberOfItems=0, $filterMode=self::FILTER_MODE_USE_OWN_AND_STORAGE_FILTERS, $recursive=false, $sort='', $sortRev=false)
Definition: Folder.php:215
‪TYPO3\CMS\Core\Resource\AbstractFile\getParentFolder
‪FolderInterface getParentFolder()
Definition: AbstractFile.php:573
‪TYPO3\CMS\Core\Resource\ResourceInterface\getName
‪string getName()
‪TYPO3\CMS\Core\Resource\Folder\setFileAndFolderNameFilters
‪setFileAndFolderNameFilters(array $filters)
Definition: Folder.php:509
‪TYPO3\CMS\Core\Resource\Folder\getIdentifier
‪string getIdentifier()
Definition: Folder.php:157
‪TYPO3\CMS\Recordlist\View\FolderUtilityRenderer
Definition: FolderUtilityRenderer.php:31
‪TYPO3\CMS\Core\Resource\ResourceInterface
Definition: ResourceInterface.php:21
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:45
‪TYPO3\CMS\Core\Resource\ResourceFactory\retrieveFileOrFolderObject
‪File Folder null retrieveFileOrFolderObject($input)
Definition: ResourceFactory.php:491