src/PortalBundle/Controller/CatalogController.php line 58

Open in your IDE?
  1. <?php
  2. namespace PortalBundle\Controller;
  3. use CoreBundle\Component\CoreFormFactory;
  4. use CoreBundle\Component\FormManager;
  5. use CoreBundle\Entity\Model;
  6. use CoreBundle\Entity\Vehicles\RecommendGroup;
  7. use CoreBundle\Model\Vehicles\Repository;
  8. use CoreBundle\Services\MediaExtensionVidi;
  9. use DcSiteBundle\Model\Pagination;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use PortalBundle\Model\Catalog;
  12. use PortalBundle\Model\SeoMetaTag;
  13. use PortalBundle\Services\CatalogService;
  14. use PortalBundle\Services\ServiceService;
  15. use PortalBundle\Services\VehicleFilterService;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use CoreBundle\Entity\Brand;
  18. use CoreBundle\Entity\Dealer;
  19. use CoreBundle\Entity\Forms;
  20. use CoreBundle\Model\Vehicles\Vehicle;
  21. use CoreBundle\Model\Vehicles\VehicleType;
  22. use PortalBundle\Enums\CatalogEnum;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\RequestStack;
  25. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  26. use Symfony\Component\Routing\RouterInterface;
  27. /**
  28.  * Class CatalogController
  29.  * @package PortalBundle\Controller
  30.  */
  31. class CatalogController extends BaseController
  32. {
  33.     private Catalog $modelCatalog;
  34.     private Pagination $modelPagination;
  35.     private CatalogService $catalogService;
  36.     private MediaExtensionVidi $mediaExtensionVidi;
  37.     private SeoMetaTag $seoMetaTag;
  38.     public function __construct(RouterInterface $routerCatalog $modelCatalogPagination $modelPagination,
  39.                                 CatalogService $catalogServiceMediaExtensionVidi $mediaExtensionVidi,
  40.                                 SeoMetaTag $seoMetaTagCoreFormFactory $coreFormFactoryRequestStack $requestStack,
  41.                                 Repository $vehicleRepositoryServiceService $serviceService)
  42.     {
  43.         parent::__construct($coreFormFactory$requestStack$router$vehicleRepository$serviceService);
  44.         $this->modelCatalog $modelCatalog;
  45.         $this->modelPagination $modelPagination;
  46.         $this->catalogService $catalogService;
  47.         $this->mediaExtensionVidi $mediaExtensionVidi;
  48.         $this->seoMetaTag $seoMetaTag;
  49.     }
  50.     const PRE_PAGES 15;
  51.     const MAX_PAGINATION_BUTTON 5;
  52.     // Сторінка для тестування
  53.     public function catalog(Request $requestEntityManagerInterface $em)
  54.     {
  55.         $routeParams $request->attributes->get('_route_params');
  56.         $searchParams $request->query->all();
  57.         $cookies $request->cookies->get('compare');
  58.         $findVehicles $this->modelCatalog->findByParams($routeParams$searchParamsself::PRE_PAGES);
  59.         if(!$findVehicles['data']){
  60.             $findVehicles $this->modelCatalog->noFindVehicleByParams($routeParams$searchParamsself::PRE_PAGES);
  61.         }
  62.         $vehicles $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $routeParams$cookies);
  63.         $pagination $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES5);
  64.         $type $request->get('type');
  65.         $state $request->get('state');
  66.         $hasCredit $request->get('credit');
  67.         $brand $request->get('brand');
  68.         if (($brand && $brand === 'all') || ($state && $state === 'all')) {
  69.             throw new NotFoundHttpException();
  70.         }
  71.         $model $request->get('model');
  72.         $findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model');
  73.         $param $request->get('param');
  74.         $valueParam $request->get('value');
  75.         $group $request->get('group');
  76.         $typeData VehicleType::getTypeDataByUrl($type);
  77.         if (!$typeData || $request->get('type') == 'special') {
  78.             throw new NotFoundHttpException();
  79.         }
  80.         $vehicleTypeId $typeData['id'];
  81.         $service $this->catalogService;
  82.         $filters $service->getFilters($searchParams$request->getLocale(), $state$vehicleTypeId$brand$model$param$valueParam$routeParams$group);
  83.         if ($request->isXmlHttpRequest()) {
  84.             return $this->json([
  85.                 'vehicles' => $service->getAjaxResult($vehicles$request->getLocale()),
  86.                 'pagination' => $pagination,
  87.                 'count' => $findVehicles['count'],
  88.                 'searchFilters' => $filters,
  89.                 'hasCredit' => $hasCredit
  90.             ]);
  91.         }
  92. //        if ($findVehicles['count'] === 0) {
  93. //            throw new NotFoundHttpException();
  94. //        }
  95.         $brandEm $em->getRepository(Brand::class)->getBrandByUrl($brand);
  96.         if ($findModelUrl) {
  97.             $modelEm $em->getRepository(Model::class)->findOneByUrl($findModelUrl$brandEm);
  98.         } else {
  99.             $modelEm null;
  100.         }
  101.         $catalogNav $this->modelCatalog->getCatalogNav($type$state$hasCredit$brand$param$valueParam$group);
  102.         if(!$modelEm){
  103.             $vehicleTopViews $this->modelCatalog->getVehicleTopViews(5$brandEm);
  104.         }else{
  105.             $vehicleTopViews$this->modelCatalog->getVehicleItemTopViews(5$brandEm$modelEm);
  106.         }
  107.         if ($hasCredit && !$brandEm) {
  108.             $randomTopViews $this->modelCatalog->getRandomBrand(5);
  109.         } elseif ($hasCredit) {
  110.             $randomTopViews $this->modelCatalog->getRandomModelBrand(999$brandEm$modelEm);
  111.         }
  112.         $dealers $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm);
  113.         if (!$brand && ($routeParams['type'] == 'truck' || $routeParams['type'] == 'bus')) {
  114.             $brandSId = [];
  115.             foreach ($vehicles as $vehicle) {
  116.                 $brandSId[] = $vehicle['dealer'];
  117.             }
  118.             $dealers $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]);
  119.         }
  120.         $dealers array_filter($dealers, fn($dealer) => $dealer->getId() !== 39);
  121.         $seoLinks $this->seoMetaTag->buildSeoLinks($routeParams$request->getLocale());
  122.         $seoLinks $service->seoYearsLinksFilter($routeParams$vehicles$searchParams$seoLinks);
  123.         $isUsed $state == 'used';
  124.         $catalogCharacteristic $service->catalogCharacteristic($vehicleTypeId$isUsed);
  125.         $OrderCallForm = new Forms();
  126.         $OrderCallForm $this->CoreFormFactory()->orderCallForm($OrderCallForm$brandEm $brandEm->getDealer()[0] : null1)->createView();
  127.         return $this->basePortalRender('@Portal/Catalog/index.html.twig', [
  128.             'vehicles' => $vehicles,
  129.             'seoLinks' => $seoLinks,
  130.             'pagination' => $pagination,
  131.             'filters' => $filters,
  132.             'catalogNav' => $catalogNav,
  133.             'baseParams' => $routeParams,
  134.             'searchParams' => $searchParams,
  135.             'dealers' => $dealers,
  136.             'vehicleTopViews' => $vehicleTopViews,
  137.             'randomTopViews' => $randomTopViews ?? null,
  138.             'minMaxPrice' => $findVehicles['minMaxPrice'] ?? 0,
  139.             'minMaxCreditPayment' => $findVehicles['minMaxCreditPayment'] ?? 0,
  140.             'count' => $findVehicles['count'],
  141.             'type' => $routeParams['type'],
  142.             'state' => $routeParams['state'],
  143.             'group' => $routeParams['group'] ?? null,
  144.             'hasCredit' => $hasCredit,
  145.             'brand' => $brand,
  146.             'brandEm' => $brandEm,
  147.             'model' => $model,
  148.             'modelEm' => $modelEm,
  149.             'param' => $param,
  150.             'value' => $request->get('value'),
  151.             'year' => ($param === 1000) ? $param $valueParam,
  152.             'seoMeta' => $this->seoMetaTag->buildSeoMeta($request),
  153.             'valueParam' => $catalogCharacteristic[$param][$valueParam] ?? null,
  154.             'catalogBanner' => $service->getCatalogBanner($request),
  155.             'OrderCallForm' => $OrderCallForm ?? '',
  156.         ]);
  157.     }
  158.     /**
  159.      * @param Request $request
  160.      * @return JsonResponse
  161.      */
  162.     public function buildFilters(Request $request): JsonResponse
  163.     {
  164.         $filters $this->modelCatalog->buildFilters($request->request->all(), $request->getLocale());
  165.         return $this->json($filters);
  166.     }
  167.     /**
  168.      * @param Request $request
  169.      * @return JsonResponse
  170.      */
  171.     public function getDealersFromSelectedFilter(Request $requestEntityManagerInterface $em): JsonResponse
  172.     {
  173.         $data json_decode($request->getContent(), true);
  174.         $dealers = [];
  175.         foreach ($data as $brandUrl => $key) {
  176.             if ($key) {
  177.                 $brandEm $em->getRepository(Brand::class)->getBrandByUrl($brandUrl);
  178.                 $dealer $em->getRepository(Dealer::class)->getCarDealer($brandEm);
  179.                 if (count($dealer) > 1) {
  180.                     foreach ($dealer as $oneDealer) {
  181.                         $dealers[] = [
  182.                             'id' => $oneDealer->getId(),
  183.                             'name' => $oneDealer->getNameByLocale($request->getLocale()),
  184.                             'brandName' => $oneDealer->getBrand()->getName(),
  185.                             'domain' => $oneDealer->getDomain(),
  186.                             'logo' => $this->mediaExtensionVidi->getPath($oneDealer->getBrand()->getLogo(), 'reference'),
  187.                             'address' => $oneDealer->getAddressByLocale($request->getLocale()),
  188.                             'phone' => $oneDealer->getPhone(),
  189.                             'mapUrl' => 'https://maps.google.com/maps?q=' $oneDealer->getLat() . ',' $oneDealer->getLng() . '&hl=' $request->getLocale(),
  190.                         ];
  191.                     }
  192.                     // Для дилерів з одним брендом
  193.                 } else {
  194.                     if ($dealer) {
  195.                         $dealer $dealer[0];
  196.                         $dealers[] = [
  197.                             'id' => $dealer->getId(),
  198.                             'name' => $dealer->getNameByLocale($request->getLocale()),
  199.                             'brandName' => $dealer->getBrand()->getName(),
  200.                             'domain' => $dealer->getDomain(),
  201.                             'logo' => $this->mediaExtensionVidi->getPath($dealer->getBrand()->getLogo(), 'reference'),
  202.                             'address' => $dealer->getAddressByLocale($request->getLocale()),
  203.                             'phone' => $dealer->getPhone(),
  204.                             'mapUrl' => 'https://maps.google.com/maps?q=' $dealer->getLat() . ',' $dealer->getLng() . '&hl=' $request->getLocale(),
  205.                         ];
  206.                     }
  207.                 }
  208.             }
  209.         }
  210.         $dealers array_filter($dealers, fn($dealer) => $dealer['id'] !== 39);
  211.         return $this->json($dealers);
  212.     }
  213.     /**
  214.      * @param Request $request
  215.      * @return JsonResponse
  216.      */
  217.     public function getDealersFromFilter(Request $requestEntityManagerInterface $em): JsonResponse
  218.     {
  219.         $data json_decode($request->getContent(), true);
  220.         $dealers = [];
  221.         foreach ($data as $brand) {
  222.             $brandEm $em->getRepository(Brand::class)->getBrandByUrl($brand['url']);
  223.             $dealer $em->getRepository(Dealer::class)->getCarDealer($brandEm);
  224.             // Для дилерів з декількома брендами
  225.             if (count($dealer) > 1) {
  226.                 foreach ($dealer as $oneDealer) {
  227.                     $dealers[] = [
  228.                         'id' => $oneDealer->getId(),
  229.                         'name' => $oneDealer->getNameByLocale($request->getLocale()),
  230.                         'brandName' => $oneDealer->getBrand()->getName(),
  231.                         'domain' => $oneDealer->getDomain(),
  232.                         'logo' => $this->mediaExtensionVidi->getPath($oneDealer->getBrand()->getLogo(), 'reference'),
  233.                         'address' => $oneDealer->getAddressByLocale($request->getLocale()),
  234.                         'phone' => $oneDealer->getPhone(),
  235.                         'mapUrl' => 'https://maps.google.com/maps?q=' $oneDealer->getLat() . ',' $oneDealer->getLng() . '&hl=' $request->getLocale(),
  236.                     ];
  237.                 }
  238.                 // Для дилерів з одним брендом
  239.             } else {
  240.                 if ($dealer) {
  241.                     $dealer $dealer[0];
  242.                     $dealers[] = [
  243.                         'id' => $dealer->getId(),
  244.                         'name' => $dealer->getNameByLocale($request->getLocale()),
  245.                         'brandName' => $dealer->getBrand()->getName(),
  246.                         'domain' => $dealer->getDomain(),
  247.                         'logo' => $this->mediaExtensionVidi->getPath($dealer->getBrand()->getLogo(), 'reference'),
  248.                         'address' => $dealer->getAddressByLocale($request->getLocale()),
  249.                         'phone' => $dealer->getPhone(),
  250.                         'mapUrl' => 'https://maps.google.com/maps?q=' $dealer->getLat() . ',' $dealer->getLng() . '&hl=' $request->getLocale(),
  251.                     ];
  252.                 }
  253.             }
  254.         }
  255.         $dealers array_filter($dealers, fn($dealer) => $dealer['id'] !== 39);
  256.         return $this->json($dealers);
  257.     }
  258.     /**
  259.      * @param Request $request
  260.      * @return JsonResponse
  261.      */
  262.     public function buildUrl(Request $request)
  263.     {
  264.         $params $request->request->all();
  265.         $type $params['type'];
  266.         $state $params['state'];
  267.         $brand $params['brand'] ?? null;
  268.         $model $params['model'] ?? null;
  269.         $hasCredit $params['hasCredit'] ?? null;
  270.         $isAjax $params['isAjax'] ?? null;
  271.         if (is_array($brand) && count($brand) == 1) {
  272.             $brand array_keys($brand)[0];
  273.         }
  274.         if (is_array($model) && count($model) == 1) {
  275.             $model array_keys($model)[0];
  276.         }
  277.         $baseRouteParams = [
  278.             'type' => $type,
  279.             'state' => $state,
  280.         ];
  281.         $getParams = [];
  282.         foreach ($params as $key => $row) {
  283.             if (!in_array($key, ['type''state''brand''model''dynamic''hasCredit']) && $row) {
  284.                 $getParams[$key] = $row;
  285.             }
  286.         }
  287.         if (is_array($brand)) {
  288.             $getParams['m-brand'] = $brand;
  289.             $brand null;
  290.         } else if ($brand) {
  291.             $getParams['m-brand'] = [$brand => true];
  292.         }
  293.         if (is_array($model)) {
  294.             $getParams['m-model'] = $model;
  295.             $model null;
  296.         } else if ($model) {
  297.             $getParams['m-model'] = [$model => true];
  298.             $model null;
  299.         }
  300.         $dynamic = [];
  301.         if (isset($params['dynamic'])) {
  302.             foreach ($params['dynamic'] as $id => $values) {
  303.                 if (array_key_exists('from'$values) || array_key_exists('to'$values)) {
  304.                     $dynamic[$id] = $values;
  305.                 } else {
  306.                     foreach ($values as $url => $v) {
  307.                         if ($v != 'false') {
  308.                             $dynamic[$id][$url] = 1;
  309.                         }
  310.                     }
  311.                 }
  312.             }
  313.         }
  314.         $catalogCharacteristic array_flip($this->modelCatalog->getCatalogCharacteristicsId());
  315.         if (!$brand && !$model && (!count($dynamic) || empty(array_intersect_key($dynamic$catalogCharacteristic)))) {
  316.             $url $this->router
  317.                 ->generate(
  318.                     ($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG CatalogEnum::ROUTE_PORTAL_CATALOG,
  319.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic])
  320.                 );
  321.             return $this->json(['url' => $url]);
  322.         }
  323.         if (!$brand && !$model && count($dynamic)) {
  324.             $dId key($dynamic);
  325.             $value key($dynamic[$dId]);
  326.             if (!count($dynamic[$dId])) {
  327.                 unset($dynamic[$dId]);
  328.             }
  329.             $baseRouteParams['param'] = $dId;
  330.             $baseRouteParams['value'] = $value;
  331.             $url $this->router
  332.                 ->generate(
  333.                     ($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_PARAM CatalogEnum::ROUTE_PORTAL_CATALOG_PARAM,
  334.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic])
  335.                 );
  336.             return $this->json(['url' => $url]);
  337.         }
  338.         if ($model) {
  339.             $baseRouteParams['model'] = $model;
  340.             $baseRouteParams['brand'] = $brand;
  341.             $url $this->router
  342.                 ->generate(
  343.                     ($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_BM_NAME CatalogEnum::ROUTE_PORTAL_CATALOG_BM_NAME,
  344.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic])
  345.                 );
  346.             return $this->json(['url' => $url]);
  347.         }
  348.         if ($brand) {
  349.             $baseRouteParams['brand'] = $brand;
  350.             $url $this->router
  351.                 ->generate(
  352.                     ($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_B_NAME CatalogEnum::ROUTE_PORTAL_CATALOG_B_NAME,
  353.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic])
  354.                 );
  355.             return $this->json(['url' => $url]);
  356.         }
  357.     }
  358.     public function catalogCategory(Request $request$urlEntityManagerInterface $em,  \CoreBundle\Factory\Vehicle $vehicleFactory)
  359.     {
  360.         $dealers $em->getRepository(Dealer::class)->getCarDealer();
  361.         $recommends $em->getRepository(RecommendGroup::class)->findBy(['state' => 1]);
  362.         $recommendGroup $em->getRepository(RecommendGroup::class)->findOneBy(['url' => $url]);
  363.         $recommendGroupVehicles $em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)->getVehicleByRecommendGroupUrl(['url' => $url]);
  364.         $vehicles $vehicleFactory->createByEntities($recommendGroupVehicles);
  365.         $sort $request->get('sort');
  366.         usort($vehicles, function (Vehicle $aVehicle $b) use ($sort) {
  367.             switch ($sort) {
  368.                 case 'price-DESC':
  369.                     return $a->fullPrice() < $b->fullPrice();
  370.                 default:
  371.                     return $a->fullPrice() > $b->fullPrice();
  372.             }
  373.         });
  374.         $seoMeta = [];
  375.         $urn preg_replace('/^(\/?ua\/|\/?ru\/)/''/'$request->getRequestUri());
  376.         $seo $em->getRepository(\CoreBundle\Entity\SeoMetaTag::class)
  377.             ->findOneBy(['domain' => $request->getHost(), 'urn' => $urn]);
  378.         if ($seo && $seo->getState()) {
  379.             $seoMeta = [
  380.                 'title' => $seo->getTitle($request->getLocale()),
  381.                 'description' => $seo->getDescription($request->getLocale()),
  382.                 'h1' => $seo->getH1($request->getLocale()),
  383.                 'robots' => $seo->getRobots(),
  384.             ];
  385.         }
  386.         return $this->basePortalRender('@Portal/Car/category.html.twig', [
  387.             'dealers' => $dealers,
  388.             'recommends' => $recommends,
  389.             'recommendGroup' => $recommendGroup,
  390.             'vehicles' => $vehicles,
  391.             'url' => $url,
  392.             'seoMeta' => $seoMeta,
  393.         ]);
  394.     }
  395.     //TODO remove this magic numbers
  396.     private function createPaginator($data$page 1$limit 21)
  397.     {
  398.         $maxPages 10;
  399.         $paginator = [
  400.             'total' => ceil(count($data) / $limit),
  401.             'current' => $page,
  402.         ];
  403.         if ($paginator['total'] > $maxPages && $page floor($maxPages 2)) {
  404.             $paginator['start'] = $page floor($maxPages 2);
  405.             $paginator['end'] = $paginator['start'] + $maxPages 1;
  406.         } else {
  407.             $paginator['start'] = 1;
  408.             $paginator['end'] = min($paginator['total'], $maxPages);
  409.         }
  410.         return $paginator;
  411.     }
  412.     public function getChangeFilter(VehicleFilterService $vehicleFilterService): JsonResponse
  413.     {
  414.         return $this->json(['success' => true'filter' => $vehicleFilterService->initFilter()]);
  415.     }
  416.     public function initVehicleFilterUrl(VehicleFilterService $vehicleFilterService): JsonResponse
  417.     {
  418.         return $this->json(['success' => true'filterUrl' => $vehicleFilterService->getUrl()]);
  419.     }
  420.     public function vehicleColor(): JsonResponse
  421.     {
  422.         $vehicleImageColor $this->modelCatalog->getVehicleImageColor();
  423.         return $this->json([
  424.             'success' => true,
  425.             'image' => $vehicleImageColor,
  426.         ]);
  427.     }
  428.     public function saveCallback(Request $requestEntityManagerInterface $emFormManager $formManager)
  429.     {
  430.         $dealer $em->getRepository(Dealer::class)->findOneBy(['id' => $request->request->get('call_order')['dealer']]);
  431.         return $formManager->saveCallbackForm($request$dealer);
  432.     }
  433.     //search
  434.     /**
  435.      * @param Request $request
  436.      * @return JsonResponse
  437.      */
  438.     public function buildSearchUrl(Request $request)
  439.     {
  440.         $params $request->request->all();
  441.         $type $params['type'];
  442.         $state $params['state'];
  443.         $hasCredit filter_var($params['credit'] ?? falseFILTER_VALIDATE_BOOLEAN);
  444.         $brand $params['brand'] ?? null;
  445.         $model $params['model'] ?? null;
  446.         $isAjax $params['isAjax'] ?? null;
  447.         if (is_array($brand) && count($brand) == 1) {
  448.             $brand array_keys($brand)[0];
  449.         }
  450.         if (is_array($model) && count($model) == 1) {
  451.             $model array_keys($model)[0];
  452.         }
  453.         $baseRouteParams = [
  454.             'type' => $type,
  455.             'state' => $state,
  456.         ];
  457.         if($hasCredit){
  458.             $baseRouteParams['credit'] = true;
  459.         }
  460.         $getParams = [];
  461.         foreach ($params as $key => $row) {
  462.             if (!in_array($key, ['type''state''brand''model''dynamic']) && $row) {
  463.                 $getParams[$key] = $row;
  464.             }
  465.         }
  466.         if (is_array($brand)) {
  467.             $getParams['m-brand'] = $brand;
  468.             $brand null;
  469.         } else if ($brand) {
  470.             $getParams['m-brand'] = [$brand => true];
  471.         }
  472.         if (is_array($model)) {
  473.             $getParams['m-model'] = $model;
  474.             $model null;
  475.         } else if ($model) {
  476.             $getParams['m-model'] = [$model => true];
  477.             $model null;
  478.         }
  479.         $dynamic = [];
  480.         if (isset($params['dynamic'])) {
  481.             foreach ($params['dynamic'] as $id => $values) {
  482.                 if (array_key_exists('from'$values) || array_key_exists('to'$values)) {
  483.                     $dynamic[$id] = $values;
  484.                 } else {
  485.                     foreach ($values as $url => $v) {
  486.                         if ($v != 'false') {
  487.                             $dynamic[$id][$url] = 1;
  488.                         }
  489.                     }
  490.                 }
  491.             }
  492.         }
  493.         $catalogCharacteristic array_flip($this->modelCatalog->getCatalogCharacteristicsId());
  494.         if (!$brand && !$model && (!count($dynamic) || empty(array_intersect_key($dynamic$catalogCharacteristic)))) {
  495.             $url $this->router
  496.                 ->generate(
  497.                     'portal_filter_catalog',
  498.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic'state' => $state'type' => $type])
  499.                 );
  500.             $apiUrl $this->router
  501.                 ->generate(
  502.                     'portal_filter_catalog_api',
  503.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic'state' => $state'type' => $type])
  504.                 );
  505.             return $this->json(['url' => $url'apiUrl' => $apiUrl]);
  506.         }
  507.         if (!$brand && !$model && count($dynamic)) {
  508.             $dId key($dynamic);
  509.             $value key($dynamic[$dId]);
  510.             if (!count($dynamic[$dId])) {
  511.                 unset($dynamic[$dId]);
  512.             }
  513.             $baseRouteParams['param'] = $dId;
  514.             $baseRouteParams['value'] = $value;
  515.             $url $this->router
  516.                 ->generate(
  517.                     'portal_filter_catalog',
  518.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic'state' => $state'type' => $type])
  519.                 );
  520.             $apiUrl $this->router
  521.                 ->generate(
  522.                     'portal_filter_catalog_api',
  523.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic'state' => $state'type' => $type])
  524.                 );
  525.             return $this->json(['url' => $url'apiUrl' => $apiUrl]);
  526.         }
  527.         if ($model) {
  528.             $baseRouteParams['model'] = $model;
  529.             $baseRouteParams['brand'] = $brand;
  530.             $url $this->router
  531.                 ->generate(
  532.                     'portal_filter_catalog',
  533.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic'state' => $state'type' => $type])
  534.                 );
  535.             $apiUrl $this->router
  536.                 ->generate(
  537.                     'portal_filter_catalog_api',
  538.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic'state' => $state'type' => $type])
  539.                 );
  540.             return $this->json(['url' => $url'apiUrl' => $apiUrl]);
  541.         }
  542.         if ($brand) {
  543.             $baseRouteParams['brand'] = $brand;
  544.             $url $this->router
  545.                 ->generate(
  546.                     'portal_filter_catalog',
  547.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic'state' => $state'type' => $type])
  548.                 );
  549.             $apiUrl $this->router
  550.                 ->generate(
  551.                     'portal_filter_catalog_api',
  552.                     array_merge($baseRouteParams$getParams, ['dynamic' => $dynamic'state' => $state'type' => $type])
  553.                 );
  554.             return $this->json(['url' => $url'apiUrl' => $apiUrl]);
  555.         }
  556.     }
  557.     public function catalogSearch(Request $requestEntityManagerInterface $em)
  558.     {
  559.         $searchParams $request->query->all();
  560.         $routeParams $request->attributes->get('_route_params');
  561.         $cookies $request->cookies->get('compare');
  562.         $findVehicles $this->modelCatalog->findByParams($searchParams$searchParamsself::PRE_PAGES);
  563.         if(!$findVehicles['data']){
  564.             $findVehicles $this->modelCatalog->noFindVehicleByParams($searchParams$searchParamsself::PRE_PAGES);
  565.         }
  566.         $vehicles $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $searchParams$cookies);
  567.         $pagination $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES5);
  568.         $value null;
  569.         $model '';
  570.         $brand '';
  571.         $vehicleTopViews = [];
  572.         $type $request->get('type');
  573.         $state $request->get('state');
  574.         $hasCredit filter_var($request->get('credit') ?? falseFILTER_VALIDATE_BOOLEAN);
  575.         if ($request->get('m-brand')) {
  576.             $brand array_key_first($request->get('m-brand'));
  577.         }
  578.         if ($request->get('m-model')) {
  579.             $model array_key_first($request->get('m-model'));
  580.         }
  581.         if (isset($searchParams['dynamic'])) {
  582.             $param array_key_first($searchParams['dynamic']);
  583.             if (isset($searchParams['dynamic'][$param])) {
  584.                 $value array_key_first($searchParams['dynamic'][$param]);
  585.             }
  586.         }
  587.         if ($brand && $brand === 'all') {
  588.             throw new NotFoundHttpException();
  589.         }
  590.         $findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model');
  591.         $param $request->get('param');
  592.         $valueParam $request->get('value');
  593.         $typeData VehicleType::getTypeDataByUrl($type);
  594.         if (!$typeData) {
  595.             throw new NotFoundHttpException();
  596.         }
  597.         $vehicleTypeId $typeData['id'];
  598.         $service $this->catalogService;
  599.         $filters $service->getFilters($searchParams$request->getLocale(), $state$vehicleTypeId$brand$model$param$valueParam$routeParams);
  600.         $brandEm $em->getRepository(Brand::class)->getBrandByUrl($brand);
  601.         $modelEm $em->getRepository(Model::class)->findOneByUrl($findModelUrl$brandEm);
  602.         $catalogNav $this->modelCatalog->getCatalogNavByGetParams($type$state$hasCredit$brand$searchParams$valueParam);
  603.         if ($brandEm) {
  604.             if (!$modelEm) {
  605.                 $vehicleTopViews $this->modelCatalog->getVehicleTopViews(5$brandEm);
  606.             } else {
  607.                 $vehicleTopViews $this->modelCatalog->getVehicleItemTopViews(5$brandEm$modelEm);
  608.             }
  609.         }
  610.         $dealers $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm);
  611.         if (!$brand && ($searchParams['type'] == 'truck' || $searchParams['type'] == 'bus')) {
  612.             $brandSId = [];
  613.             foreach ($vehicles as $vehicle) {
  614.                 $brandSId[] = $vehicle['dealer'];
  615.             }
  616.             $dealers $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]);
  617.         }
  618.         $dealers array_filter($dealers, fn($dealer) => $dealer->getId() !== 39);
  619.         if ($model && !isset($searchParams['model'])) {
  620.             $searchParams['model'] = $model;
  621.         }
  622.         if ($brand && !isset($searchParams['brand'])) {
  623.             $searchParams['brand'] = $brand;
  624.         }
  625.         $seoLinks $this->seoMetaTag->buildSeoLinks($searchParams$request->getLocale());
  626.         $isUsed $state == 'used';
  627.         $catalogCharacteristic $service->catalogCharacteristic($vehicleTypeId$isUsed);
  628.         $seoLinks $service->seoYearsLinksFilter($searchParams$vehicles$searchParams$seoLinks);
  629.         $OrderCallForm = new Forms();
  630.         $OrderCallForm $this->CoreFormFactory()->orderCallForm($OrderCallForm$brandEm $brandEm->getDealer()[0] : null1)->createView();
  631.         return $this->basePortalRender('@Portal/Car/catalog-search.html.twig', [
  632.             'vehicles' => $vehicles,
  633.             'seoLinks' => [],
  634.             'pagination' => $pagination,
  635.             'filters' => $filters,
  636.             'catalogNav' => $catalogNav,
  637.             'baseParams' => $searchParams,
  638.             'searchParams' => $searchParams,
  639.             'dealers' => $dealers,
  640.             'vehicleTopViews' => $vehicleTopViews,
  641.             'count' => $findVehicles['count'],
  642.             'type' => $searchParams['type'],
  643.             'state' => $searchParams['state'],
  644.             'hasCredit' => $searchParams['hasCredit'] ?? false,
  645.             'brand' => $brand,
  646.             'brandEm' => $brandEm,
  647.             'model' => $model,
  648.             'modelEm' => $modelEm,
  649.             'param' => $param,
  650.             'value' => $request->get('value'),
  651.             'year' => ($param === 1000) ? $param $valueParam,
  652.             'seoMeta' => $this->seoMetaTag->buildSeoMetaGetParams($request$searchParams$searchParams$param$value),
  653.             'valueParam' => $catalogCharacteristic[$param][$valueParam] ?? null,
  654.             'catalogBanner' => $service->getCatalogBanner($request),
  655.             'OrderCallForm' => $OrderCallForm ?? '',
  656.         ]);
  657.     }
  658.     public function catalogSearchApi(Request $requestEntityManagerInterface $em)
  659.     {
  660.         $searchParams $request->query->all();
  661.         $routeParams $request->attributes->get('_route_params');
  662.         $cookies $request->cookies->get('compare');
  663.         $findVehicles $this->modelCatalog->findByParams($searchParams$searchParamsself::PRE_PAGES);
  664.         if(!$findVehicles['data']){
  665.             $findVehicles $this->modelCatalog->noFindVehicleByParams($searchParams$searchParamsself::PRE_PAGES);
  666.         }
  667.         $vehicles $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $searchParams$cookies);
  668.         $pagination $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES5);
  669.         $value null;
  670.         $model '';
  671.         $brand '';
  672.         $vehicleTopViews = [];
  673.         $type $request->get('type');
  674.         $state $request->get('state');
  675.         $hasCredit filter_var($request->get('credit') ?? falseFILTER_VALIDATE_BOOLEAN);
  676.         if ($request->get('m-brand')) {
  677.             $brand array_key_first($request->get('m-brand'));
  678.         }
  679.         if ($request->get('m-model')) {
  680.             $model array_key_first($request->get('m-model'));
  681.         }
  682.         if (isset($searchParams['dynamic'])) {
  683.             $param array_key_first($searchParams['dynamic']);
  684.             if (isset($searchParams['dynamic'][$param])) {
  685.                 $value array_key_first($searchParams['dynamic'][$param]);
  686.             }
  687.         }
  688.         if ($brand && $brand === 'all') {
  689.             throw new NotFoundHttpException();
  690.         }
  691.         $findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model');
  692.         $param $request->get('param');
  693.         $valueParam $request->get('value');
  694.         $typeData VehicleType::getTypeDataByUrl($type);
  695.         if (!$typeData) {
  696.             throw new NotFoundHttpException();
  697.         }
  698.         $vehicleTypeId $typeData['id'];
  699.         $service $this->catalogService;
  700.         $filters $service->getFilters($searchParams$request->getLocale(), $state$vehicleTypeId$brand$model$param$valueParam$routeParams);
  701.         $brandEm $em->getRepository(Brand::class)->getBrandByUrl($brand);
  702.         $modelEm $em->getRepository(Model::class)->findOneByUrl($findModelUrl$brandEm);
  703.         if ($brandEm) {
  704.             if (!$modelEm) {
  705.                 $vehicleTopViews $this->modelCatalog->getVehicleTopViews(5$brandEm);
  706.             } else {
  707.                 $vehicleTopViews $this->modelCatalog->getVehicleItemTopViews(5$brandEm$modelEm);
  708.             }
  709.         }
  710.         $dealers $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm);
  711.         if (!$brand && ($searchParams['type'] == 'truck' || $searchParams['type'] == 'bus')) {
  712.             $brandSId = [];
  713.             foreach ($vehicles as $vehicle) {
  714.                 $brandSId[] = $vehicle['dealer'];
  715.             }
  716.             $dealers $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]);
  717.         }
  718.         if ($model && !isset($searchParams['model'])) {
  719.             $searchParams['model'] = $model;
  720.         }
  721.         if ($brand && !isset($searchParams['brand'])) {
  722.             $searchParams['brand'] = $brand;
  723.         }
  724.         if ($request->isXmlHttpRequest()) {
  725.             return $this->json([
  726.                 'vehicles' => $service->getAjaxResult($vehicles$request->getLocale()),
  727.                 'pagination' => $pagination,
  728.                 'hasCredit' => $searchParams['hasCredit'] ?? false,
  729.                 'count' => $findVehicles['count'],
  730.                 'searchFilters' => $filters,
  731.                 'seoLinks' => []
  732.             ]);
  733.         }
  734.         return false;
  735.     }
  736. }