vendor/sonata-project/media-bundle/src/Twig/Extension/MediaExtension.php line 23

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of the Sonata Project package.
  5.  *
  6.  * (c) Thomas Rabaix <[email protected]>
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Sonata\MediaBundle\Twig\Extension;
  12. use Sonata\Doctrine\Model\ManagerInterface;
  13. use Sonata\MediaBundle\Model\MediaInterface;
  14. use Sonata\MediaBundle\Provider\Pool;
  15. use Sonata\MediaBundle\Twig\TokenParser\MediaTokenParser;
  16. use Sonata\MediaBundle\Twig\TokenParser\PathTokenParser;
  17. use Sonata\MediaBundle\Twig\TokenParser\ThumbnailTokenParser;
  18. class MediaExtension extends \Twig_Extension implements \Twig_Extension_InitRuntimeInterface
  19. {
  20.     /**
  21.      * @var Pool
  22.      */
  23.     protected $mediaService;
  24.     /**
  25.      * @var array
  26.      */
  27.     protected $resources = [];
  28.     /**
  29.      * @var ManagerInterface
  30.      */
  31.     protected $mediaManager;
  32.     /**
  33.      * @var \Twig_Environment
  34.      */
  35.     protected $environment;
  36.     /**
  37.      * @param Pool             $mediaService
  38.      * @param ManagerInterface $mediaManager
  39.      */
  40.     public function __construct(Pool $mediaServiceManagerInterface $mediaManager)
  41.     {
  42.         $this->mediaService $mediaService;
  43.         $this->mediaManager $mediaManager;
  44.     }
  45.     /**
  46.      * {@inheritdoc}
  47.      */
  48.     public function getTokenParsers()
  49.     {
  50.         return [
  51.             new MediaTokenParser(\get_called_class()),
  52.             new ThumbnailTokenParser(\get_called_class()),
  53.             new PathTokenParser(\get_called_class()),
  54.         ];
  55.     }
  56.     /**
  57.      * {@inheritdoc}
  58.      */
  59.     public function initRuntime(\Twig_Environment $environment)
  60.     {
  61.         $this->environment $environment;
  62.     }
  63.     /**
  64.      * @param MediaInterface $media
  65.      * @param string         $format
  66.      * @param array          $options
  67.      *
  68.      * @return string
  69.      */
  70.     public function media($media$format$options = [])
  71.     {
  72.         $media $this->getMedia($media);
  73.         if (null === $media) {
  74.             return '';
  75.         }
  76.         $provider $this
  77.             ->getMediaService()
  78.             ->getProvider($media->getProviderName());
  79.         $format $provider->getFormatName($media$format);
  80.         $options $provider->getHelperProperties($media$format$options);
  81.         return $this->render($provider->getTemplate('helper_view'), [
  82.             'media' => $media,
  83.             'format' => $format,
  84.             'options' => $options,
  85.         ]);
  86.     }
  87.     /**
  88.      * Returns the thumbnail for the provided media.
  89.      *
  90.      * @param MediaInterface $media
  91.      * @param string         $format
  92.      * @param array          $options
  93.      *
  94.      * @return string
  95.      */
  96.     public function thumbnail($media$format$options = [])
  97.     {
  98.         $media $this->getMedia($media);
  99.         if (null === $media) {
  100.             return '';
  101.         }
  102.         $provider $this->getMediaService()
  103.            ->getProvider($media->getProviderName());
  104.         $format $provider->getFormatName($media$format);
  105.         $format_definition $provider->getFormat($format);
  106.         // build option
  107.         $defaultOptions = [
  108.             'title' => $media->getName(),
  109.             'alt' => $media->getName(),
  110.         ];
  111.         if ($format_definition['width']) {
  112.             $defaultOptions['width'] = $format_definition['width'];
  113.         }
  114.         if ($format_definition['height']) {
  115.             $defaultOptions['height'] = $format_definition['height'];
  116.         }
  117.         $options array_merge($defaultOptions$options);
  118.         $options['src'] = $provider->generatePublicUrl($media$format);
  119.         return $this->render($provider->getTemplate('helper_thumbnail'), [
  120.             'media' => $media,
  121.             'options' => $options,
  122.         ]);
  123.     }
  124.     /**
  125.      * @param string $template
  126.      * @param array  $parameters
  127.      *
  128.      * @return mixed
  129.      */
  130.     public function render($template, array $parameters = [])
  131.     {
  132.         if (!isset($this->resources[$template])) {
  133.             $this->resources[$template] = $this->environment->loadTemplate($template);
  134.         }
  135.         return $this->resources[$template]->render($parameters);
  136.     }
  137.     /**
  138.      * @param MediaInterface $media
  139.      * @param string         $format
  140.      *
  141.      * @return string
  142.      */
  143.     public function path($media$format)
  144.     {
  145.         $media $this->getMedia($media);
  146.         if (!$media) {
  147.             return '';
  148.         }
  149.         $provider $this->getMediaService()
  150.            ->getProvider($media->getProviderName());
  151.         $format $provider->getFormatName($media$format);
  152.         return $provider->generatePublicUrl($media$format);
  153.     }
  154.     /**
  155.      * @return Pool
  156.      */
  157.     public function getMediaService()
  158.     {
  159.         return $this->mediaService;
  160.     }
  161.     /**
  162.      * @param mixed $media
  163.      */
  164.     private function getMedia($media): ?MediaInterface
  165.     {
  166.         if (!$media instanceof MediaInterface && \strlen((string) $media) > 0) {
  167.             $media $this->mediaManager->findOneBy([
  168.                 'id' => $media,
  169.             ]);
  170.         }
  171.         if (!$media instanceof MediaInterface) {
  172.             return null;
  173.         }
  174.         if (MediaInterface::STATUS_OK !== $media->getProviderStatus()) {
  175.             return null;
  176.         }
  177.         return $media;
  178.     }
  179. }