<?php
declare(strict_types=1);
namespace vonRotenberg\CoretoolsBundle\Controller\ContentElement;
use Contao\ContentModel;
use Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
use Contao\CoreBundle\DependencyInjection\Attribute\AsContentElement;
use Contao\CoreBundle\Twig\FragmentTemplate;
use Contao\FilesModel;
use Contao\System;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
#[AsContentElement(category: 'miscellaneous', nestedFragments: true)]
class BackgroundWrapperController extends AbstractContentElementController
{
protected function getResponse(FragmentTemplate $template, ContentModel $model, Request $request): Response
{
$GLOBALS['TL_CSS']['vr_coretools'] = 'bundles/vonrotenbergcoretools/css/background-wrapper.min.css|static';
$arrData = array_merge($template->getData(),[
'element_css_classes' => trim($template->element_css_classes . ' ' . $this->getWrapperClasses($model))
]);
if ($model->vr_bw_addImage)
{
$objFile = FilesModel::findByUuid($model->vr_bw_bgSRC);
if ($objFile !== null && is_file(System::getContainer()->getParameter('kernel.project_dir') . '/' . $objFile->path))
{
if (!in_array($objFile->extension,['mp4', 'm4v', 'mov', 'wmv', 'webm', 'ogv']))
{
$figure = System::getContainer()
->get('contao.image.studio')
->createFigureBuilder()
->from($objFile)
->setSize($model->size)
->buildIfResourceExists();
if ($figure !== null && $model->vr_bw_minHeight === '-mh-bgimage')
{
$imageData = $figure->getImage()->getPicture()->getImg();
$ratio = round(100 / $imageData['width'] * $imageData['height'],3);
$arrData['minHeight_ratio'] = $ratio;
}
$arrData['background_figure'] = $figure;
} else {
$arrData['background_video'] = [
'path' => System::getContainer()->get('contao.assets.files_context')->getStaticUrl() . $objFile->path,
'extension' => $objFile->extension
];
}
}
}
$template->setData($arrData);
return $template->getResponse();
}
/**
* @param ContentModel $model
*
* @return string
*/
protected function getWrapperClasses(ContentModel $model): string
{
$arrCssClasses = [];
// Add background image classes
if ($model->vr_bw_addImage)
{
if (!empty($model->vr_bw_bgSize))
{
$arrCssClasses[] = $model->vr_bw_bgSize;
}
if (!empty($model->vr_bw_bgPos))
{
$arrCssClasses[] = $model->vr_bw_bgPos;
}
if (!empty($model->vr_bw_bgOpacity))
{
$arrCssClasses[] = $model->vr_bw_bgOpacity;
}
}
if (!empty($model->vr_bw_bgColor))
{
$arrCssClasses[] = $model->vr_bw_bgColor;
}
if ($model->vr_bw_bgWidthRestriction)
{
$arrCssClasses[] = '-bg-width-restrict';
}
// Add content area classes
if (!empty($model->vr_bw_width))
{
$arrCssClasses[] = $model->vr_bw_width;
}
if (!empty($model->vr_bw_minHeight))
{
$arrCssClasses[] = $model->vr_bw_minHeight;
if ($model->vr_bw_minHeight == '-mh-vh' && !empty($model->vr_bw_mh_viewport))
{
$arrCssClasses[] = $model->vr_bw_mh_viewport;
}
if ($model->vr_bw_minHeight == '-mh-ratio' && !empty($model->vr_bw_mh_ratio))
{
$arrCssClasses[] = $model->vr_bw_mh_ratio;
}
}
if (!empty($model->vr_bw_vAlign))
{
$arrCssClasses[] = $model->vr_bw_vAlign;
}
if ($model->vr_bw_colorInvert)
{
$arrCssClasses[] = '-color-inverted';
}
if (
in_array($model->vr_bw_width,['-width-extended','-width-default-left','-width-default-right','-width-extended-left','-width-extended-right'])
&& $model->vr_bw_widthText)
{
$arrCssClasses[] = '-add-text-indent';
}
if (!empty($model->vr_bw_padding))
{
$arrCssClasses[] = $model->vr_bw_padding;
}
return implode(' ', $arrCssClasses);
}
}