<?php
/**
* Created by Elements.at New Media Solutions GmbH
*
*/
namespace App\Controller;
use App\Twig\ConfigHelper;
use Elements\Bundle\CmsToolsBundle\Tool\Helper\FunctionsHelper;
use Pimcore\Cache;
use Pimcore\Model\DataObject\Data\GeoCoordinates;
use Pimcore\Model\DataObject\Location;
use Pimcore\Model\Document\Page;
use Pimcore\Model\Document\Snippet;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class LocationController extends AbstractController
{
public function __construct(private ConfigHelper $configHelper)
{
}
/**
*
* @param Request $request
*
* @return Response
*/
public function overviewAction(Request $request): Response
{
$siteConfig = $this->configHelper->getSiteConfig();
$resort = $this->document->getProperty('resort');
$locations = new Location\Listing();
$locations->addConditionParam('config LIKE :config', ['config' => '%' . $siteConfig->getId() . '%']);
$locations->addConditionParam("name != '' AND name IS NOT NULL AND (notShow IS NULL OR notShow = 0)");
$cacheKey = str_replace(['{', '}', '(', ')', '/', '\\', '@', ':'], '', substr($request->getUri(), 0, strpos($request->getUri(), '?') ?: strlen($request->getUri())));
$usedResorts = Cache::load($cacheKey);
if (!$usedResorts) {
foreach ($locations as $location) {
$resorts = $location->getResorts();
foreach ($resorts as $res) {
$usedResorts[$res] = $res;
}
}
$cacheTime = 3600;
Cache::save($usedResorts, $cacheKey, [], $cacheTime, 0, true);
}
if ($usedResorts) {
if($resort != null && !$request->get('resort') && in_array($resort, $usedResorts)){
$locations->addConditionParam("resorts LIKE :resort", ['resort' => '%' . $resort . '%']);
}
}
if ($request->get('resort') && $request->get('resort') != 'all') {
$locations->addConditionParam('resorts LIKE :keyword', ['keyword' => '%' . $request->get('resort') . '%']);
}
$locations->setOrderKey(['IFNULL(sorter, 999999)', 'name'], false);
$locations->setOrder(['ASC', 'ASC']);
$returnArray = [
'usedResorts' => $usedResorts,
'locations' => $locations
];
if ($request->isXmlHttpRequest() && $request->get('ajax')) {
return $this->json([
'success' => true,
'html' => $this->render('location/includes/location-content.html.twig', $returnArray)->getContent(),
]);
}
return $this->renderTemplate('location/overview.html.twig', $returnArray);
}
/**
*
* @param Request $request
*
* @return Response
*/
public function detailAction(Request $request, Location $id): Response
{
$location = $id;
return $this->renderTemplate('location/detail.html.twig', [
'location' => $location
]);
}
/**
* @param Request $request
* @param FunctionsHelper $functionsHelper
* @return JsonResponse|Response
*/
public function locationfinderAction(Request $request, FunctionsHelper $functionsHelper)
{
$siteConfig = $this->configHelper->getSiteConfig();
$resort = $this->document->getProperty('resort');
$locations = new Location\Listing();
$locations->addConditionParam("name != '' AND name IS NOT NULL AND (notShow IS NULL OR notShow = 0)");
$locations->addConditionParam('config LIKE :config', ['config' => '%' . $siteConfig->getId() . '%']);
$cacheKey = str_replace(['{', '}', '(', ')', '/', '\\', '@', ':'], '', substr($request->getUri(), 0, strpos($request->getUri(), '?') ?: strlen($request->getUri())));
$usedResorts = Cache::load($cacheKey);
if (!$usedResorts) {
foreach ($locations as $location) {
$resorts = $location->getResorts();
foreach ($resorts as $res) {
$usedResorts[$res] = $res;
}
}
$cacheTime = 3600;
Cache::save($usedResorts, $cacheKey, [], $cacheTime, 0, true);
}
if ($usedResorts) {
if($resort != null && !$request->get('resort') && in_array($resort, $usedResorts)){
$locations->addConditionParam("resorts LIKE :resort", ['resort' => '%' . $resort . '%']);
}
}
if ($request->get('resort') && $request->get('resort') != 'all') {
$locations->addConditionParam('resorts LIKE :keyword', ['keyword' => '%' . $request->get('resort') . '%']);
}
if($request->get('location', '') && $request->get('searchLocationLat', '') && $request->get('searchLocationLng', '')) {
$currentLocationLat = $request->get('searchLocationLat', '');
$currentLocationLng = $request->get('searchLocationLng', '');
} else {
$currentLocationLat = $request->get('currentLocationLat', '');
$currentLocationLng = $request->get('currentLocationLng', '');
}
$geoPoint = null;
if ($currentLocationLat && $currentLocationLng) {
$geoPoint = new GeoCoordinates($currentLocationLat, $currentLocationLng);
}
if ($geoPoint && ($geoPoint->getLatitude() === null || $geoPoint->getLongitude() === null)) {
$geoPoint = null;
}
if($geoPoint) {
$distanceQuery = $functionsHelper->getGeoDistanceQuery($geoPoint, 'geo');
$locations->setOrderKey($distanceQuery, false);
$locations->setOrder('ASC');
}else{
$locations->setOrderKey(['IFNULL(sorter, 999999)', 'name'], false);
$locations->setOrder(['ASC', 'ASC']);
}
$returnArray = [
'locations' => $locations,
'usedResorts' => $usedResorts,
];
$pois = [];
$poiStyles = [
'construction' => 'bm',
'loader' => 'lt',
'group' => 'gp'
];
foreach($locations as $key => $location) {
if ($position = $location->getGeo()) {
$poiData = [
'id' => $location->getId(),
'poiStyle' => $poiStyles[$location->getResorts()[0]],
'lat' => $position->getLatitude(),
'lng' => $position->getLongitude(),
'detailInfo' => 'dealer-search-'. $location->getId(),
];
$pois[] = $poiData;
}
}
if ($request->isXmlHttpRequest() && $request->get('pois')) {
return $this->json([
'success' => true,
'pois' => $pois
]);
}
if ($request->isXmlHttpRequest() && $request->get('ajax')) {
return $this->json([
'success' => true,
'html' => $this->render('location/includes/location-list.html.twig', $returnArray)->getContent(),
]);
}
return $this->renderTemplate('location/locationfinder.html.twig', $returnArray);
}
}