typo3viewhelper

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


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?


Solution

  • 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;
        }
      }