<?php
/**
* OBG Customizations
*
* Copyright (c) 2021 vonRotenberg
*
* @license commercial
*/
namespace vonRotenberg\RealEstateListingBundle\Controller\FrontendModule;
use Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule;
use Contao\CoreBundle\Exception\ResponseException;
use Contao\CoreBundle\Image\Studio\Studio;
use Contao\CoreBundle\Twig\FragmentTemplate;
use Contao\ModuleModel;
use Contao\PageModel;
use Contao\StringUtil;
use Contao\System;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Translation\TranslatorInterface;
#[AsFrontendModule(RealEstateAssetsListController::TYPE, category: 'miscellaneous')]
class RealEstateAssetsListController extends RealEstateAssetsModuleController
{
public const TYPE = 'vr_re_assets_list';
/**
* @var TranslatorInterface
*/
protected $translator;
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
protected function getResponse(FragmentTemplate $template, ModuleModel $model, Request $request): Response
{
$arrGroups = [];
$arrFilterOptions = [];
$jumpTo = PageModel::findByPk($model->jumpTo);
$urlGenerator = System::getContainer()->get('contao.routing.content_url_generator');
if (($assets = $this->getRealEstateAssets(StringUtil::deserialize($model->vr_re_categories))) === null)
{
return $template->getResponse();
}
// Figure Builder
$figureBuilder = System::getContainer()
->get('contao.image.studio')
->createFigureBuilder()
->setSize($model->imgSize)
->setLightboxGroupIdentifier('lb' . $model->id);
foreach ($assets as $asset)
{
$arrItem = array_merge($asset->row(), [
'teaserFigure' => $this->getImageFigures($asset->gallerySRC, $figureBuilder, $asset->orderSRC, 1),
'detailsUrl' => $jumpTo !== null ? $urlGenerator->generate($jumpTo, ['parameters'=>'/items/'.$asset->id]) : null
]);
// Grouping
if ($model->vr_re_grouped)
{
if (!isset($arrGroups[$arrItem['pid']]))
{
$Group = $asset->getRelated('pid');
$arrGroups[$arrItem['pid']] = [
'label' => $Group->title,
'items' => []
];
}
$arrGroups[$arrItem['pid']]['items'][] = $arrItem;
} else {
$arrGroups['nogroup']['items'][] = $arrItem;
}
// Filter options
if (!empty($asset->numberOfRooms))
{
$arrFilterOptions['rooms'][] = ['value'=>$asset->numberOfRooms, 'label'=>$asset->numberOfRooms . ' ' . ($asset->numberOfRooms > 1 ? $this->translator->trans('MSC.re_rooms', [], 'contao_default') : $this->translator->trans('MSC.re_room', [], 'contao_default'))];
}
}
$arrFilterOptions = array_unique($arrFilterOptions);
$template->set('filterOptions',$arrFilterOptions);
$template->set('groups',$arrGroups);
// Handle ajax
if ($request->headers->get('VR-Ajax') == 'ReAssetsList')
{
throw new ResponseException($template->getResponse());
}
return $template->getResponse();
}
}