TYPO3 CMS  TYPO3_8-7
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 
31 
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  GeneralUtility::makeInstance(PageRenderer::class)->loadRequireJsModule('TYPO3/CMS/Recordlist/FileLinkHandler');
100 
102  $folderTree = GeneralUtility::makeInstance(ElementBrowserFolderTreeView::class);
103  $folderTree->setLinkParameterProvider($this);
104  $this->view->assign('tree', $folderTree->getBrowsableTree());
105 
106  $this->expandFolder = isset($request->getQueryParams()['expandFolder']) ? $request->getQueryParams()['expandFolder'] : null;
107  if (!empty($this->linkParts) && !isset($this->expandFolder)) {
108  $this->expandFolder = $this->linkParts['url'][$this->mode];
109  if ($this->expandFolder instanceof File) {
110  $this->expandFolder = $this->expandFolder->getParentFolder();
111  }
112  if ($this->expandFolder instanceof Folder) {
113  $this->expandFolder = $this->expandFolder->getCombinedIdentifier();
114  }
115  }
116 
117  // Create upload/create folder forms, if a path is given
118  $selectedFolder = $this->getSelectedFolder($this->expandFolder);
119 
120  // Build the file upload and folder creation form
121  if ($selectedFolder) {
122  $folderUtilityRenderer = GeneralUtility::makeInstance(FolderUtilityRenderer::class, $this);
123  $uploadForm = $this->mode === 'file' ? $folderUtilityRenderer->uploadForm($selectedFolder, []) : '';
124  $createFolder = $folderUtilityRenderer->createFolder($selectedFolder);
125 
126  $this->view->assign('uploadFileForm', $uploadForm);
127  $this->view->assign('createFolderForm', $createFolder);
128 
129  // Render the file or folderlist
130  if ($selectedFolder->checkActionPermission('read')) {
131  $this->view->assign('selectedFolder', $selectedFolder);
132  $parameters = $this->linkBrowser->getParameters();
133  $allowedExtensions = $parameters['params']['allowedExtensions'] ?? '';
134  $this->expandFolder($selectedFolder, $allowedExtensions);
135  }
136  }
137 
138  return $this->view->render(ucfirst($this->mode));
139  }
140 
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  if ($this->mode === 'file') {
155  $this->view->assign('currentIdentifier', !empty($this->linkParts) ? $this->linkParts['url']['file']->getUid() : '');
156  } else {
157  $this->view->assign('currentIdentifier', !empty($this->linkParts) ? $this->linkParts['url']['folder']->getCombinedIdentifier() : '');
158  }
159 
160  // Get files from the folder:
161  $fileObjects = $this->getFolderContent($folder, $extensionList);
162  $itemsInSelectedFolder = [];
163  if (!empty($fileObjects)) {
164  foreach ($fileObjects as $fileOrFolderObject) {
165  $itemsInSelectedFolder[] = $this->renderItem($fileOrFolderObject);
166  }
167  }
168  $this->view->assign('itemsInSelectedFolder', $itemsInSelectedFolder);
169  }
170 
177  protected function getFolderContent(Folder $folder, $extensionList)
178  {
179  if ($extensionList !== '') {
181  $filter = GeneralUtility::makeInstance(FileExtensionFilter::class);
182  $filter->setAllowedFileExtensions($extensionList);
183  $folder->setFileAndFolderNameFilters([[$filter, 'filterFileList']]);
184  }
185  return $folder->getFiles();
186  }
187 
196  protected function renderItem(ResourceInterface $fileOrFolderObject)
197  {
198  if (!$fileOrFolderObject instanceof File) {
199  throw new \InvalidArgumentException('Expected File object, got "' . get_class($fileOrFolderObject) . '" object.', 1443651368);
200  }
201  // Get size and icon:
203  $fileOrFolderObject->getSize(),
204  $this->getLanguageService()->sL('LLL:EXT:lang/Resources/Private/Language/locallang_common.xlf:byteSizeUnits')
205  );
206 
207  return [
208  'icon' => $this->iconFactory->getIconForResource($fileOrFolderObject, Icon::SIZE_SMALL)->render(),
209  'uid' => $fileOrFolderObject->getUid(),
210  'size' => $size,
211  'name' => $fileOrFolderObject->getName(),
212  'url' => GeneralUtility::makeInstance(LinkService::class)->asString(['type' => LinkService::TYPE_FILE, 'file' => $fileOrFolderObject]),
213  'title' => GeneralUtility::fixed_lgd_cs($fileOrFolderObject->getName(), (int)$this->getBackendUser()->uc['titleLen'])
214  ];
215  }
216 
220  public function getBodyTagAttributes()
221  {
222  return [
223  'data-current-link' => GeneralUtility::makeInstance(LinkService::class)->asString(['type' => LinkService::TYPE_FILE, 'file' => $this->linkParts['url']['file']])
224  ];
225  }
226 
232  public function getUrlParameters(array $values)
233  {
234  $parameters = [
235  'expandFolder' => $values['identifier'] ?? $this->expandFolder
236  ];
237  return array_merge($this->linkBrowser->getUrlParameters($values), $parameters);
238  }
239 
245  public function isCurrentlySelectedItem(array $values)
246  {
247  return false;
248  }
249 
255  public function getScriptUrl()
256  {
257  return $this->linkBrowser->getScriptUrl();
258  }
259 
266  protected function getSelectedFolder($folderIdentifier = '')
267  {
268  $selectedFolder = false;
269  if ($folderIdentifier) {
270  try {
271  $fileOrFolderObject = ResourceFactory::getInstance()->retrieveFileOrFolderObject($folderIdentifier);
272  if ($fileOrFolderObject instanceof Folder) {
273  // It's a folder
274  $selectedFolder = $fileOrFolderObject;
275  } elseif ($fileOrFolderObject instanceof FileInterface) {
276  // It's a file
277  try {
278  $selectedFolder = $fileOrFolderObject->getParentFolder();
279  } catch (\Exception $e) {
280  // Accessing the parent folder failed for some reason. e.g. permissions
281  }
282  }
283  } catch (\Exception $e) {
284  // No path is selected
285  }
286  }
287 
288  // If no folder is selected, get the user's default upload folder
289  if (!$selectedFolder) {
290  try {
291  $selectedFolder = $this->getBackendUser()->getDefaultUploadFolder();
292  } catch (\Exception $e) {
293  // The configured default user folder does not exist
294  }
295  }
296  return $selectedFolder;
297  }
298 }
setFileAndFolderNameFilters(array $filters)
Definition: Folder.php:494
static makeInstance($className,... $constructorArguments)
getFiles($start=0, $numberOfItems=0, $filterMode=self::FILTER_MODE_USE_OWN_AND_STORAGE_FILTERS, $recursive=false, $sort='', $sortRev=false)
Definition: Folder.php:217
static fixed_lgd_cs($string, $chars, $appendString='...')
static formatSize($sizeInBytes, $labels='', $base=0)