<?php
namespace DestiSuiteBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Pimcore\Controller\FrontendController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use DestiSuiteBundle\Controller\BaseController;
use Knp\Component\Pager\Paginator;
use DestiSuiteBundle\Model\DataObject\Experience;
use DestiSuiteBundle\Model\DataObject\ExperienceCategory;
use Pimcore\Model\DataObject\Location;
use DestiSuiteBundle\Repository\ExperienceRepository;
use DestiSuiteBundle\Repository\ExperienceCategoryRepository;
class ExperienceController extends BaseController
{
/**
* @Template
* @param Request $request
* @return array
*/
public function indexAction(Request $request)
{
$multisiteOwner = $this->document->getProperty('multisiteOwner');
$view = $request->get('view');
$locale = $request->get('_locale');
$locationList = ExperienceRepository::getUsedLocations($locale, $multisiteOwner, true);
$redirect = $this->checkFilterRequestedNotAvailable($request, $locationList);
if (!empty($redirect)) {
return $redirect;
}
$dataFrom = null;
$dataTo = null;
$explicitDateSearch = false;
if ($dateTmp = $request->get('date')) {
$dateTmp = explode('-', $dateTmp);
$since = null;
$until = null;
if (!empty($dateTmp[0]) && !empty($dateTmp[1])) {
$since = explode('.', trim($dateTmp[0]));
$until = explode('.', trim($dateTmp[1]));
}
if (!empty($since) && count($since) == 3 && !empty($until) && count($until) == 3) {
$dataFrom = new \DateTime($since[2].'-'.$since[1].'-'.$since[0]);
$dataTo = new \DateTime($until[2].'-'.$until[1].'-'.$until[0]);
$explicitDateSearch = true;
}
}
// datepicker value
if (empty($dataFrom) || empty($dataTo)) {
/*$dataFrom = new \DateTime();
$dataTo = new \DateTime();
$dataTo->add(new \DateInterval('P7D'));
$dataFrom->setTime(0,0,0);
$dataTo->setTime(0,0,0);*/
$date = '';
} else {
$date = $dataFrom->format('d.m.Y') . ' - ' . $dataTo->format('d.m.Y');
}
$paginator = null;
$markerDatas = array();
$locations = array();
if ($locationIds = $request->get('locations')) {
foreach ($locationIds as $locationId) {
$location = Location::getById($locationId);
if (!empty($location)) {
$locations[] = $location;
if (!empty($location->getChildren())) {
foreach ($location->getChildren() as $c) {
$locations[] = $c;
}
}
}
}
}
$categories = array();
$categoryIds = array();
$searchConsideringChildren = false;
if (!empty($request->get('subcategories'))) {
$categoryIds = array_merge($categoryIds, $request->get('subcategories'));
$searchConsideringChildren = true;
} else if (!empty($request->get('categories'))) {
$categoryIds = array_merge($categoryIds, $request->get('categories'));
$searchConsideringChildren = true;
}
foreach ($categoryIds as $categoryId) {
$category = ExperienceCategory::getById($categoryId);
if (!empty($category)) {
$categories[] = $category;
if ($searchConsideringChildren) {
foreach($category->getSubcategories() as $c) {
$categories[] = $c;
}
}
}
}
$filters = array(
'categories' => $categories,
'locations' => $locations,
'dataFrom' => $dataFrom,
'dataTo' => $dataTo,
'name' => $request->get('name'),
);
$includeVisibleAfterExpiration = true;
if ($explicitDateSearch) {
$includeVisibleAfterExpiration = false; // when explicit period searched, do not include expired entities
}
if ($view == 'map') {
$eventIds = ExperienceRepository::getNextEntities($request->get('_locale'), $multisiteOwner, $filters, null, true, false, $includeVisibleAfterExpiration);
$markerDatas = ExperienceRepository::getMapMarkerData($request->get('_locale'), $eventIds);
} else {
/*
$lifetime = 60 * 60;
$cacheKey = md5('experience_listing_seed');
if(!$randomSeed = \Pimcore\Cache::load($cacheKey)) {
$randomSeed = time();
\Pimcore\Cache::save(
$randomSeed,
$cacheKey,
["seed"],
$lifetime
);
}
*/
$entityList = ExperienceRepository::getNextEntities($request->get('_locale'), $multisiteOwner, $filters, null, false, false, $includeVisibleAfterExpiration);
$paginator = \Pimcore::getContainer()->get(\Knp\Component\Pager\PaginatorInterface::class);
$paginator = $paginator->paginate( // TODO GF -- PASS LIST OBJ, to implement real pagination
$entityList,
$request->get('page', 1),
9
);
}
return [
'isSubmitted' => !empty($request->getQueryString()),
'locationList' => $locationList,
// 'categoryList' => $categoryList,
'experienceList' => $paginator,
'date' => $date,
'viewType' => $view,
'markerDatas' => $markerDatas
];
}
private function checkFilterRequestedNotAvailable($request, $locationList)
{
$valid = true;
if ($locationIds = $request->get('locations')) {
foreach ($locationIds as $locationId) {
$found = false;
foreach ($locationList as $locationObj) {
if ($locationObj->getId() == $locationId) {
$found = true;
}
}
if (!$found) {
$valid = false;
}
}
}
$categoryList = ExperienceCategoryRepository::getUsedCategories($request->get('_locale'), $this->document->getProperty('multisiteOwner'));
$categoryIds = array();
if (!empty($request->get('subcategories'))) {
$categoryIds = array_merge($categoryIds, $request->get('subcategories'));
} else if (!empty($request->get('categories'))) {
$categoryIds = array_merge($categoryIds, $request->get('categories'));
}
if ($categoryIds) {
foreach ($categoryIds as $categoryId) {
$found = false;
foreach ($categoryList as $categoryObj) {
if ($categoryObj->getId() == $categoryId) {
$found = true;
}
}
if (!$found) {
$valid = false;
}
}
}
if (!$valid) {
$url = null;
if ($this->document->getController() == 'DestiSuiteBundle\Controller\Experience::indexAction') {
$url = $this->document->getFullPath();
}
if (!empty($url)) {
return $this->redirect($url, 302);
}
}
}
/**
* @Template
* @Route("/{_locale}/ajax-experience", name="experience-ajax-detail")
*/
public function ajaxdetailAction(Request $request)
{
$translateUrls = array();
foreach (\Pimcore\Tool::getValidLanguages() as $lang) {
$translateUrls[$lang] = $this->get('router')->generate('experience-ajax-detail', ['_locale' => $lang]);
}
return [
'bodyClass' => 'ds-body-obj-detail',
'translateUrls' => $translateUrls
];
}
/**
* @Route("/{_locale}/ajax-experience-url/{id}", name="experience-ajax-detail-url")
*/
public function ajaxdetailurlAction(Request $request)
{
$entity = Experience::getById($request->get('id'));
if (empty($entity)) {
throw new NotFoundHttpException('Not found.');
}
$url = \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\ExperienceLinkGenerator')->generate($entity);
$languageSwitch = \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\ExperienceLinkGenerator')->languageSwitchUrls($entity);
$url = $this->addDsBasicAuth([$url])[0];
return $this->json([
'url' => $url,
'languageSwitch' => $languageSwitch,
'url_relative' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\ExperienceLinkGenerator')->generate($entity, [], true),
'title' => !empty($entity->getMetaTitle()) ? $entity->getMetaTitle() : $entity->getTitle(),
]);
}
/**
* @Template
* @Route("/{_locale}/experience/{slug}_{id}", name="experience-detail")
*/
public function detailAction(Request $request)
{
$this->addResponseHeader('Access-Control-Allow-Origin', '*', false, $request);
$this->addResponseHeader('Access-Control-Allow-Headers', "origin, x-requested-with, content-type, authorization", false, $request);
// $this->addResponseHeader('Access-Control-Allow-Methods', "GET,POST,OPTIONS,DELETE,PUT", false, $request);
$multisiteOwner = $this->document->getProperty('multisiteOwner');
$experience = Experience::getById($request->get('id'));
if (empty($experience)) {
throw new NotFoundHttpException('Experience not found.');
}
if (empty($experience->isVisible($multisiteOwner)) && empty($this->verifyPreviewRequest($request, $experience))) {
throw new NotFoundHttpException('Experience not found.');
}
if ($this->verifyPreviewRequest($request, $experience)) {
$this->setObjPreviewLocale($experience);
}
$correlatedEntities = $experience->getCorrelatedEvents($request->get('_locale'), $multisiteOwner);
return [
'bodyClass' => 'ds-body-obj-detail',
'experience' => $experience,
'translateUrls' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\ExperienceLinkGenerator')->languageSwitchUrls($experience),
'correlatedEntities' => $correlatedEntities,
'bundleType' => Experience::getDs_bundle_type()
];
}
/**
* @Template
* @Route("/{_locale}/map_popup/experience/{id}", name="experience-map-popup")
*/
public function mappopupAction(Request $request, $id)
{
$entity = Experience::getById($id);
return [
'entity' => $entity
];
}
/**
* @Template
* @Route("/{_locale}/experience-cart", name="experience-cart")
*/
public function cartAction(Request $request)
{
}
/**
* @Template
* @Route("/{_locale}/experience/testtosc5/{slug}_{id}", name="experience-detail-testtosc5")
*/
public function testtosc5detailAction(Request $request)
{
$this->checkBasicAuth();
$multisiteOwner = $this->document->getProperty('multisiteOwner');
$experience = Experience::getById($request->get('id'));
if (empty($experience)) {
throw new NotFoundHttpException('Experience not found.');
}
if (empty($experience->isVisible($multisiteOwner)) && empty($this->verifyPreviewRequest($request, $experience))) {
throw new NotFoundHttpException('Experience not found.');
}
if ($this->verifyPreviewRequest($request, $experience)) {
$this->setObjPreviewLocale($experience);
}
$correlatedEntities = $experience->getCorrelatedEvents($request->get('_locale'), $multisiteOwner);
return [
'experience' => $experience,
'translateUrls' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\ExperienceLinkGenerator')->languageSwitchUrls($experience),
'correlatedEntities' => $correlatedEntities,
];
}
/**
* @Template
* @Route("/{_locale}/testtosc5-experiences", name="experiences-testtosc5")
*/
public function testtosc5landingAction(Request $request)
{
if (!$this->editmode) {
$this->checkBasicAuth();
}
}
private function checkBasicAuth()
{
if (!isset($_SERVER['PHP_AUTH_USER']) || !($_SERVER['PHP_AUTH_USER'] == 'mf' && $_SERVER['PHP_AUTH_PW'] == 'dev')) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Unauthorized';
exit;
}
}
}