vendor/addictic/content-element-bundle/src/Resources/contao/classes/ImagesHelper.php line 135

Open in your IDE?
  1. <?php
  2. namespace Addictic\ContentElementBundle\contao\classes;
  3. use Contao\File;
  4. use Contao\FilesModel;
  5. use Contao\Image;
  6. use Contao\StringUtil;
  7. use Exception;
  8. use WebPConvert\Convert\Exceptions\ConversionFailedException;
  9. /**
  10.  * This class generate images arrays with a format based on breakpoint
  11.  *
  12.  * usage for single image:
  13.  *      $arrBreakpoints = [
  14.  *         'sm' => 576,
  15.  *         'md' => 768,
  16.  *         'lg' => 992,
  17.  *         'xl' => 1200,
  18.  *      ];
  19.  *      $objImageFile = ImagesHelper::getImageFile($uuid)
  20.  *      $arrImagesSrcset = ImagesHelper::getSrcsetImages($objImageFile, $arrBreakpoints)
  21.  *
  22.  * usage for multiple images:
  23.  *       $arrMultipleImagesSrcset = ImagesHelper::getMultipleSrcsetImages($arrUuid, $strAlt, $breakpoints)
  24.  *
  25.  * Class ImagesHelper
  26.  * @package Addictic\ContaoHelpersBundle
  27.  */
  28. class ImagesHelper
  29. {
  30.     protected static $breakpoints = [
  31.         'sm' => 576,
  32.         'md' => 768,
  33.         'lg' => 992,
  34.         'xl' => 1200,
  35.     ];
  36.     /**
  37.      * @param string|null $uuid
  38.      *
  39.      * @return FilesModel|null
  40.      */
  41.     public static function getImageFile(?string $uuid): ?FilesModel
  42.     {
  43.         if ($uuid) {
  44.             $objImageFile FilesModel::findByUuid($uuid);
  45.             return $objImageFile;
  46.         } else return null;
  47.     }
  48.     /**
  49.      * Return image text alt or custom alt
  50.      *
  51.      * @param FilesModel $objImage
  52.      * @param string|null $customAlt
  53.      *
  54.      * @return string|null
  55.      */
  56.     public static function getImageAlt(FilesModel $objImage, ?string $customAlt ''): ?string
  57.     {
  58.         if (!$objImage) return '';
  59.         $meta self::getImageMetas($objImage);
  60.         if(!$meta) return '';
  61.         return $meta['alt'] ?: $customAlt;
  62.     }
  63.     /**
  64.      * Return image title
  65.      *
  66.      * @param FilesModel $objImage
  67.      *
  68.      * @return string|null
  69.      */
  70.     public static function getImageTitle(FilesModel $objImage): ?string
  71.     {
  72.         if (!$objImage) return '';
  73.         $meta self::getImageMetas($objImage);
  74.         if(!$meta) return '';
  75.         return $meta['title'] ?: '';
  76.     }
  77.     public static function getImageMetas(FilesModel $objImage)
  78.     {
  79.         $lang $GLOBALS['TL_LANGUAGE'];
  80.         $metas StringUtil::deserialize($objImage->meta);
  81.         if(!$metas) return null;
  82.         if(!array_key_exists($lang$metas)) $lang preg_replace("/\-/"'_'$lang);
  83.         return $metas[$lang];
  84.     }
  85.     /**
  86.      * @param FilesModel $objImage
  87.      * @return array
  88.      */
  89.     public static function getImageFormat(FilesModel $objImage): array
  90.     {
  91.         if (!$objImage || !is_file($objImage->path)) return [];
  92.         list($width$height$type$attr) = getimagesize($objImage->path);
  93.         $format 'landscape';
  94.         if ($height $width$format 'portrait';
  95.         if ($height === $width$format 'square';
  96.         return [
  97.             'width' => $width,
  98.             'height' => $height,
  99.             'type' => $type,
  100.             'attr' => $attr,
  101.             'format' => $format
  102.         ];
  103.     }
  104.     /**
  105.      * @param FilesModel $objImage
  106.      * @param int|null $width
  107.      * @param int|null $height
  108.      * @param int|null $zoomLevel
  109.      * @param string $mode
  110.      *
  111.      * @return string
  112.      * @throws Exception
  113.      */
  114.     public static function getThumbImagePath(FilesModel $objImage, ?int $width null, ?int $height null, ?int $zoomLevel nullstring $mode 'proportional'): string
  115.     {
  116.         if (!$objImage) return '';
  117.         if ($objImage->extension === 'png') return $objImage->path;
  118.         $image = new Image(new File($objImage->path));
  119.         return $image
  120.             ->setTargetWidth($width)
  121.             ->setTargetHeight($height)
  122.             ->setResizeMode($mode)
  123.             ->setZoomLevel($zoomLevel)
  124.             ->executeResize()
  125.             ->getResizedPath();
  126.     }
  127.     /**
  128.      * @param FilesModel $objImage
  129.      * @param array|null $breakpoints
  130.      * @param string|null $cutomAlt
  131.      *
  132.      * @return array
  133.      * @throws ConversionFailedException
  134.      */
  135.     public static function getSrcsetImages(FilesModel $objImage, ?array $breakpoints null, ?string $cutomAlt ''): array
  136.     {
  137.         $arrSrcsetImages = [];
  138.         $breakpoints $breakpoints ?: self::$breakpoints;
  139.         foreach ($breakpoints as $key => $value) {
  140.             $imagePath self::getThumbImagePath($objImage$valuenullnull'proportional');
  141.             if (WebPHelper::hasWebPSupport() && file_exists($imagePath)) $imagePath WebPHelper::getWebPImage($imagePath);
  142.             $arrSrcsetImages[$key] = $imagePath;
  143.         }
  144.         $arrSrcsetImages['default'] = $objImage->path;
  145.         $arrSrcsetImages['extension'] = $objImage->extension;
  146.         $arrSrcsetImages['alt'] = self::getImageAlt($objImage$cutomAlt);
  147.         $arrSrcsetImages['title'] = self::getImageTitle($objImage);
  148.         return $arrSrcsetImages;
  149.     }
  150.     /**
  151.      * @param array $arrUuid
  152.      * @param array|null $breakpoints
  153.      *
  154.      * @return array
  155.      * @throws Exception
  156.      */
  157.     public static function getMultipleSrcsetImages(array $arrUuid, ?array $breakpoints null): array
  158.     {
  159.         $arrMultipleSrcsetImage = [];
  160.         $breakpoints $breakpoints ?: self::$breakpoints;
  161.         foreach ($arrUuid as $k => $uuid) {
  162.             $objImageFile self::getImageFile($uuid);
  163.             if (!$objImageFile) continue;
  164.             $arrMultipleSrcsetImage[$k]['images'] = self::getSrcsetImages($objImageFile$breakpoints);
  165.         }
  166.         return $arrMultipleSrcsetImage;
  167.     }
  168. }