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); } $blnModal = true; if (!empty($_REQUEST['modal'])) { $blnModal = !(strtolower($_REQUEST['modal']) == 'false'); } switch ($_REQUEST['do']) { case 'details': return $this->renderDetails($blnModal); case 'annotation': return $this->renderAnnotation($blnModal); case 'booking': return $this->renderBooking($blnModal); case 'reservate': return $this->reservate(); case 'updateReservation': return $this->updateReservation(); case 'availableUnitAmount': return $this->renderAvailableUnitAmount(); case 'delete': return $this->deleteReservation(); } return new Response('',500); } protected function renderDetails(bool $blnModal=true,string $error=null) { $insertTagService = Controller::getContainer()->get('contao.insert_tag.parser'); 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); } // Get slot reservations from user $arrReservations = []; if (($Reservations = WeinanlieferungReservationModel::findBy(["uid = ?","pid = ?"],[FrontendUser::getInstance()->id,$Slot->id])) !== null) { foreach ($Reservations as $reservation) { $arrReservations[] = $reservation->row(); } } // Build data $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter()); $arrUnits = []; if (($Site = $Slot->getRelated('pid')) !== null) { if (($Units = $Site->getRelated('units')) !== null) { foreach ($Units as $unit) { $arrUnits[$unit->id] = $unit->title . ' (' . $unit->containers . ' '.$this->translator->trans('tl_vr_wa_units.containers.0', [], 'contao_tl_vr_wa_units').')'; } } } $arrData = [ 'modal' => $blnModal, 'id' => $Slot->id, 'slot' => array_merge($Slot->row(),[ 'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''), 'behaelterAvailable' => $intAvailableBehaelter ]), 'standort' => $Slot->getRelated('pid'), 'buchen' => [ 'buchbar' => (boolean) $intAvailableBehaelter, 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter), 'units' => $arrUnits, ], 'reservations' => $arrReservations ]; if (!empty($error)) { $arrData['toast'] = $error; } return $this->render('@Contao/modal_slot_details.html.twig',$arrData); } protected function renderAnnotation(bool $blnModal=true,string $error=null) { $insertTagService = Controller::getContainer()->get('contao.insert_tag.parser'); 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); } // Build data $arrSorten = []; $Sorten = StringUtil::deserialize($Slot->sorten,true); foreach($Sorten as $sorte) { $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']); $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']); $arrSorten[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null ? $objSorte->title : '') . ' ' . ($objLeseart !== null ? $objLeseart->title : ''); } $arrErnteart = []; if ($Slot->ernteart !== null) { foreach (explode(',', $Slot->ernteart) as $ernteart) { $arrErnteart[] = $GLOBALS['TL_LANG']['REF']['wa_ernteart'][$ernteart] ?? $ernteart; } } $arrLage = []; if (($Lage = $Slot->getRelated('lage')) !== null) { $arrLage = $Lage->fetchEach('title'); } $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter()); $arrData = [ 'modal' => $blnModal, 'id' => $Slot->id, 'slot' => array_merge($Slot->row(),[ 'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''), 'sorte' => $arrSorten, 'behaelterAvailable' => $intAvailableBehaelter ]), 'standort' => $Slot->getRelated('pid'), 'lage' => $arrLage, 'ernteart' => $arrErnteart, 'buchen' => [ 'buchbar' => (boolean) $intAvailableBehaelter, 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter), 'sorten' => $arrSorten ], ]; return $this->render('@Contao/modal_slot_annotation.html.twig',$arrData); } protected function renderBooking(bool $blnModal=true,string $error=null) { $insertTagService = Controller::getContainer()->get('contao.insert_tag.parser'); $arrData = []; if (empty($_REQUEST['id'])) { return new Response('Required parameter missing',412); } /** @var WeinanlieferungSlotsModel $Slot */ if (($Booking = WeinanlieferungReservationModel::findById($_REQUEST['id'])) === null || ($Slot = $Booking->getRelated('pid')) === null) { return new Response('Could not load booking data',500); } $objFile = FilesModel::findByUuid($Booking->upload); if (!empty($_REQUEST['deleteFile']) && $_REQUEST['deleteFile'] && $objFile !== null) { $File = new File($objFile->path); if ($File->delete()) { $objFile->delete(); $objFile = null; } } if (!empty($Booking->upload) && $objFile !== null) { $File = new File($objFile->path); $strHref = Environment::get('request'); // Remove an existing file parameter (see #5683) if (isset($_GET['file'])) { $strHref = preg_replace('/(&(amp;)?|\?)file=[^&]+/', '', $strHref); } $strHref .= (strpos($strHref, '?') !== false ? '&' : '?') . 'file=' . System::urlEncode($File->value); $arrData['file'] = [ 'link' => $strHref, 'filename' => $File->filename, 'extension' => $File->extension, 'name' => $File->name, 'path' => $File->dirname ]; } // Send the file to the browser (see #4632 and #8375) if ($objFile !== null && ($file = Input::get('file', true))) { if ($file == $objFile->path) { Controller::sendFileToBrowser($file); } } $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter()); $arrData = array_merge($arrData,[ 'modal' => $blnModal, 'id' => $Booking->id, 'slot' => array_merge($Slot->row(),[ 'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''), 'behaelterAvailable' => $intAvailableBehaelter, ]), 'buchung' => $Booking->row(), 'standort' => $Slot->getRelated('pid'), 'buchen' => [ 'buchbar' => (boolean) $intAvailableBehaelter, 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter+$Booking->behaelter), ] ]); if (!empty($error)) { $arrData['toast'] = $error; } return $this->render('@Contao/modal_booking_details.html.twig',$arrData); } protected function reservate() { Controller::loadDataContainer('tl_vr_wa_reservation'); $arrData = []; if (($rootPage = Frontend::getRootPageFromUrl()) !== null && !empty($rootPage->vr_wa_uploadFolderSRC)) { $File = new FormFileUpload(\Contao\Widget::getAttributesFromDca($GLOBALS['TL_DCA']['tl_vr_wa_reservation']['fields']['upload'], 'upload')); $File->storeFile = true; $File->doNotOverwrite = true; $File->uploadFolder = $rootPage->vr_wa_uploadFolderSRC; $File->validate(); if ($File->hasErrors()) { return $this->renderDetails(false,'
Reservierung erfolgreich
Reservierung erfolgreich geändert