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