How can I get the TYPO3 "appearance" media images by using "ViewHelper"?

779 views Asked by At

thanks for reading and answering...

I have some TYPO3 gridelements in my TYPO3 pagecontent. Each gridelement has a tab "appearance", where I define an image file. The database relation from tt_content to the media image are in sys_file_reference.

My question is how can I get this image file in my fluid template by using the ViewHelper and the uid of my gridelement?

1

There are 1 answers

2
René Pflamm On BEST ANSWER

I wrote an little ViewHelper (tested on 7.6, but should not need so much changes for 8.7) to get referenced images for an newsletter layout:

<?php
  namespace Vendor\Extension\ViewHelpers;

  use TYPO3\CMS\Core\Log\LogManager;
  use TYPO3\CMS\Core\Resource\FileRepository;
  use TYPO3\CMS\Core\Utility\GeneralUtility;
  use TYPO3\CMS\Core\Resource\FileReference;
  use TYPO3\CMS\Core\Resource\Exception;
  use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
  use TYPO3\CMS\Fluid\Core\ViewHelper\Facets\CompilableInterface;
  use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;

  class ImagesReferencesViewHelper extends AbstractViewHelper implements CompilableInterface
  {

    /**
     * Iterates through elements of $each and renders child nodes
     *
     * @param int     $uid       The ID of the element
     * @param string  $table     The Referenced table name
     * @param string  $fieldName The Referenced field name
     * @param string  $as        The name of the iteration variable
     * @param string  $key       The name of the variable to store the current array key
     * @param boolean $reverse   If enabled, the iterator will start with the last element and proceed reversely
     * @param string  $iteration The name of the variable to store iteration information (index, cycle, isFirst, isLast, isEven, isOdd)
     * @param string  $link      The name of the variable to store link
     *
     * @return string Rendered string
     * @api
     */
    public function render($uid, $table = 'tt_content', $fieldName = 'assets', $as, $key = '', $reverse = false, $iteration = null, $link = null)
    {
      return self::renderStatic($this->arguments, $this->buildRenderChildrenClosure(), $this->renderingContext);
    }

    /**
     * @param array                                                     $arguments
     * @param \Closure                                                  $renderChildrenClosure
     * @param \TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface $renderingContext
     *
     * @return string
     * @throws \TYPO3\CMS\Fluid\Core\ViewHelper\Exception
     */
    static public function renderStatic(array $arguments, \Closure $renderChildrenClosure, \TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface $renderingContext)
    {
      $templateVariableContainer = $renderingContext->getTemplateVariableContainer();
      if ($arguments['uid'] === null || $arguments['table'] === null || $arguments['fieldName'] === null) {
        return '';
      }

      /** @var FileRepository $fileRepository */
      $fileRepository = GeneralUtility::makeInstance(FileRepository::class);
      $images         = array();

      try {
        $images = $fileRepository->findByRelation($arguments['table'], $arguments['fieldName'], $arguments['uid']);
      } catch (Exception $e) {
        /** @var \TYPO3\CMS\Core\Log\Logger $logger */
        $logger = GeneralUtility::makeInstance(LogManager::class)->getLogger();
        $logger->warning('The file-reference with uid  "' . $arguments['uid'] . '" could not be found and won\'t be included in frontend output');
      }

      if (is_object($images) && !$images instanceof \Traversable) {
        throw new \TYPO3\CMS\Fluid\Core\ViewHelper\Exception('ImagesReferencesViewHelper only supports arrays and objects implementing \Traversable interface', 1248728393);
      }

      if ($arguments['reverse'] === true) {
        // array_reverse only supports arrays
        if (is_object($images)) {
          $images = iterator_to_array($images);
        }
        $images = array_reverse($images);
      }
      $iterationData = array(
        'index' => 0,
        'cycle' => 1,
        'total' => count($images)
      );

      $output = '';
      foreach ($images as $keyValue => $singleElement) {
        $templateVariableContainer->add($arguments['as'], $singleElement);

        /** @var FileReference $singleElement */
        if ($arguments['link'] !== null && $singleElement->getLink()) {
          $link = $singleElement->getLink();
          /** @var ContentObjectRenderer $contentObject */
          $contentObject = GeneralUtility::makeInstance(ContentObjectRenderer::class);
          $newLink       = $contentObject->typoLink_URL(array('parameter' => $link));
          $templateVariableContainer->add($arguments['link'], $newLink);
        }

        if ($arguments['key'] !== '') {
          $templateVariableContainer->add($arguments['key'], $keyValue);
        }
        if ($arguments['iteration'] !== null) {
          $iterationData['isFirst'] = $iterationData['cycle'] === 1;
          $iterationData['isLast']  = $iterationData['cycle'] === $iterationData['total'];
          $iterationData['isEven']  = $iterationData['cycle'] % 2 === 0;
          $iterationData['isOdd']   = !$iterationData['isEven'];
          $templateVariableContainer->add($arguments['iteration'], $iterationData);
          $iterationData['index']++;
          $iterationData['cycle']++;
        }
        $output .= $renderChildrenClosure();
        $templateVariableContainer->remove($arguments['as']);
        if ($arguments['link'] !== null && $singleElement->getLink()) {
          $templateVariableContainer->remove($arguments['link']);
        }
        if ($arguments['key'] !== '') {
          $templateVariableContainer->remove($arguments['key']);
        }
        if ($arguments['iteration'] !== null) {
          $templateVariableContainer->remove($arguments['iteration']);
        }
      }
      return $output;
    }
  }