‪TYPO3CMS  11.5
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;
30 
36 {
42  protected ‪$linkParts = [];
43 
47  protected ‪$expectedClass = File::class;
48 
52  protected ‪$mode = 'file';
53 
57  protected ‪$expandFolder;
58 
68  public function ‪canHandleLink(array ‪$linkParts)
69  {
70  if (!‪$linkParts['url']) {
71  return false;
72  }
73  if (isset(‪$linkParts['url'][$this->mode]) && ‪$linkParts['url'][$this->mode] instanceof $this->expectedClass) {
74  $this->linkParts = ‪$linkParts;
75  return true;
76  }
77  return false;
78  }
79 
85  public function ‪formatCurrentUrl()
86  {
87  return $this->linkParts['url'][‪$this->mode]->getName();
88  }
89 
97  public function ‪render(ServerRequestInterface $request)
98  {
99  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Recordlist/FileLinkHandler');
100  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/Viewport/ResizableNavigation');
101  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/Tree/FileStorageBrowser');
102 
103  $this->view->assign('initialNavigationWidth', $this->‪getBackendUser()->uc['selector']['navigation']['width'] ?? 250);
104  $this->view->assign('contentOnly', (bool)($request->getQueryParams()['contentOnly'] ?? false));
105  $this->view->assign('treeActions', ($this->mode === 'folder') ? ['link'] : []);
106 
107  $this->‪expandFolder = $request->getQueryParams()['expandFolder'] ?? null;
108  if (!isset($this->‪expandFolder)) {
109  if (!empty($this->linkParts)) {
110  $fileOrFolder = $this->linkParts['url'][‪$this->mode];
111  if ($fileOrFolder instanceof File) {
112  $fileOrFolder = $fileOrFolder->getParentFolder();
113  }
114  if ($fileOrFolder instanceof Folder) {
115  $this->‪expandFolder = $fileOrFolder->getCombinedIdentifier();
116  }
117  } else {
118  // Look up in the user's session which folder was opened the last time
119  $moduleSessionData = $this->‪getBackendUser()->‪getModuleData('browse_links.php', 'ses');
120  $this->‪expandFolder = $moduleSessionData['expandFolder'] ?? null;
121  }
122  }
123 
124  // Create upload/create folder forms, if a path is given
125  $selectedFolder = $this->‪getSelectedFolder($this->‪expandFolder);
126  if ($selectedFolder && $selectedFolder->getStorage()->isFallbackStorage()) {
127  $selectedFolder = false;
128  }
129 
130  // Build the file upload and folder creation form
131  if ($selectedFolder) {
132  // If a folder is found, store it in the session to continue where the editor left off the last time
133  if ($selectedFolder->checkActionPermission('read')) {
134  $moduleSessionData = $this->‪getBackendUser()->‪getModuleData('browse_links.php', 'ses') ?: [];
135  $moduleSessionData['expandFolder'] = $selectedFolder->getCombinedIdentifier();
136  $this->‪getBackendUser()->‪pushModuleData('browse_links.php', $moduleSessionData);
137  }
138 
139  $folderUtilityRenderer = GeneralUtility::makeInstance(FolderUtilityRenderer::class, $this);
140  $uploadForm = $this->mode === 'file' ? $folderUtilityRenderer->uploadForm($selectedFolder, []) : '';
141  $createFolder = $folderUtilityRenderer->createFolder($selectedFolder);
142 
143  $this->view->assign('uploadFileForm', $uploadForm);
144  $this->view->assign('createFolderForm', $createFolder);
145 
146  // Render the file or folderlist
147  if ($selectedFolder->checkActionPermission('read')) {
148  $this->view->assign('selectedFolder', $selectedFolder);
149  $parameters = $this->linkBrowser->getParameters();
150  $allowedExtensions = $parameters['params']['allowedExtensions'] ?? '';
151  $this->‪expandFolder($selectedFolder, $allowedExtensions);
152  }
153  }
154 
155  $this->view->setTemplate(ucfirst($this->mode));
156  return '';
157  }
158 
165  public function ‪expandFolder(Folder $folder, $extensionList = '')
166  {
167  // Create header element; The folder from which files are listed.
168  $folderIcon = $this->iconFactory->getIconForResource($folder, ‪Icon::SIZE_SMALL)->render();
169  $this->view->assign('selectedFolderIcon', $folderIcon);
170  $this->view->assign('selectedFolderTitle', GeneralUtility::fixed_lgd_cs($folder->getIdentifier(), (int)$this->getBackendUser()->uc['titleLen']));
171  $this->view->assign('selectedFolderUrl', GeneralUtility::makeInstance(LinkService::class)->asString(['type' => ‪LinkService::TYPE_FOLDER, 'folder' => $folder]));
172  if ($this->mode === 'file') {
173  $this->view->assign('currentIdentifier', !empty($this->linkParts) ? $this->linkParts['url']['file']->getUid() : '');
174  } else {
175  $this->view->assign('currentIdentifier', !empty($this->linkParts) ? $this->linkParts['url']['folder']->getCombinedIdentifier() : '');
176  }
177 
178  // Get files from the folder:
179  $fileObjects = $this->‪getFolderContent($folder, $extensionList);
180  $itemsInSelectedFolder = [];
181  if (!empty($fileObjects)) {
182  foreach ($fileObjects as $fileOrFolderObject) {
183  $itemsInSelectedFolder[] = $this->‪renderItem($fileOrFolderObject);
184  }
185  }
186  $this->view->assign('itemsInSelectedFolder', $itemsInSelectedFolder);
187  }
188 
195  protected function ‪getFolderContent(Folder $folder, $extensionList)
196  {
197  if ($extensionList !== '') {
198  $filter = GeneralUtility::makeInstance(FileExtensionFilter::class);
199  $filter->setAllowedFileExtensions($extensionList);
200  $folder->setFileAndFolderNameFilters([[$filter, 'filterFileList']]);
201  }
202  return $folder->getFiles();
203  }
204 
213  protected function ‪renderItem(ResourceInterface $fileOrFolderObject)
214  {
215  if (!$fileOrFolderObject instanceof File) {
216  throw new \InvalidArgumentException('Expected File object, got "' . get_class($fileOrFolderObject) . '" object.', 1443651368);
217  }
218  // Get size and icon:
219  $size = GeneralUtility::formatSize(
220  (int)$fileOrFolderObject->getSize(),
221  $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:byteSizeUnits')
222  );
223 
224  return [
225  'icon' => $this->iconFactory->getIconForResource($fileOrFolderObject, ‪Icon::SIZE_SMALL)->render(),
226  'uid' => $fileOrFolderObject->getUid(),
227  'size' => $size,
228  'name' => $fileOrFolderObject->getName(),
229  'url' => GeneralUtility::makeInstance(LinkService::class)->asString(['type' => ‪LinkService::TYPE_FILE, 'file' => $fileOrFolderObject]),
230  'title' => GeneralUtility::fixed_lgd_cs($fileOrFolderObject->getName(), (int)$this->getBackendUser()->uc['titleLen']),
231  ];
232  }
233 
237  public function ‪getBodyTagAttributes()
238  {
239  if (isset($this->linkParts['url']['file'])) {
240  return [
241  'data-current-link' => GeneralUtility::makeInstance(LinkService::class)->asString(['type' => ‪LinkService::TYPE_FILE, 'file' => $this->linkParts['url']['file']]),
242  ];
243  }
244  return [];
245  }
246 
252  public function ‪getUrlParameters(array $values)
253  {
254  $parameters = [
255  'expandFolder' => $values['identifier'] ?? ‪$this->expandFolder,
256  ];
257  return array_merge($this->linkBrowser->getUrlParameters($values), $parameters);
258  }
259 
265  public function ‪isCurrentlySelectedItem(array $values)
266  {
267  return false;
268  }
269 
275  public function ‪getScriptUrl()
276  {
277  return $this->linkBrowser->getScriptUrl();
278  }
279 
286  protected function ‪getSelectedFolder($folderIdentifier = '')
287  {
288  $selectedFolder = false;
289  if ($folderIdentifier) {
290  try {
291  $fileOrFolderObject = GeneralUtility::makeInstance(ResourceFactory::class)->retrieveFileOrFolderObject($folderIdentifier);
292  if ($fileOrFolderObject instanceof Folder) {
293  // It's a folder
294  $selectedFolder = $fileOrFolderObject;
295  } elseif ($fileOrFolderObject instanceof FileInterface) {
296  // It's a file
297  try {
298  $selectedFolder = $fileOrFolderObject->‪getParentFolder();
299  } catch (\Exception $e) {
300  // Accessing the parent folder failed for some reason. e.g. permissions
301  }
302  }
303  } catch (\Exception $e) {
304  // No path is selected
305  }
306  }
307 
308  // If no folder is selected, get the user's default upload folder
309  if (!$selectedFolder) {
310  try {
311  $selectedFolder = $this->‪getBackendUser()->‪getDefaultUploadFolder();
312  } catch (\Exception $e) {
313  // The configured default user folder does not exist
314  }
315  }
316  return $selectedFolder;
317  }
318 }
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication\getDefaultUploadFolder
‪TYPO3 CMS Core Resource Folder false getDefaultUploadFolder($pid=null, $table=null, $field=null)
Definition: BackendUserAuthentication.php:1655
‪TYPO3\CMS\Core\Resource\FileInterface
Definition: FileInterface.php:22
‪TYPO3\CMS\Core\Resource\Folder\getParentFolder
‪FolderInterface getParentFolder()
Definition: Folder.php:550
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Core\Authentication\AbstractUserAuthentication\getModuleData
‪mixed getModuleData($module, $type='')
Definition: AbstractUserAuthentication.php:1054
‪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\Authentication\AbstractUserAuthentication\pushModuleData
‪pushModuleData($module, $data, $noSave=0)
Definition: AbstractUserAuthentication.php:1034
‪TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter
Definition: FileExtensionFilter.php:28
‪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:219
‪TYPO3\CMS\Core\Resource\ResourceInterface\getName
‪string getName()
‪TYPO3\CMS\Core\Resource\Folder\setFileAndFolderNameFilters
‪setFileAndFolderNameFilters(array $filters)
Definition: Folder.php:525
‪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:50