<?php
namespace Addictic\ContentElementBundle\contao\classes;
use Contao\File;
use Contao\FilesModel;
use Contao\Image;
use Contao\StringUtil;
use Exception;
use WebPConvert\Convert\Exceptions\ConversionFailedException;
/**
* This class generate images arrays with a format based on breakpoint
*
* usage for single image:
* $arrBreakpoints = [
* 'sm' => 576,
* 'md' => 768,
* 'lg' => 992,
* 'xl' => 1200,
* ];
* $objImageFile = ImagesHelper::getImageFile($uuid)
* $arrImagesSrcset = ImagesHelper::getSrcsetImages($objImageFile, $arrBreakpoints)
*
* usage for multiple images:
* $arrMultipleImagesSrcset = ImagesHelper::getMultipleSrcsetImages($arrUuid, $strAlt, $breakpoints)
*
* Class ImagesHelper
* @package Addictic\ContaoHelpersBundle
*/
class ImagesHelper
{
protected static $breakpoints = [
'sm' => 576,
'md' => 768,
'lg' => 992,
'xl' => 1200,
];
/**
* @param string|null $uuid
*
* @return FilesModel|null
*/
public static function getImageFile(?string $uuid): ?FilesModel
{
if ($uuid) {
$objImageFile = FilesModel::findByUuid($uuid);
return $objImageFile;
} else return null;
}
/**
* Return image text alt or custom alt
*
* @param FilesModel $objImage
* @param string|null $customAlt
*
* @return string|null
*/
public static function getImageAlt(FilesModel $objImage, ?string $customAlt = ''): ?string
{
if (!$objImage) return '';
$meta = self::getImageMetas($objImage);
if(!$meta) return '';
return $meta['alt'] ?: $customAlt;
}
/**
* Return image title
*
* @param FilesModel $objImage
*
* @return string|null
*/
public static function getImageTitle(FilesModel $objImage): ?string
{
if (!$objImage) return '';
$meta = self::getImageMetas($objImage);
if(!$meta) return '';
return $meta['title'] ?: '';
}
public static function getImageMetas(FilesModel $objImage)
{
$lang = $GLOBALS['TL_LANGUAGE'];
$metas = StringUtil::deserialize($objImage->meta);
if(!$metas) return null;
if(!array_key_exists($lang, $metas)) $lang = preg_replace("/\-/", '_', $lang);
return $metas[$lang];
}
/**
* @param FilesModel $objImage
* @return array
*/
public static function getImageFormat(FilesModel $objImage): array
{
if (!$objImage || !is_file($objImage->path)) return [];
list($width, $height, $type, $attr) = getimagesize($objImage->path);
$format = 'landscape';
if ($height > $width) $format = 'portrait';
if ($height === $width) $format = 'square';
return [
'width' => $width,
'height' => $height,
'type' => $type,
'attr' => $attr,
'format' => $format
];
}
/**
* @param FilesModel $objImage
* @param int|null $width
* @param int|null $height
* @param int|null $zoomLevel
* @param string $mode
*
* @return string
* @throws Exception
*/
public static function getThumbImagePath(FilesModel $objImage, ?int $width = null, ?int $height = null, ?int $zoomLevel = null, string $mode = 'proportional'): string
{
if (!$objImage) return '';
if ($objImage->extension === 'png') return $objImage->path;
$image = new Image(new File($objImage->path));
return $image
->setTargetWidth($width)
->setTargetHeight($height)
->setResizeMode($mode)
->setZoomLevel($zoomLevel)
->executeResize()
->getResizedPath();
}
/**
* @param FilesModel $objImage
* @param array|null $breakpoints
* @param string|null $cutomAlt
*
* @return array
* @throws ConversionFailedException
*/
public static function getSrcsetImages(FilesModel $objImage, ?array $breakpoints = null, ?string $cutomAlt = ''): array
{
$arrSrcsetImages = [];
$breakpoints = $breakpoints ?: self::$breakpoints;
foreach ($breakpoints as $key => $value) {
$imagePath = self::getThumbImagePath($objImage, $value, null, null, 'proportional');
if (WebPHelper::hasWebPSupport() && file_exists($imagePath)) $imagePath = WebPHelper::getWebPImage($imagePath);
$arrSrcsetImages[$key] = $imagePath;
}
$arrSrcsetImages['default'] = $objImage->path;
$arrSrcsetImages['extension'] = $objImage->extension;
$arrSrcsetImages['alt'] = self::getImageAlt($objImage, $cutomAlt);
$arrSrcsetImages['title'] = self::getImageTitle($objImage);
return $arrSrcsetImages;
}
/**
* @param array $arrUuid
* @param array|null $breakpoints
*
* @return array
* @throws Exception
*/
public static function getMultipleSrcsetImages(array $arrUuid, ?array $breakpoints = null): array
{
$arrMultipleSrcsetImage = [];
$breakpoints = $breakpoints ?: self::$breakpoints;
foreach ($arrUuid as $k => $uuid) {
$objImageFile = self::getImageFile($uuid);
if (!$objImageFile) continue;
$arrMultipleSrcsetImage[$k]['images'] = self::getSrcsetImages($objImageFile, $breakpoints);
}
return $arrMultipleSrcsetImage;
}
}