2017-09-05 4 views
0

merci de lire et de répondre ...Comment puis-je obtenir les images multimédia "apparence" TYPO3 en utilisant "ViewHelper"?

J'ai quelques éléments de la grille TYPO3 dans mon contenu TYPO3. Chaque élément de grille a un onglet "apparence", où je définis un fichier d'image. La relation de base de données de tt_content à l'image multimédia est dans sys_file_reference.

Ma question est comment puis-je obtenir ce fichier image dans mon modèle fluide en utilisant le ViewHelper et l'uid de ma gridelement?

Répondre

0

j'ai écrit un peu ViewHelper (testé sur 7,6, mais ne devrait pas avoir besoin tant des changements de 8,7) pour obtenir des images référencées pour une mise en page du bulletin:

<?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; 
    } 
    } 
+0

Great c'est en ce que je devais !! – Lukaschel

+0

Geat à entendre, alors acceptez simplement la réponse afin que tous puissent voir que votre question a été répondue;) –