Skip to content

Commit

Permalink
[BUGFIX] TYPO3 v8LTS: Add be:thumbnail ViewHelper to TV+
Browse files Browse the repository at this point in the history
This VH is only available from TYPO3 v10LTS onwards.

Related: #390
Release: 8.0.0
  • Loading branch information
opi99 committed Jun 15, 2022
1 parent 1456031 commit 4e5ab01
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 1 deletion.
114 changes: 114 additions & 0 deletions Classes/ViewHelpers/ThumbnailViewHelper.php
@@ -0,0 +1,114 @@
<?php

/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/

declare(strict_types=1);

namespace Tvp\TemplaVoilaPlus\ViewHelpers;

use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariantCollection;
use TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException;
use TYPO3\CMS\Core\Resource\ProcessedFile;
use TYPO3\CMS\Fluid\ViewHelpers\ImageViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Exception;

/**
* File taken from TYPO3 Core typo3/sysext/backend/Classes/ViewHelpers/ThumbnailViewHelper.php as we support from TYPO3 v8LTS but it is only included since TYPO3 v10LTS.
*/
class ThumbnailViewHelper extends ImageViewHelper
{

/**
* Initialize arguments.
*/
public function initializeArguments()
{
parent::initializeArguments();
$this->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();
}
}
Expand Up @@ -3,7 +3,7 @@

<f:if condition="{node.raw.table} == sys_file">
<f:then>
<be:thumbnail src="{node.raw.entity.uid}" height="64" width="64" />
<tvp:thumbnail src="{node.raw.entity.uid}" height="64" width="64" />
</f:then>
<f:else>
<f:render section="TableNode" arguments="{_all}" />
Expand Down

0 comments on commit 4e5ab01

Please sign in to comment.