<?php
declare(strict_types=1);
/*
* This file is part of contao-weinanlieferung-bundle.
*
* (c) vonRotenberg
*
* @license commercial
*/
namespace vonRotenberg\WeinanlieferungBundle\Controller\Frontend\Ajax;
use Contao\CoreBundle\Controller\AbstractController;
use Contao\CoreBundle\Framework\ContaoFramework;
use Contao\CoreBundle\Security\Authentication\Token\TokenChecker;
use Contao\FrontendUser;
use Contao\Input;
use Contao\System;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;
/**
* @Route("/_ajax/vr_wa/v1/slot", name="vr_wa_slot_ajax", defaults={"_scope" = "frontend", "_token_check" = false})
*/
class SlotAjaxController extends AbstractController
{
private $tokenChecker;
private $translator;
private $framework;
public function __construct(ContaoFramework $framework, TokenChecker $tokenChecker, TranslatorInterface $translator)
{
$this->framework = $framework;
$this->tokenChecker = $tokenChecker;
$this->translator = $translator;
}
public function __invoke(Request $request)
{
System::loadLanguageFile('default');
if (!$this->tokenChecker->hasFrontendUser())
{
return $this->renderUnauthorized();
}
if (empty($_REQUEST['do']))
{
return new Response('Required parameter missing',412);
}
switch ($_REQUEST['do'])
{
case 'details':
return $this->renderDetails();
break;
case 'reservate':
return $this->reservate();
}
return new Response('',500);
return new Response(null,203);
}
protected function renderDetails()
{
if (empty($_REQUEST['id']))
{
return new Response('Required parameter missing',412);
}
if (($Slot = WeinanlieferungSlotsModel::findPublishedById($_REQUEST['id'])) === null)
{
return new Response('Could not load slot data',500);
}
$arrSorten = [];
if (($Sorten = $Slot->getRelated('sorte')) !== null)
{
$arrSorten = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
}
$intAvailableBehaelter = $Slot->getAvailableBehaelter();
$arrData = [
'id' => $Slot->id,
'slot' => array_merge($Slot->row(),[
'sorte' => $arrSorten,
'behaelterAvailable' => $intAvailableBehaelter
]),
'standort' => $Slot->getRelated('pid'),
'buchen' => [
'buchbar' => (boolean) $intAvailableBehaelter,
'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter),
'sorten' => $arrSorten
]
];
return $this->render('@Contao/modal_slot_details.html.twig',$arrData);
}
protected function reservate()
{
if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
{
return new Response('Missing parameter',500);
}
$arrSorten = [];
if (!is_array(Input::post('sorten')))
{
$arrSorten[] = Input::post('sorten');
} else {
$arrSorten = implode(',', Input::post('sorten'));
}
$Reservation = new WeinanlieferungReservationModel();
$Reservation->setRow([
'pid' => $_REQUEST['id'],
'tstamp' => time(),
'uid' => FrontendUser::getInstance()->id,
'behaelter' => Input::post('behaelter'),
'sorten' => $arrSorten
]);
$Reservation->save();
return new Response('<p>Reservierung erfolgreich</p>');
}
protected function renderUnauthorized()
{
return $this->render('@Contao/modal_unauthorized.html.twig');
}
}