src/Controller/InteractiveMapController.php line 40

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Twig\DemiExtension;
  4. use App\Twig\LinkGenerator;
  5. use Carbon\Carbon;
  6. use Elements\Bundle\CmsToolsBundle\Tool\Helper\FunctionsHelper;
  7. use Elements\Bundle\DemiFrontendBundle\Service\DemiUrl;
  8. use Elements\Bundle\DemiFrontendBundle\Service\Teaser;
  9. use Pimcore\Config;
  10. use Pimcore\Model\DataObject\AbstractObject;
  11. use Pimcore\Model\DataObject\Data\GeoCoordinates;
  12. use Elements\Demi\Model\Listing\Infrastructure as InfrastructureListing;
  13. use Pimcore\Model\DataObject\DemiFilterObject;
  14. use Pimcore\Model\DataObject\DemiInfrastructure;
  15. use Pimcore\Model\DataObject\DemiInfrastructureTopic;
  16. use Pimcore\Model\DataObject\Region;
  17. use Pimcore\Model\Document\Editable\Relations;
  18. use Pimcore\Model\Document\Page;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. class InteractiveMapController extends AbstractController
  22. {
  23.     /**
  24.      * @param Request $request
  25.      * @param DemiExtension $demiExtension
  26.      * @param Config $config
  27.      */
  28.     public function mapAction(Request $requestDemiExtension $demiExtensionConfig $config)
  29.     {
  30.         $selection $this->getSelectedFiltersFromRequest($request);
  31.         return $this->renderTemplate('InteractiveMap/map.html.twig', [
  32.             'selection' => $selection
  33.         ]);
  34.     }
  35.     public function flexMapAction(Request $requestDemiExtension $demiExtensionConfig $config) {
  36.         $selection $this->getSelectedFlexFiltersFromRequest($request);
  37.         return $this->renderTemplate('InteractiveMap/flexMap.html.twig', [
  38.             'selection' => $selection
  39.         ]);
  40.     }
  41.     /**
  42.      * @Route("/{_locale}/im/pois", name="im_pois")
  43.      * @param Request $request
  44.      * @param Config $config
  45.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  46.      */
  47.     public function pois(Request $requestConfig $config) {
  48.         $pois = [];
  49.         $excursionCategories $request->get('excursionFilter', []);
  50.         $culinaryCategories $request->get('culinaryFilter', []);
  51.         $infraCategories $request->get('infrastructureFilter', []);
  52.         $transitCategories $request->get('transitFilter', []);
  53.         // show all if only location filter is set
  54.         $showAll $request->get('location-lat'false) && $request->get('location-lng'false) && empty($excursionCategories) && empty($culinaryCategories) && empty($infraCategories) && empty($transitCategories);
  55.         if ($showAll && empty($excursionCategories)) {
  56.             $document Page::getById($request->get('docId'));
  57.             if ($document instanceof Page) {
  58.                 $relation $document->getEditable('excursionTopics');
  59.                 if ($relation instanceof Relations && !$relation->isEmpty()) {
  60.                     foreach($relation->getElements() as $topic) {
  61.                         $excursionCategories[] = $topic->getId();
  62.                     }
  63.                 }
  64.             }
  65.         }
  66.         if ($showAll && empty($culinaryCategories)) {
  67.             if (!$document instanceof Page) {
  68.                 $document Page::getById($request->get('docId'));
  69.             }
  70.             if ($document instanceof Page) {
  71.                 $relation $document->getEditable('culinaryTopics');
  72.                 if ($relation instanceof Relations && !$relation->isEmpty()) {
  73.                     foreach($relation->getElements() as $topic) {
  74.                         $culinaryCategories[] = $topic->getId();
  75.                     }
  76.                 }
  77.             }
  78.         }
  79.         if ($showAll && empty($infraCategories)) {
  80.             if (!$document instanceof Page) {
  81.                 $document Page::getById($request->get('docId'));
  82.             }
  83.             if ($document instanceof Page) {
  84.                 $relation $document->getEditable('infraTopics');
  85.                 if ($relation instanceof Relations && !$relation->isEmpty()) {
  86.                     foreach($relation->getElements() as $topic) {
  87.                         $infraCategories[] = $topic->getId();
  88.                     }
  89.                 }
  90.             }
  91.         }
  92.         if ($showAll && empty($transitCategories)) {
  93.             if (!$document instanceof Page) {
  94.                 $document Page::getById($request->get('docId'));
  95.             }
  96.             if ($document instanceof Page) {
  97.                 $relation $document->getEditable('transitTopics');
  98.                 if ($relation instanceof Relations && !$relation->isEmpty()) {
  99.                     foreach($relation->getElements() as $topic) {
  100.                         $transitCategories[] = $topic->getId();
  101.                     }
  102.                 }
  103.             }
  104.         }
  105.         $infraListing $this->getInfraList($excursionCategories$request$showAll);
  106.         foreach($infraListing as $infra) {
  107.             if ($position $infra->getPosition()) {
  108.                 $poiData = [
  109.                     'id' => $infra->getId(),
  110.                     'poiStyle' => 'sightseeing',
  111.                     'lat' => $position->getLatitude(),
  112.                     'lng' => $position->getLongitude(),
  113.                     'detailInfoBoxUrl' => $this->generateUrl('im_info-box', ['id' => $infra->getId(), '_locale' => $request->getLocale(), 'poiStyle'=> 'sightseeing'])
  114.                 ];
  115.                 $pois[] = $poiData;
  116.             }
  117.         }
  118.         $infraListing $this->getInfraList($culinaryCategories$request$showAll);
  119.         foreach($infraListing as $infra) {
  120.             if ($position $infra->getPosition()) {
  121.                 $poiData = [
  122.                     'id' => $infra->getId(),
  123.                     'poiStyle' => 'gastronomy',
  124.                     'lat' => $position->getLatitude(),
  125.                     'lng' => $position->getLongitude(),
  126.                     'detailInfoBoxUrl' => $this->generateUrl('im_info-box', ['id' => $infra->getId(), '_locale' => $request->getLocale(), 'poiStyle'=> 'gastronomy'])
  127.                 ];
  128.                 $pois[] = $poiData;
  129.             }
  130.         }
  131.         $infraListing $this->getInfraList($infraCategories$request$showAll);
  132.         foreach($infraListing as $infra) {
  133.             if ($position $infra->getPosition()) {
  134.                 $poiData = [
  135.                     'id' => $infra->getId(),
  136.                     'poiStyle' => 'infrastructure',
  137.                     'lat' => $position->getLatitude(),
  138.                     'lng' => $position->getLongitude(),
  139.                     'detailInfoBoxUrl' => $this->generateUrl('im_info-box',
  140.                         ['id' => $infra->getId(), '_locale' => $request->getLocale(), 'poiStyle' => 'infrastructure'])
  141.                 ];
  142.                 $pois[] = $poiData;
  143.             }
  144.         }
  145.         $infraListing $this->getInfraList($transitCategories$request$showAll);
  146.         foreach($infraListing as $infra) {
  147.             if ($position $infra->getPosition()) {
  148.                 $poiData = [
  149.                     'id' => $infra->getId(),
  150.                     'poiStyle' => 'traffic',
  151.                     'lat' => $position->getLatitude(),
  152.                     'lng' => $position->getLongitude(),
  153.                     'detailInfoBoxUrl' => $this->generateUrl('im_info-box',
  154.                         ['id' => $infra->getId(), '_locale' => $request->getLocale(), 'poiStyle' => 'traffic'])
  155.                 ];
  156.                 $pois[] = $poiData;
  157.             }
  158.         }
  159.         return $this->json([
  160.             'success' => true,
  161.             'pois' => $pois
  162.         ]);
  163.     }
  164.     /**
  165.      * @Route("/{_locale}/im/flex/pois", name="ifm_pois")
  166.      * @param Request $request
  167.      * @param Config $config
  168.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  169.      */
  170.     public function flexPois(Request $requestConfig $config) {
  171.         $pois = [];
  172.         $document Page::getById($request->get('documentId'));
  173.         if($document) {
  174.             $blockName "filterblock";
  175.             $topicInputId "topics_id";
  176.             $topicRelationsId "topics";
  177.             $topicIconName "topics_icon";
  178.             $filters $document->getEditable($blockName) ? $document->getEditable($blockName)->getElements() : [];
  179.             $topicCategories $this->getTopicsFromRequestByBlock($request$filters$topicInputId);
  180.             // show all if only location filter is set
  181.             $showAll $this->showAllTopics($request$topicCategories);
  182.             $categories = [];
  183.             if (!empty($filters)){
  184.                 foreach ($filters as $filter) {
  185.                     //if there is no topic preselected => use all topics from relations field
  186.                     if($filter->getInput($topicInputId) &&
  187.                         ($input $filter->getInput($topicInputId)->getData()) &&
  188.                         $filter->getSelect($topicIconName) &&
  189.                         ($icon $filter->getSelect($topicIconName)->getData())
  190.                     ) { // no input && no icon => do nothing
  191.                         $categories[$input]['icon'] = $icon;
  192.                         if(empty($topicCategories[$input]) && $showAll) { // get all from relations
  193.                             if($filter->getRelations($topicRelationsId) instanceof Relations &&
  194.                                 ($relations $filter->getRelations($topicRelationsId)->getElements())
  195.                             ) {
  196.                                 foreach ($relations as $topic) {
  197.                                     $categories[$input]["topics"][] = $topic->getId();
  198.                                 }
  199.                             }
  200.                         } else { // use all from request
  201.                             $categories[$input]["topics"] = $topicCategories[$input];
  202.                         }
  203.                     }
  204.                 }
  205.             }
  206.             //for every filter get every category
  207.             foreach ($categories as $topicName => $cat) {
  208.                 $infraListing $this->getInfraList($cat["topics"], $request$showAll);
  209.                 foreach($infraListing as $infra) {
  210.                     if ($position $infra->getPosition()) {
  211.                         $poiData = [
  212.                             'id' => $infra->getId(),
  213.                             'poiStyle' => $cat["icon"],
  214.                             'lat' => $position->getLatitude(),
  215.                             'lng' => $position->getLongitude(),
  216.                             'detailInfoBoxUrl' => $this->generateUrl('im_info-box', ['id' => $infra->getId(), '_locale' => $request->getLocale(), 'poiStyle'=> $cat["icon"]])
  217.                         ];
  218.                         $pois[] = $poiData;
  219.                     }
  220.                 }
  221.             }
  222.         }
  223.         return $this->json([
  224.             'success' => true,
  225.             'pois' => $pois
  226.         ]);
  227.     }
  228.     /**
  229.      * @Route("/{_locale}/im/info-box/{id}", name="im_info-box")
  230.      * @param Request $request
  231.      * @param string $id
  232.      * @param LinkGenerator $linkGenerator
  233.      * @param DemiUrl $demiUrl
  234.      * @param Teaser $teaserHelper
  235.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  236.      */
  237.     public function infoBox(Request $requeststring $idLinkGenerator $linkGeneratorTeaser $teaserHelper) {
  238.         $object AbstractObject::getById($id);
  239.         if ($object instanceof DemiInfrastructure) {
  240.             return $this->json([
  241.                 'success' => true,
  242.                 'html' => $this->renderView('InteractiveMap/infoBox.html.twig', [
  243.                     'image' => $teaserHelper->getInfrastructureImage($object),
  244.                     'type' => $request->get('poiStyle'false),
  245.                     'name' => $object->getName(),
  246.                     'link' => $linkGenerator->generate($object),
  247.                     'text' => @$object->getShortDescription($request->getLocale(), Carbon::now())
  248.                 ])
  249.             ]);
  250.         }
  251.         return $this->json([
  252.             'success' => false,
  253.             'error' => 'object not supported'
  254.         ]);
  255.     }
  256.     /**
  257.      * @Route("/{_locale}/im/selected-filter", name="im_selected-filter")
  258.      * @param Request $request
  259.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  260.      */
  261.     public function selectedFilters(Request $request) {
  262.         $selection $this->getSelectedFiltersFromRequest($request);
  263.         return $this->json([
  264.             'success' => true,
  265.             'html' => $this->renderView('InteractiveMap/selectedFilter.html.twig', [
  266.                 'selection' => $selection
  267.             ])
  268.         ]);
  269.     }
  270.     /**
  271.      * @Route("/{_locale}/im/flex/selected-filter", name="ifm_selected-filter")
  272.      * @param Request $request
  273.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  274.      */
  275.     public function selectedFlexFilters(Request $request) {
  276.         $selection $this->getSelectedFlexFiltersFromRequest($request);
  277.         return $this->json([
  278.             'success' => true,
  279.             'html' => $this->renderView('InteractiveMap/selectedFilter.html.twig', [
  280.                 'selection' => $selection
  281.             ])
  282.         ]);
  283.     }
  284.     protected function getSelectedFiltersFromRequest(Request $request) {
  285.         $selection = [];
  286.         $excursionCategories $request->get('excursionFilter', []);
  287.         $culinaryCategories $request->get('culinaryFilter', []);
  288.         $infraCategories $request->get('infrastructureFilter', []);
  289.         $transitCategories $request->get('transitFilter', []);
  290.         $region $request->get('region'false);
  291.         $search $request->get('search'false);
  292.         $lat $request->get('location-lat');
  293.         $lng $request->get('location-lng');
  294.         if ($regionObject Region::getById($region)) {
  295.             $selection['region'] = $regionObject->getName();
  296.         }
  297.         if ($lat && $lng && $search) {
  298.             $selection['search'] = $search;
  299.         }
  300.         foreach($excursionCategories as $categoryId) {
  301.             if ($category DemiInfrastructureTopic::getById($categoryId)) {
  302.                 $selection['categories']['excursionFilter[]'][$categoryId] = $category->getName();
  303.             }
  304.         }
  305.         foreach($culinaryCategories as $categoryId) {
  306.             if ($category DemiInfrastructureTopic::getById($categoryId)) {
  307.                 $selection['categories']['culinaryFilter[]'][$categoryId] = $category->getName();
  308.             }
  309.         }
  310.         foreach($infraCategories as $categoryId) {
  311.             if ($category DemiInfrastructureTopic::getById($categoryId)) {
  312.                 $selection['categories']['infrastructureFilter[]'][$categoryId] = $category->getName();
  313.             }
  314.         }
  315.         foreach($transitCategories as $categoryId) {
  316.             if ($category DemiInfrastructureTopic::getById($categoryId)) {
  317.                 $selection['categories']['transitFilter[]'][$categoryId] = $category->getName();
  318.             }
  319.         }
  320.         return $selection;
  321.     }
  322.     protected function getSelectedFlexFiltersFromRequest(Request $request$blockName "filterblock"$topicInputId "topics_id") {
  323.         $selection = [];
  324.         $document Page::getById($request->get('docId'));
  325.         if($document) {
  326.             $filters $document->getEditable($blockName) ? $document->getEditable($blockName)->getElements() : [];
  327.         } else {
  328.             $filters $this->getDocumentEditable("block"$blockName)->getElements();
  329.         }
  330.         $categories $this->getTopicsFromRequestByBlock($request$filters$topicInputId);
  331.         $region $request->get('region'false);
  332.         $search $request->get('search'false);
  333.         $lat $request->get('location-lat');
  334.         $lng $request->get('location-lng');
  335.         if ($regionObject Region::getById($region)) {
  336.             $selection['region'] = $regionObject->getName();
  337.         }
  338.         if ($lat && $lng && $search) {
  339.             $selection['search'] = $search;
  340.         }
  341.         foreach($categories as $key => $categoryInputs) {
  342.             foreach($categoryInputs as $categoryId) {
  343.                 if ($category DemiInfrastructureTopic::getById($categoryId)) {
  344.                     $selection['categories'][($key '[]')][$categoryId] = $category->getName();
  345.                 }
  346.             }
  347.         }
  348.         return $selection;
  349.     }
  350.     protected function getInfraList($categoriesRequest $requestbool $showAll) {
  351.         if (empty($categories) && !$showAll) {
  352.             return [];
  353.         }
  354.         $functionsHelper = new FunctionsHelper();
  355.         $poiListing = new InfrastructureListing();
  356.         $poiListing->addConditionParam('name IS NOT NULL AND name != "" AND documents IS NOT NULL AND documents != "" AND descriptions IS NOT NULL AND descriptions != "" AND active = 1');
  357.         if (!empty($categories)) {
  358.             $poiListing->setCategory($categories);
  359.         }
  360.         // Region Condition
  361.         if ($request->get('region'false)) {
  362.             if ($region Region::getById($request->get('region'))) {
  363.                 if ($region->getDemiFilterObject() instanceof DemiFilterObject) {
  364.                     $items $region->getDemiFilterObject()->getFilterElements();
  365.                     $regionIds = [];
  366.                     foreach($items ?: [] as $item) {
  367.                         $regionIds[] = $item->getId();
  368.                     }
  369.                     if (!empty($regionIds)) {
  370.                         $poiListing->setRegions($regionIds);
  371.                     }
  372.                 }
  373.             }
  374.         }
  375.         // Vicinity Condition
  376.         if ($request->get('location-lat'false) && $request->get('location-lng'false)) {
  377.             $poiListing->addConditionParam($functionsHelper->getGeoDistanceQuery(new GeoCoordinates($request->get('location-lat'), $request->get('location-lng')), 'position') . ' <= 10');
  378.         }
  379.         return $poiListing;
  380.     }
  381.     private function getTopicsFromRequestByBlock(Request $request, array $filtersstring $topicInputId) : array
  382.     {
  383.         $categories = [];
  384.         if (!empty($filters)){
  385.             foreach ($filters as $filter) {
  386.                 if ($filter->getInput($topicInputId) && ($input $filter->getInput($topicInputId)->getData())){
  387.                     $categories[$input] =  $request->get($input, []);
  388.                 }
  389.             }
  390.         }
  391.         return $categories;
  392.     }
  393.     private function showAllTopics(Request $request, array $categories)
  394.     {
  395.         $showAll $request->get('location-lat'false) && $request->get('location-lng'false);
  396.         if($showAll) {
  397.             foreach ($categories as $topicCategory) {
  398.                 if(!empty($topicCategory)) {
  399.                     $showAll false;
  400.                     break;
  401.                 }
  402.             }
  403.         }
  404.         return $showAll;
  405.     }
  406. }