‪TYPO3CMS  11.5
FileCollector.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\Log\LoggerAwareInterface;
19 use Psr\Log\LoggerAwareTrait;
30 
40 class ‪FileCollector implements \Countable, LoggerAwareInterface
41 {
42  use LoggerAwareTrait;
43 
49  protected ‪$files = [];
50 
56  protected ‪$fileRepository;
57 
64 
70  protected ‪$resourceFactory;
71 
77  public function ‪addFiles(array $fileUids = [])
78  {
79  if (!empty($fileUids)) {
80  foreach ($fileUids as $fileUid) {
81  try {
82  $this->‪addFileObject($this->‪getResourceFactory()->getFileObject($fileUid));
83  } catch (‪Exception $e) {
84  $this->logger->warning(
85  'The file with uid "' . $fileUid
86  . '" could not be found and won\'t be included in frontend output',
87  ['exception' => $e]
88  );
89  }
90  }
91  }
92  }
93 
101  public function ‪addFilesFromRelation($relationTable, $relationField, array $referenceRecord)
102  {
103  $fileReferences = $this->‪getFileReferences($relationTable, $relationField, $referenceRecord);
104  if (!empty($fileReferences)) {
105  $this->‪addFileObjects($fileReferences);
106  }
107  }
108 
114  public function ‪addFileReferences(array $fileReferenceUids = [])
115  {
116  foreach ($fileReferenceUids as $fileReferenceUid) {
117  $fileObject = $this->‪getFileRepository()->‪findFileReferenceByUid($fileReferenceUid);
118  if (!$fileObject instanceof ‪FileInterface) {
119  continue;
120  }
121  $this->‪addFileObject($fileObject);
122  }
123  }
124 
130  public function ‪addFilesFromFileCollections(array $fileCollectionUids = [])
131  {
132  foreach ($fileCollectionUids as $fileCollectionUid) {
133  $this->‪addFilesFromFileCollection($fileCollectionUid);
134  }
135  }
136 
142  public function ‪addFilesFromFileCollection($fileCollectionUid = null)
143  {
144  if (!empty($fileCollectionUid)) {
145  try {
146  $fileCollection = $this->‪getFileCollectionRepository()->‪findByUid($fileCollectionUid);
147 
148  if ($fileCollection instanceof ‪AbstractFileCollection) {
149  $fileCollection->loadContents();
150  ‪$files = $fileCollection->getItems();
151 
153  }
154  } catch (‪Exception $e) {
155  $this->logger->warning(
156  'The file-collection with uid "' . $fileCollectionUid
157  . '" could not be found or contents could not be loaded and won\'t be included in frontend output.',
158  ['exception' => $e]
159  );
160  }
161  }
162  }
163 
170  public function ‪addFilesFromFolders(array $folderIdentifiers = [], $recursive = false)
171  {
172  foreach ($folderIdentifiers as $folderIdentifier) {
173  $this->‪addFilesFromFolder($folderIdentifier, $recursive);
174  }
175  }
176 
183  public function ‪addFilesFromFolder($folderIdentifier, $recursive = false)
184  {
185  if ($folderIdentifier) {
186  try {
187  if (strpos($folderIdentifier, 't3://folder') === 0) {
188  // a t3://folder link to a folder in FAL
189  $linkService = GeneralUtility::makeInstance(LinkService::class);
190  $data = $linkService->resolveByStringRepresentation($folderIdentifier);
191  $folder = $data['folder'];
192  } else {
193  $folder = $this->‪getResourceFactory()->‪getFolderObjectFromCombinedIdentifier($folderIdentifier);
194  }
195  if ($folder instanceof ‪Folder) {
196  ‪$files = $folder->getFiles(0, 0, ‪Folder::FILTER_MODE_USE_OWN_AND_STORAGE_FILTERS, $recursive);
197  $this->‪addFileObjects(array_values(‪$files));
198  }
199  } catch (‪Exception $e) {
200  $this->logger->warning('The folder with identifier "{folder}" could not be found and won\'t be included in frontend output', [
201  'folder' => $folderIdentifier,
202  'exception' => $e,
203  ]);
204  }
205  }
206  }
207 
214  public function ‪sort($sortingProperty = '', $sortingOrder = 'ascending')
215  {
216  if ($sortingProperty !== '' && ‪count($this->files) > 1) {
217  @usort(
218  $this->files,
219  static function (
220  ‪FileInterface $a,
222  ) use ($sortingProperty) {
223  if ($a->‪hasProperty($sortingProperty) && $b->‪hasProperty($sortingProperty)) {
224  return strnatcasecmp($a->getProperty($sortingProperty), $b->getProperty($sortingProperty));
225  }
226  return 0;
227  }
228  );
229 
230  switch (strtolower($sortingOrder)) {
231  case 'descending':
232  case 'desc':
233  $this->files = array_reverse($this->files);
234  break;
235  case 'random':
236  case 'rand':
237  shuffle($this->files);
238  break;
239  }
240  }
241  }
242 
248  public function ‪addFileObject(‪FileInterface $file)
249  {
250  $this->files[] = $file;
251  }
252 
258  public function ‪addFileObjects(‪$files)
259  {
260  $this->files = array_merge($this->files, ‪$files);
261  }
262 
268  public function ‪getFiles()
269  {
270  return ‪$this->files;
271  }
272 
276  public function ‪count(): int
277  {
278  return ‪count($this->files);
279  }
280 
290  protected function ‪getFileReferences($tableName, $fieldName, array $element): array
291  {
292  ‪$fileRepository = GeneralUtility::makeInstance(FileRepository::class);
293  $currentId = !empty($element['uid']) ? $element['uid'] : 0;
294 
295  // Fetch the references of the default element
296  try {
297  $references = ‪$fileRepository->‪findByRelation($tableName, $fieldName, $currentId);
298  } catch (FileDoesNotExistException $e) {
303  return [];
304  } catch (\InvalidArgumentException $e) {
309  $this->logger->error('{exception_message}: table: {table}, field: {field}, currentId: {current_id}', [
310  'table' => $tableName,
311  'field' => $fieldName,
312  'currentId' => $currentId,
313  'exception' => $e,
314  ]);
315  return [];
316  }
317 
318  $localizedId = null;
319  if (isset($element['_LOCALIZED_UID'])) {
320  $localizedId = $element['_LOCALIZED_UID'];
321  } elseif (isset($element['_PAGES_OVERLAY_UID'])) {
322  $localizedId = $element['_PAGES_OVERLAY_UID'];
323  }
324 
325  $isTableLocalizable = (
326  !empty(‪$GLOBALS['TCA'][$tableName]['ctrl']['languageField'])
327  && !empty(‪$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'])
328  );
329  if ($isTableLocalizable && $localizedId !== null) {
330  $localizedReferences = ‪$fileRepository->‪findByRelation($tableName, $fieldName, $localizedId);
331  $references = $localizedReferences;
332  }
333 
334  return $references;
335  }
336 
340  protected function ‪getResourceFactory()
341  {
342  if ($this->resourceFactory === null) {
343  $this->resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
344  }
346  }
347 
351  protected function ‪getFileCollectionRepository()
352  {
353  if ($this->fileCollectionRepository === null) {
354  $this->fileCollectionRepository = GeneralUtility::makeInstance(FileCollectionRepository::class);
355  }
357  }
358 
362  protected function ‪getFileRepository()
363  {
364  if ($this->fileRepository === null) {
365  $this->fileRepository = GeneralUtility::makeInstance(FileRepository::class);
366  }
368  }
369 }
‪TYPO3\CMS\Core\Resource\FileCollectionRepository
Definition: FileCollectionRepository.php:30
‪TYPO3\CMS\Core\Resource\Collection\AbstractFileCollection
Definition: AbstractFileCollection.php:28
‪TYPO3\CMS\Frontend\Resource\FileCollector\$resourceFactory
‪TYPO3 CMS Core Resource ResourceFactory $resourceFactory
Definition: FileCollector.php:66
‪TYPO3\CMS\Core\Resource\FileInterface
Definition: FileInterface.php:22
‪TYPO3\CMS\Core\Resource\FileInterface\hasProperty
‪bool hasProperty($key)
‪TYPO3\CMS\Frontend\Resource
Definition: FileCollector.php:16
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFiles
‪addFiles(array $fileUids=[])
Definition: FileCollector.php:73
‪TYPO3\CMS\Core\Resource\ResourceFactory\getFolderObjectFromCombinedIdentifier
‪Folder getFolderObjectFromCombinedIdentifier($identifier)
Definition: ResourceFactory.php:347
‪TYPO3\CMS\Frontend\Resource\FileCollector\getFileCollectionRepository
‪FileCollectionRepository getFileCollectionRepository()
Definition: FileCollector.php:347
‪TYPO3\CMS\Core\Resource\Folder\FILTER_MODE_USE_OWN_AND_STORAGE_FILTERS
‪const FILTER_MODE_USE_OWN_AND_STORAGE_FILTERS
Definition: Folder.php:69
‪TYPO3\CMS\Core\Resource\Exception\FileDoesNotExistException
Definition: FileDoesNotExistException.php:21
‪TYPO3\CMS\Frontend\Resource\FileCollector\getFiles
‪array getFiles()
Definition: FileCollector.php:264
‪TYPO3\CMS\Frontend\Resource\FileCollector\$fileCollectionRepository
‪TYPO3 CMS Core Resource FileCollectionRepository $fileCollectionRepository
Definition: FileCollector.php:60
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFileObjects
‪addFileObjects($files)
Definition: FileCollector.php:254
‪TYPO3\CMS\Frontend\Resource\FileCollector
Definition: FileCollector.php:41
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFileReferences
‪addFileReferences(array $fileReferenceUids=[])
Definition: FileCollector.php:110
‪TYPO3\CMS\Frontend\Resource\FileCollector\$fileRepository
‪TYPO3 CMS Core Resource FileRepository $fileRepository
Definition: FileCollector.php:54
‪TYPO3\CMS\Frontend\Resource\FileCollector\count
‪int count()
Definition: FileCollector.php:272
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFilesFromFileCollection
‪addFilesFromFileCollection($fileCollectionUid=null)
Definition: FileCollector.php:138
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFilesFromFolder
‪addFilesFromFolder($folderIdentifier, $recursive=false)
Definition: FileCollector.php:179
‪TYPO3\CMS\Core\Resource\FileRepository
Definition: FileRepository.php:33
‪TYPO3\CMS\Frontend\Resource\FileCollector\getFileRepository
‪FileRepository getFileRepository()
Definition: FileCollector.php:358
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFileObject
‪addFileObject(FileInterface $file)
Definition: FileCollector.php:244
‪TYPO3\CMS\Core\Resource\Folder
Definition: Folder.php:37
‪TYPO3\CMS\Core\Resource\ResourceFactory
Definition: ResourceFactory.php:41
‪TYPO3\CMS\Frontend\Resource\FileCollector\$files
‪array $files
Definition: FileCollector.php:48
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFilesFromRelation
‪addFilesFromRelation($relationTable, $relationField, array $referenceRecord)
Definition: FileCollector.php:97
‪TYPO3\CMS\Frontend\Resource\FileCollector\sort
‪sort($sortingProperty='', $sortingOrder='ascending')
Definition: FileCollector.php:210
‪TYPO3\CMS\Core\Resource\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Frontend\Resource\FileCollector\getResourceFactory
‪ResourceFactory getResourceFactory()
Definition: FileCollector.php:336
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFilesFromFolders
‪addFilesFromFolders(array $folderIdentifiers=[], $recursive=false)
Definition: FileCollector.php:166
‪TYPO3\CMS\Frontend\Resource\FileCollector\addFilesFromFileCollections
‪addFilesFromFileCollections(array $fileCollectionUids=[])
Definition: FileCollector.php:126
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Resource\FileRepository\findFileReferenceByUid
‪FileReference bool findFileReferenceByUid($uid)
Definition: FileRepository.php:148
‪TYPO3\CMS\Core\Resource\FileRepository\findByRelation
‪array findByRelation($tableName, $fieldName, $uid, int $workspaceId=null)
Definition: FileRepository.php:70
‪TYPO3\CMS\Frontend\Resource\FileCollector\getFileReferences
‪array getFileReferences($tableName, $fieldName, array $element)
Definition: FileCollector.php:286
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Resource\FileCollectionRepository\findByUid
‪Collection AbstractFileCollection null findByUid($uid)
Definition: FileCollectionRepository.php:46
‪TYPO3\CMS\Core\Resource\Exception
Definition: AbstractFileOperationException.php:16