<?php declare(strict_types=1); /* * This file is part of contao-weinanlieferung-bundle. * * (c) vonRotenberg * * @license commercial */ namespace vonRotenberg\WeinanlieferungBundle\Controller\Frontend\Module; use Contao\Controller; use Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController; use Contao\CoreBundle\Exception\ResponseException; use Contao\CoreBundle\InsertTag\InsertTagParser; use Contao\CoreBundle\ServiceAnnotation\FrontendModule; use Contao\Date; use Contao\ModuleModel; use Contao\StringUtil; use Contao\Template; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel; use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel; /** * @FrontendModule(WeinanlieferungSlotsListModuleController::TYPE, category="miscellaneous") */ class WeinanlieferungSlotsListModuleController extends AbstractFrontendModuleController { public const TYPE = 'wa_slots_list'; private $insertTagParser; public function __construct(InsertTagParser $insertTagParser) { $this->insertTagParser = $insertTagParser; } protected function getResponse(Template $template, ModuleModel $model, Request $request): ?Response { $standortIds = StringUtil::deserialize($model->vr_wa_standortId); $arrData = $template->getData(); $arrOptions = []; // Add filter values if (!empty($_GET['filter_kapazitaet'])) { $arrData['filter']['kapazitaet']['selected'] = $_GET['filter_kapazitaet']; $arrOptions['column'][] = 'behaelter = ?'; $arrOptions['value'][] = $_GET['filter_kapazitaet']; } if (!empty($_GET['filter_sorte'])) { $arrData['filter']['sorte']['selected'] = $_GET['filter_sorte']; $arrOptions['column'][] = 'FIND_IN_SET(?,sorte)'; $arrOptions['value'][] = $_GET['filter_sorte']; } $arrData['filter']['kapazitaet']['options'] = range(1,30); if (($Sorten = WeinanlieferungRebsorteModel::findAll(['order'=>'title ASC'])) !== null) { $arrData['filter']['sorte']['options'] = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title')); } // Get available slots if (($slots = WeinanlieferungSlotsModel::findMultiplePublishedByPids($standortIds,$arrOptions)) !== null) { /** @var WeinanlieferungSlotsModel $slot */ foreach ($slots as $slot) { $day = new Date($slot->date); $arrSorten = []; $intAvailableBehaelter = $slot->getAvailableBehaelter(); if (($Sorten = $slot->getRelated('sorte')) !== null) { $arrSorten = $Sorten->fetchEach('title'); } $arrData['days'][$day->dayBegin][] = array_merge($slot->row(),[ 'sorte' => $arrSorten, 'behaelterAvailable' => $intAvailableBehaelter, 'buchbar' => (boolean) $intAvailableBehaelter ]); } } $template->setData($arrData); // Handle ajax if ($request->headers->get('VR-Ajax') == 'WaSlotsModule') { throw new ResponseException(new Response($this->insertTagParser->replace($template->parse()))); } return $template->getResponse(); } }