diff --git a/Classes/ViewHelpers/ThumbnailViewHelper.php b/Classes/ViewHelpers/ThumbnailViewHelper.php new file mode 100644 index 000000000..1f3246947 --- /dev/null +++ b/Classes/ViewHelpers/ThumbnailViewHelper.php @@ -0,0 +1,114 @@ +registerArgument('context', 'string', 'context for image rendering', false, ProcessedFile::CONTEXT_IMAGEPREVIEW); + } + + /** + * Resizes a given image (if required) and renders the respective img tag + * + * @see https://docs.typo3.org/typo3cms/TyposcriptReference/ContentObjects/Image/ + * + * @throws Exception + * @return string Rendered tag + */ + public function render() + { + if (($this->arguments['src'] === '' && $this->arguments['image'] === null) || ($this->arguments['src'] !== '' && $this->arguments['image'] !== null)) { + throw new Exception('You must either specify a string src or a File object.', 1533290762); + } + + try { + $image = $this->imageService->getImage((string)$this->arguments['src'], $this->arguments['image'], (bool)$this->arguments['treatIdAsReference']); + + $cropString = $this->arguments['crop']; + if ($cropString === null && $image->hasProperty('crop') && $image->getProperty('crop')) { + $cropString = $image->getProperty('crop'); + } + $cropVariantCollection = CropVariantCollection::create((string)$cropString); + $cropVariant = $this->arguments['cropVariant'] ?: 'default'; + $cropArea = $cropVariantCollection->getCropArea($cropVariant); + $processingInstructions = []; + if (!$cropArea->isEmpty()) { + $processingInstructions['crop'] = $cropArea->makeAbsoluteBasedOnFile($image); + } + foreach (['width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight'] as $argument) { + if (!empty($this->arguments[$argument])) { + $processingInstructions[$argument] = $this->arguments[$argument]; + } + } + + $processedFile = $image->process($this->arguments['context'], $processingInstructions); + $imageUri = $processedFile->getPublicUrl(); + + if (!$this->tag->hasAttribute('data-focus-area')) { + $focusArea = $cropVariantCollection->getFocusArea($cropVariant); + if (!$focusArea->isEmpty()) { + $this->tag->addAttribute('data-focus-area', $focusArea->makeAbsoluteBasedOnFile($image)); + } + } + $this->tag->addAttribute('src', $imageUri); + $this->tag->addAttribute('width', $processedFile->getProperty('width')); + $this->tag->addAttribute('height', $processedFile->getProperty('height')); + + $alt = $image->getProperty('alternative'); + $title = $image->getProperty('title'); + + // The alt-attribute is mandatory to have valid html-code, therefore add it even if it is empty + if (empty($this->arguments['alt'])) { + $this->tag->addAttribute('alt', $alt); + } + if (empty($this->arguments['title']) && $title) { + $this->tag->addAttribute('title', $title); + } + } catch (ResourceDoesNotExistException $e) { + // thrown if file does not exist + throw new Exception($e->getMessage(), 1533294109, $e); + } catch (\UnexpectedValueException $e) { + // thrown if a file has been replaced with a folder + throw new Exception($e->getMessage(), 1533294113, $e); + } catch (\RuntimeException $e) { + // RuntimeException thrown if a file is outside of a storage + throw new Exception($e->getMessage(), 1533294116, $e); + } catch (\InvalidArgumentException $e) { + // thrown if file storage does not exist + throw new Exception($e->getMessage(), 1533294120, $e); + } + + return $this->tag->render(); + } +} diff --git a/Resources/Private/Partials/Backend/Handler/DoktypeDefaultHandler/Node.html b/Resources/Private/Partials/Backend/Handler/DoktypeDefaultHandler/Node.html index 446171f8e..5ff64ed71 100644 --- a/Resources/Private/Partials/Backend/Handler/DoktypeDefaultHandler/Node.html +++ b/Resources/Private/Partials/Backend/Handler/DoktypeDefaultHandler/Node.html @@ -3,7 +3,7 @@ - +