src/Elements/Bundle/DemiFrontendBundle/Controller/InfrastructureController.php line 239

Open in your IDE?
  1. <?php
  2. /**
  3.  * Elements DeMI
  4.  *
  5.  * This source file is available under the elements DeMI license version 1
  6.  *
  7.  * @copyright  Copyright (c) elements.at New Media Solutions GmbH (https://www.elements.at/)
  8.  * @license    elements DeMI Lizenz Version 1 (https://www.elements.at/de/demi-lizenz)
  9.  */
  10. namespace Elements\Bundle\DemiFrontendBundle\Controller;
  11. use Carbon\Carbon;
  12. use Elements\Bundle\CmsToolsBundle\Tool\Helper\ElementsCustomDateFormat;
  13. use Elements\Bundle\DemiFrontendBundle\Service\DemiUrl;
  14. use Elements\Demi\Frontend\Service\Configuration;
  15. use Elements\Bundle\DemiFrontendBundle\Service\ConnectedEntryProvider;
  16. use Elements\Bundle\DemiFrontendBundle\Service\InfrastructureHelper;
  17. use Elements\Bundle\DemiFrontendBundle\Service\PaginatorHelper;
  18. use Elements\Bundle\SeoHelperBundle\Templating\Helper\Robots;
  19. use Elements\Demi\Deskline\Constant\FacilityGroupTypeInterface;
  20. use Elements\Demi\Model\Infrastructure;
  21. use Elements\Demi\Model\Listing\Infrastructure as InfrastructureListing;
  22. use Pimcore\Model\DataObject\DemiFilterObject;
  23. use Pimcore\Model\Document;
  24. use Pimcore\Model\Document\Editable\Areablock;
  25. use Pimcore\Model\Document\Editable\Checkbox;
  26. use Pimcore\Model\Document\Editable\Multiselect;
  27. use Pimcore\Model\Document\Editable\Relations;
  28. use Pimcore\Model\Document\Editable\Select;
  29. use Symfony\Component\HttpFoundation\JsonResponse;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use Symfony\Component\HttpKernel\Exception\GoneHttpException;
  33. class InfrastructureController extends AbstractDemiController
  34. {
  35.     protected ?InfrastructureListing $listing null;
  36.     public function __construct(protected Robots $robots,
  37.                                 protected InfrastructureHelper $infraHelper,
  38.                                 protected ConnectedEntryProvider $connectedEntryProvider,
  39.                                 ElementsCustomDateFormat $elementsCustomDateFormat,
  40.                                 protected PaginatorHelper $paginatorHelper,
  41.                                 Configuration $configuration,
  42.                                 protected DemiUrl $demiUrl)
  43.     {
  44.         $this->setConfiguration($configuration);
  45.         $this->setElementsCustomDateFormat($elementsCustomDateFormat);
  46.         if ($this->listing === null) {
  47.             $this->listing = new InfrastructureListing();
  48.         }
  49.     }
  50.     public function overviewAction(Request $request)
  51.     {
  52.         // is Ajax Request
  53.         $isAjax $request->isXmlHttpRequest();
  54.         $viewParams["isAjax"] = $isAjax;
  55.         $editablePrefix $this->findEditablePrefix($this->document);
  56.         if ($request->get('isArea')){
  57.             $viewParams $this->infraHelper->getInfrastructureListAreaViewParams($request$viewParams$this->document);
  58.         } else {
  59.             $this->setParams($request$editablePrefix);
  60.             $this->infraHelper->applyCustomFilters($this->listing$request);
  61.             $resarr $this->listing->load();
  62.             $today = new Carbon();
  63.             usort($resarr, function (Infrastructure $aInfrastructure $b) use ($today) {
  64.                 $opena $this->infraHelper->getIsOpened($a$today);
  65.                 $openb $this->infraHelper->getIsOpened($b$today);
  66.                 if (($opena === 'open' && $openb === 'open') || ($opena !== 'open' && $openb !== 'open')) {
  67.                     $orderkey $this->listing->getOrderkey()[0];
  68.                     if ($orderkey === 'name ASC') {
  69.                         return strcmp($a->getName(), $b->getName());
  70.                     }
  71.                     if ($orderkey === 'name DESC') {
  72.                         return strcmp($b->getName(), $a->getName());
  73.                     }
  74.                     $randa mt_rand();
  75.                     $randb mt_rand();
  76.                     return $randa $randb;
  77.                 }
  78.                 if ($opena === 'open' && $openb !== 'open') {
  79.                     return -1;
  80.                 }
  81.                 return 1;
  82.             });
  83.             $this->infraHelper->applyCustomSorting($resarr$request);
  84.             $entriesPerPage $this->document->getEditable($editablePrefix 'perPage')->getNumber() ?: 12;
  85.             $list = new InfrastructureListing();
  86.             if (count($resarr) > 0) {
  87.                 $list->addConditionParam('o_id IN (' implode(','array_map(static function ($infra) {
  88.                         return $infra->getId();
  89.                     }, $resarr)) . ')'); //recreate listing for knp paginator after recurring dates filtering
  90.             } else {
  91.                 $list->addConditionParam('o_id = -1');
  92.             }
  93.             if ($request->get('nopaging')) {
  94.                 $infrastructurePaginator $this->paginatorHelper->getPaginator($list0);
  95.             } else {
  96.                 $infrastructurePaginator $this->paginatorHelper->getPaginator($list$entriesPerPage, (int)$request->get('page'1));
  97.             }
  98.             $viewParams["infrastructureList"] = $infrastructurePaginator;
  99.         }
  100.         // Ausgabe Templates
  101.         if ($isAjax) {
  102.             $this->robots->setNoIndex();
  103.             if ($request->headers->get('format') === 'json' && $request->get('mapPois')) {
  104.                 $jsonArray = [];
  105.                 foreach ($viewParams["infrastructureList"] as $searchObj) {
  106.                     if (!is_null($searchObj->getPosition())) {
  107.                         $pos $searchObj->getPosition();
  108.                         $jsonArray['pois'][] = [
  109.                             'id' => $searchObj->getId(),
  110.                             'geo' => ['latitude' => $pos->getLatitude(), 'longitude' => $pos->getLongitude()],
  111.                             'infoboxUrl' => '/' $request->getLocale() . '/map-teaser__' $searchObj->getId(),
  112.                             'labelClass' => $request->get('labelClass'),
  113.                             'labelColor' => $request->get('labelColor')
  114.                         ];
  115.                     }
  116.                 }
  117.                 return new JsonResponse($jsonArray);
  118.             }
  119.             if ($request->get('useTemplate') === 'list') {
  120.                 if ($request->headers->get('format') === 'json') {
  121.                     $response = [
  122.                         'success' => true,
  123.                         'content' => $this->renderTemplate('@ElementsDemiFrontend/Infrastructure/infrastructure-list-result.html.twig'$viewParams)->getContent()
  124.                     ];
  125.                     return $this->json($response);
  126.                 }
  127.                 return $this->renderTemplate('@ElementsDemiFrontend/Infrastructure/infrastructure-list-result.html.twig'$viewParams);
  128.             }
  129.             if ($request->headers->get('format') === 'json') {
  130.                 $response = [
  131.                     'status' => 'success',
  132.                     'html' => $this->renderTemplate('@ElementsDemiFrontend/Infrastructure/infrastructure-result.html.twig'$viewParams)->getContent()
  133.                 ];
  134.                 return $this->json($response);
  135.             }
  136.             return $this->renderTemplate('@ElementsDemiFrontend/Infrastructure/infrastructure-result.html.twig'$viewParams);
  137.         } else {
  138.             throw new GoneHttpException('Only accessible for ajax calls');
  139.         }
  140.     }
  141.     protected function setParams(Request $requeststring $editablePrefix): void
  142.     {
  143.         // Keyword setzen wenn nach einem Wort gesucht wird.
  144.         $this->listing->setKeyword($request->get('keyword'));
  145.         // Predefined HolidayThemes
  146.         $holidayThemeEditable $this->document->getEditable($editablePrefix 'urlaubsthemen');
  147.         if ($holidayThemeEditable instanceof Select && !$holidayThemeEditable->isEmpty() && $holidayThemeEditable->getData() !== 'undefined') {
  148.             $this->listing->setHolidayThemes($holidayThemeEditable->getData());
  149.         }
  150.         $predefinedSortOrder $this->document->getEditable($editablePrefix 'sortorder');
  151.         if ($predefinedSortOrder instanceof Select) {
  152.             if ($predefinedSortOrder->getValue() === 'rand') {
  153.                 // Random Seed
  154.                 $seed mktime(date('H'), 00);
  155.                 $sortOrder 'RAND(' $seed ')';
  156.                 $this->listing->setOrderKey($sortOrderfalse);
  157.                 mt_srand($seed);
  158.             } elseif ($predefinedSortOrder->getValue() === 'name DESC') {
  159.                 $this->listing->setOrderKey('name DESC'false);
  160.             } else {
  161.                 $this->listing->setOrderKey('name ASC'false);
  162.             }
  163.         }
  164.         if ($request->get('demiInfraTown'0)) {
  165.             $this->listing->setRegions([$request->get('demiInfraTown')]);
  166.         }
  167.         $regionFilter $request->get('region', []);
  168.         $regionIds null;
  169.         if (!empty($regionFilter) && !empty(current($regionFilter))) {
  170.             $this->listing->setRegions($regionFilter);
  171.         } elseif ($this->document->getEditable($editablePrefix 'regions') instanceof Relations) {
  172.             foreach ($this->document->getEditable($editablePrefix 'regions')->getElements() as $region) {
  173.                 if ($region instanceof DemiFilterObject) {
  174.                     $regions $region->getFilterElements();
  175.                     foreach ($regions as $foRegion) {
  176.                         $regionIds[] = $foRegion->getId();
  177.                     }
  178.                 } else {
  179.                     $regionIds[] = $region->getId();
  180.                 }
  181.             }
  182.             if ($regionIds !== null) {
  183.                 $this->listing->setRegions($regionIds);
  184.             }
  185.         }
  186.         // filter cat from request
  187.         $catFilter $request->get('filter');
  188.         $catEditable $this->document->getEditable($editablePrefix 'category');
  189.         if (!empty($catFilter) && !empty(current($catFilter))) {
  190.             $this->listing->setCategory($catFilter);
  191.         } elseif ($catEditable instanceof Multiselect && !$catEditable->isEmpty()) {
  192.             $this->listing->setCategory($catEditable->getData());
  193.         }
  194.         if ($this->configuration->getContentScoreFilterInfrastructure() > 0) {
  195.             $this->listing->setContentScore($this->configuration->getContentScoreFilterInfrastructure());
  196.         }
  197.         $this->listing->addConditionParam("name != '' AND active = 1");
  198.     }
  199.     public function detailAction(Request $requestint $id): Response
  200.     {
  201.         if ($this->document->getProperty('infrastructure')) {
  202.             $object $this->document->getProperty('infrastructure');
  203.         } else {
  204.             $object Infrastructure::getById($id);
  205.         }
  206.         if (!$object) {
  207.             throw new GoneHttpException('Not found');
  208.         }
  209.         if($object && !$object->isPublished() && $object->getProperty('feratelId')){
  210.             return $this->forward(self::class. '::redirectViaFeratelIdProperty', [
  211.                 'request' => $request,
  212.                 'object' => $object,
  213.                 'demiUrl' => $this->demiUrl
  214.             ]);
  215.         }
  216.         if (!isset($_COOKIE['pimcore_admin_sid']) && !$this->editmode && !$object->isPublished() && !$request->get('pimcore_object_preview')) {
  217.             return $this->forward(self::class. '::unavailableAction', [
  218.                 'request' => $request,
  219.                 'unavailableType' => 'infrastructure'
  220.             ]);
  221.         }
  222.         // Facilities
  223.         if (method_exists($object'getFacilitiesFeratel')) {
  224.             $facilities $object->getFacilitiesFeratel();
  225.         } else {
  226.             $facilities $object->getFacilities();
  227.         }
  228.         $sortedHealthMeasures = [];
  229.         if (!empty($facilities)) {
  230.             foreach ($facilities as $facility) {
  231.                 $facGroup $facility->getFacilityGroup();
  232.                 if ($facGroup && $facGroup->getFacilityGroupType() == FacilityGroupTypeInterface::FACILITY_GROUP_TYPE_HEALTH) {
  233.                     if (!isset($sortedHealthMeasures[$facGroup->getId()])) {
  234.                         $data = [
  235.                             'name' => $facGroup->getName(),
  236.                             'keyname' => $facGroup->getDemiIconClass(),
  237.                             'facilities' => []
  238.                         ];
  239.                         $sortedHealthMeasures[$facGroup->getId()] = $data;
  240.                     }
  241.                     $facName $facility->getName();
  242.                     $sortedHealthMeasures[$facGroup->getId()]['facilities'][] = $facName;
  243.                 }
  244.             }
  245.         }
  246.         $viewParams["sortedHealthMeasures"] = $sortedHealthMeasures;
  247.         $viewParams["connectedEntries"] = $this->connectedEntryProvider->getConnectedEntriesForInfrastructure($object$request);
  248.         $viewParams["infrastructure"] = $object;
  249.         return $this->renderTemplate('@ElementsDemiFrontend/Infrastructure/detail.html.twig'$viewParams);
  250.     }
  251.     protected function findEditablePrefix(Document $document): string
  252.     {
  253.         if ($document->getEditables() !== null) {
  254.             $areaBlock current(array_filter($document->getEditables(), static function ($editable) {
  255.                 return $editable instanceof Areablock;
  256.             }));
  257.             if ($areaBlock && !empty($areaBlock->getIndices())) {
  258.                 $correctIndex array_filter($areaBlock->getIndices(), static function ($index) {
  259.                     return $index['type'] === 'demi-infrastructure-list' ||
  260.                         $index['type'] === 'demi-infrastructure-teaser-grid';
  261.                 });
  262.                 return $areaBlock->getName() . ':' current($correctIndex)['key'] . '.';
  263.             }
  264.         }
  265.         // Fallback for overriden documents
  266.         if ($document->getContentMasterDocument() !== null) {
  267.             return $this->findEditablePrefix($document->getContentMasterDocument());
  268.         }
  269.         return '';
  270.     }
  271. }