Skip to content

Commit b2f4c63

Browse files
committed
Prevent image generation serializers from throwing error on problems with processing, missing file etc.
1 parent 47f9bbf commit b2f4c63

File tree

2 files changed

+75
-84
lines changed

2 files changed

+75
-84
lines changed

Classes/Serializer/Handler/FileReferenceHandler.php

Lines changed: 50 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use SourceBroker\T3api\Service\FileReferenceService;
1515
use SourceBroker\T3api\Service\SerializerService;
1616
use SourceBroker\T3api\Service\UrlService;
17+
use TYPO3\CMS\Core\LinkHandling\LinkService;
1718
use TYPO3\CMS\Core\Resource\FileReference as Typo3FileReference;
1819
use TYPO3\CMS\Core\Resource\Rendering\RendererRegistry;
1920
use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -25,6 +26,8 @@
2526
use TYPO3\CMS\Extbase\Error\Result;
2627
use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager;
2728
use TYPO3\CMS\Extbase\Reflection\ObjectAccess;
29+
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
30+
use TYPO3\CMS\Frontend\Typolink\LinkFactory;
2831

2932
/**
3033
* Class FileReferenceHandler
@@ -38,37 +41,15 @@ class FileReferenceHandler extends AbstractHandler implements SerializeHandlerIn
3841
*/
3942
protected static $supportedTypes = [self::TYPE];
4043

41-
/**
42-
* @var ResourceFactory
43-
*/
44-
protected $resourceFactory;
45-
46-
/**
47-
* @var PersistenceManager
48-
*/
49-
protected $persistenceManager;
50-
51-
/**
52-
* @var SerializerService
53-
*/
54-
protected $serializerService;
55-
56-
/**
57-
* @var FileReferenceService
58-
*/
59-
private $fileReferenceService;
60-
6144
public function __construct(
62-
ResourceFactory $resourceFactory,
63-
PersistenceManager $persistenceManager,
64-
SerializerService $serializerService,
65-
FileReferenceService $fileReferenceService
66-
) {
67-
$this->resourceFactory = $resourceFactory;
68-
$this->persistenceManager = $persistenceManager;
69-
$this->serializerService = $serializerService;
70-
$this->fileReferenceService = $fileReferenceService;
71-
}
45+
public readonly ResourceFactory $resourceFactory,
46+
public readonly PersistenceManager $persistenceManager,
47+
public readonly SerializerService $serializerService,
48+
public readonly FileReferenceService $fileReferenceService,
49+
public readonly LinkFactory $linkFactory,
50+
public readonly LinkService $linkService,
51+
public readonly ContentObjectRenderer $contentObjectRenderer
52+
) {}
7253

7354
/**
7455
* @param SerializationVisitorInterface $visitor
@@ -85,43 +66,46 @@ public function serialize(
8566
$fileReference,
8667
array $type,
8768
SerializationContext $context
88-
): array {
89-
/** @var Typo3FileReference $originalResource */
90-
$originalResource = $fileReference instanceof ExtbaseFileReference
91-
? $fileReference->getOriginalResource()
92-
: $fileReference;
93-
$originalFile = $originalResource->getOriginalFile();
94-
95-
$out = [
96-
'uid' => $fileReference->getUid(),
97-
'url' => $this->fileReferenceService->getUrlFromResource($originalResource, $context),
98-
'file' => [
99-
'uid' => $originalFile->getUid(),
100-
'name' => $originalFile->getName(),
101-
'mimeType' => $originalFile->getMimeType(),
102-
'size' => $originalFile->getSize(),
103-
],
104-
];
105-
106-
// TODO: move to some signal/slot
107-
if (preg_match('#video/.*#', $originalFile->getMimeType())) {
108-
$fileRenderer = GeneralUtility::makeInstance(RendererRegistry::class)->getRenderer($originalFile);
109-
if ($fileRenderer !== null && preg_match(
110-
'/src="([^"]+)"/',
111-
$fileRenderer->render($originalFile, 1, 1),
112-
$match
113-
)) {
114-
if ($match[1] === '') {
115-
$out['urlEmbed'] = '';
116-
} else {
117-
$out['urlEmbed'] = UrlService::forceAbsoluteUrl(
118-
$match[1],
119-
$context->getAttribute('TYPO3_SITE_URL')
120-
);
69+
): ?array {
70+
$out = null;
71+
try {
72+
/** @var Typo3FileReference $originalResource */
73+
$originalResource = $fileReference instanceof ExtbaseFileReference
74+
? $fileReference->getOriginalResource()
75+
: $fileReference;
76+
$out['url'] = $this->fileReferenceService->getUrlFromResource($originalResource, $context);
77+
$out['uid'] = $originalResource->getUid();
78+
79+
$originalFile = $originalResource->getOriginalFile();
80+
$out['file']['uid'] = $originalFile->getUid();
81+
$out['file']['name'] = $originalFile->getName();
82+
$out['file']['mimeType'] = $originalFile->getMimeType();
83+
$out['file']['size'] = $originalFile->getSize();
84+
85+
if (preg_match('#video/.*#', $originalFile->getMimeType())) {
86+
$fileRenderer = GeneralUtility::makeInstance(RendererRegistry::class)->getRenderer($originalFile);
87+
if ($fileRenderer !== null && preg_match(
88+
'/src="([^"]+)"/',
89+
$fileRenderer->render($originalFile, 1, 1),
90+
$match
91+
)) {
92+
if ($match[1] === '') {
93+
$out['urlEmbed'] = '';
94+
} else {
95+
$out['urlEmbed'] = UrlService::forceAbsoluteUrl(
96+
$match[1],
97+
$context->getAttribute('TYPO3_SITE_URL')
98+
);
99+
}
121100
}
122101
}
123-
}
124102

103+
} catch (\Throwable $e) {
104+
trigger_error(
105+
$e->getMessage(),
106+
E_USER_WARNING
107+
);
108+
}
125109
return $out;
126110
}
127111

@@ -130,8 +114,8 @@ public function serialize(
130114
* @param mixed $data
131115
* @param array $type
132116
* @param DeserializationContext $context
133-
* @throws ValidationException
134117
* @return mixed|void
118+
* @throws ValidationException
135119
*/
136120
public function deserialize(
137121
DeserializationVisitorInterface $visitor,
@@ -181,8 +165,8 @@ public function deserialize(
181165
* @param array $data
182166
* @param string $type
183167
* @param DeserializationContext $context
184-
* @throws ValidationException
185168
* @return ExtbaseFileReference
169+
* @throws ValidationException
186170
*/
187171
protected function createSysFileReference(
188172
array $data,

Classes/Serializer/Handler/ImageHandler.php

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,31 +70,38 @@ protected function processSingleImage(
7070
array $type,
7171
SerializationContext $context
7272
): ?string {
73-
if (is_int($fileReference)) {
74-
$fileRepository = GeneralUtility::makeInstance(FileRepository::class);
75-
$fileResource = $fileRepository->findFileReferenceByUid($fileReference);
76-
} else {
77-
$fileResource = $fileReference->getOriginalResource();
78-
}
79-
80-
$file = $fileResource->getOriginalFile();
81-
$processedFile = $file->process(ProcessedFile::CONTEXT_IMAGECROPSCALEMASK, [
82-
'width' => $type['params'][0] ?? '',
83-
'height' => $type['params'][1] ?? '',
84-
'maxWidth' => $type['params'][2] ?? '',
85-
'maxHeight' => $type['params'][3] ?? '',
86-
'crop' => $this->getCropArea($fileResource, $type),
87-
]);
73+
$processedFileUrl = null;
74+
try {
75+
if (is_int($fileReference)) {
76+
$fileRepository = GeneralUtility::makeInstance(FileRepository::class);
77+
$fileResource = $fileRepository->findFileReferenceByUid($fileReference);
78+
} else {
79+
$fileResource = $fileReference->getOriginalResource();
80+
}
8881

89-
return $this->fileReferenceService->getUrlFromResource($processedFile, $context);
82+
$file = $fileResource->getOriginalFile();
83+
$processedFile = $file->process(ProcessedFile::CONTEXT_IMAGECROPSCALEMASK, [
84+
'width' => $type['params'][0] ?? '',
85+
'height' => $type['params'][1] ?? '',
86+
'maxWidth' => $type['params'][2] ?? '',
87+
'maxHeight' => $type['params'][3] ?? '',
88+
'crop' => $this->getCropArea($fileResource, $type['params'][4] ?? 'default'),
89+
]);
90+
$processedFileUrl = $this->fileReferenceService->getUrlFromResource($processedFile, $context);
91+
} catch (\Throwable $e) {
92+
trigger_error(
93+
$e->getMessage(),
94+
E_USER_WARNING
95+
);
96+
}
97+
return $processedFileUrl;
9098
}
9199

92-
protected function getCropArea($fileResource, array $type): ?Area
100+
protected function getCropArea($fileResource, string $cropVariant): ?Area
93101
{
94102
if ($fileResource->hasProperty('crop') && $fileResource->getProperty('crop')) {
95103
$cropString = $fileResource->getProperty('crop');
96104
$cropVariantCollection = CropVariantCollection::create((string)$cropString);
97-
$cropVariant = $type['params'][4] ?? 'default';
98105
$cropArea = $cropVariantCollection->getCropArea($cropVariant);
99106
return $cropArea->isEmpty() ? null : $cropArea->makeAbsoluteBasedOnFile($fileResource);
100107
}

0 commit comments

Comments
 (0)