<?php
namespace App\Controller;
use App\Twig\LayoutExtension;
use App\Twig\LinkGenerator;
use Carbon\Carbon;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Model\DataObject\BusTravel;
use Pimcore\Model\DataObject\ConventionPartner;
use Pimcore\Model\DataObject\Package;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
class BusController extends AbstractController
{
private LayoutExtension $layoutExtension;
private LinkGenerator $linkGenerator;
public function __construct(LayoutExtension $layoutExtension, LinkGenerator $linkGenerator) {
$this->layoutExtension = $layoutExtension;
$this->linkGenerator = $linkGenerator;
}
public function overviewAction(Request $request, PaginatorInterface $paginator) {
$busListing = new BusTravel\Listing();
if($this->getDocumentEditable('select', 'filterBusTravel')->getData() != 'both') {
$busListing->addConditionParam('bustype = :bustype', ['bustype' => $this->getDocumentEditable('select', 'filterBusTravel')->getData()]);
}
if ($this->getDocumentEditable('checkbox', 'randomize-bus')->getData()){
$busListing->setOrderKey("Rand(" . Carbon::today()->unix() . ")", false);
}
$perPage = $this->getDocumentEditable('numeric', 'perPage')->getData() ?: 8;
$pagination = $paginator->paginate($busListing, $request->get('page', 1), $perPage);
if ($request->isXmlHttpRequest() && $request->get('pois', false)) {
return $this->getMapdata($pagination);
}
if($request->get('ajax') && $request->isXmlHttpRequest()) {
$response =[
"success" => true,
"content" => [
'result-main' => $this->render('Bus/Includes/bus-list.html.twig', [
'items' => $pagination,
])->getContent(),
'result-paging' => $this->renderView('Navigation/paging.html.twig', [
'styleModifier' => 'justify-content-center',
'ajaxClass' => 'js-ajax-form-map__link',
'paginator' => $pagination
]),
],
];
return new JsonResponse($response);
}
return $this->renderTemplate('Bus/overview.html.twig', [
'paginator' => $pagination,
]);
}
public function detailAction(Request $request) {
$busTravel = BusTravel::getById($request->get('id'));
if(!$busTravel) {
throw new NotFoundHttpException("the requested object doesn't exist anymore");
}
return $this->renderTemplate('Bus/detail.html.twig', [
'busTravel' => $busTravel,
'isAccommodation' => $busTravel->getBusType() == 'accommodation',
'weatherStation' => $this->getWeatherStationByBusTravel($busTravel),
'videos' => $this->getSortedVideosByBusTravel($busTravel),
'packages' => $this->getPackageTeaserByBusTravel($busTravel),
]);
}
/**
* @Route("/{_locale}/interactive-bus-map-info-box", name="interactive-bus-map-info-box")
*/
public function getBusMapInfoBox(Request $request) {
$busTravel = BusTravel::getById($request->get('id', null));
$document = $this->document;
$locale = $document->getProperty('language') ?? $request->getLocale();
if($busTravel) {
$wysiwyg = '<ul>';
foreach($busTravel->getBulletPoints($locale) as $bulletpoint) {
$wysiwyg .= '<li>' . $bulletpoint['bulletPointText']->getData() . '</li>';
}
$wysiwyg .= '</ul>';
return $this->json([
'success' => true,
'html' => $this->renderView('Convention/Includes/interactive-map-info-box.html.twig', [
'image' => $busTravel->getTeaserImage(),
'subtitle' => $busTravel->getShortDescription($locale),
'title' => $busTravel->getTitle($locale),
'wysiwyg' => $wysiwyg,
'link' => $this->linkGenerator->generate($busTravel, ['document' => $document]),
'id' => $request->get('id')
])
]);
}
}
private function getWeatherStationByBusTravel(BusTravel $busTravel) {
$weatherStation = $busTravel->getWeatherStation();
if(!$weatherStation) {
if(count($busTravel->getCommunity()) > 0) {
$weatherStation = $busTravel->getCommunity()[0]->getPrognosis();
} elseif(count($busTravel->getRegion()) > 0) {
$weatherStation = $busTravel->getRegion()[0]->getWeatherStation();
}
}
return $weatherStation;
}
private function getSortedVideosByBusTravel(BusTravel $busTravel) {
$videos = [];
// if($busTravel->getVideo1()) {
// $videos[$busTravel->getVideoPos1() ?? 'video1'] = $busTravel->getVideo1();
// }
if($busTravel->getVideo2()) {
$videos[$busTravel->getVideoPos2() ?? 'video2'] = $this->layoutExtension->getVideoEditable($busTravel->getVideo2());
}
if($busTravel->getVideo3()) {
$videos[$busTravel->getVideoPos3() ?? 'video3'] = $this->layoutExtension->getVideoEditable($busTravel->getVideo3());
}
if($busTravel->getVideo4()) {
$videos[$busTravel->getVideoPos4() ?? 'video4' ] = $this->layoutExtension->getVideoEditable($busTravel->getVideo4());
}
ksort($videos);
return $videos;
}
private function getPackageTeaserByBusTravel(BusTravel $busTravel, $numOfTeaser = 3) {
$teaserPackages = [];
if($busTravel->getPackages()) {
$tmpPackages = $busTravel->getPackages();
shuffle($tmpPackages);
$teaserPackages = array_slice($tmpPackages, 0, $numOfTeaser);
} else {
$packageListing = new Package\Listing();
$packageListing->addConditionParam('isBusTour is not null and isBusTour = 1');
$packageListing->setOrderKey('RAND()', false);
$packageListing->setLimit($numOfTeaser);
$teaserPackages = $packageListing->getObjects();
}
$teaserdata = [];
/**
* @var Package $package
*/
foreach ($teaserPackages as $package) {
$teaserdata[] = [
"title" => $package->getTitle(),
"href" => $this->linkGenerator->generate($package),
"image" => $package->getTeaserImage(),
// "badgeText" => $infra->get(),
"isInNav" => false,
"isSearchTeaser" => false,
"ratio" => null
];
}
return $teaserdata;
}
private function getMapdata(\Knp\Component\Pager\Pagination\PaginationInterface $pagination)
{
$geoData = [];
/**
* @var BusTravel $busTravel
*/
foreach ($pagination as $busTravel) {
if($busTravel) {
$geo = $busTravel->getMap();
if($geo) {
$geoData[] = [
"id" => $busTravel->getId(),
"lat" => $geo->getLatitude(),
"lng" => $geo->getLongitude(),
"detailInfoBoxUrl" => $this->generateUrl('interactive-bus-map-info-box',[
'id' => $busTravel->getId(),
])
];
}
}
}
return new JsonResponse([
"success" => true,
"pois" => $geoData
]);
}
}