src/DcSiteBundle/Controller/NissanArmada/CarController.php line 197

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Controller\NissanArmada;
  3. use CoreBundle\Component\CoreFormFactory;
  4. use CoreBundle\Component\FormManager;
  5. use CoreBundle\Entity\Forms;
  6. use CoreBundle\Entity\Vehicles\Category;
  7. use CoreBundle\Entity\Vehicles\Vehicle;
  8. use CoreBundle\Factory\Vehicle as VehicleFactory;
  9. use CoreBundle\Model\Api\OnlineService\ApiServer1C;
  10. use CoreBundle\Model\Vehicles\AbstractVehicle;
  11. use CoreBundle\Model\Vehicles\Repository;
  12. use CoreBundle\Services\MediaExtensionVidi;
  13. use DateTime;
  14. use DcSiteBundle\Enum\DealerPathEnum;
  15. use DcSiteBundle\Model\CreditModel;
  16. use DcSiteBundle\Services\CarInStockService;
  17. use DcSiteBundle\Services\HistoryManager;
  18. use DcSiteBundle\Services\ModelRange\Pages\PagesService;
  19. use DcSiteBundle\Services\UsedVehicleService;
  20. use DcSiteBundle\Services\VehicleService;
  21. use DcSiteBundle\Services\VehicleViewService;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use InsuranceBundle\Model\Program;
  24. use PortalBundle\Model\SeoMetaTag;
  25. use Symfony\Component\Filesystem\Filesystem;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\RequestStack;
  28. use Symfony\Component\HttpFoundation\Response;
  29. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  30. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  31. use Symfony\Component\Routing\RouterInterface;
  32. use Twig\Environment;
  33. class CarController extends BaseController
  34. {
  35.     private CarInStockService $carInStockService;
  36.     private UsedVehicleService $usedVehicleService;
  37.     public function __construct(CarInStockService $carInStockServiceUsedVehicleService $usedVehicleServiceCoreFormFactory $coreFormFactorySeoMetaTag $seoMetaTagRequestStack $requestStackRouterInterface $routerFormManager $formManagerEntityManagerInterface $emApiServer1C $apiServer1CSessionInterface $sessionFilesystem $filesystemMediaExtensionVidi $mediaExtensionVidiRepository $vehicleRepositoryVehicleFactory $vehicleFactoryEnvironment $twig)
  38.     {
  39.         $this->carInStockService $carInStockService;
  40.         $this->usedVehicleService $usedVehicleService;
  41.         parent::__construct($coreFormFactory$seoMetaTag$requestStack$router$formManager$em$apiServer1C$session$filesystem$mediaExtensionVidi$vehicleRepository$vehicleFactory$twig);
  42.     }
  43.     public function car(Request $requestVehicleService $vehicleServiceHistoryManager $historyManager$category$car): ?Response
  44.     {
  45.         $Dealer $this->getDealer();
  46.         $vehicle $this->vehicleFactory->createByUrl($car$Dealer);
  47.         if (!$vehicle || $vehicle->getCategory()->getUrl() !== $category) {
  48.             throw new NotFoundHttpException();
  49.         }
  50.         $VehicleEm $vehicle->getVehicleEntity();
  51.         $vehicleColor $vehicleService->getVehicleColor($VehicleEm);
  52.         $carInStock $this->carInStockService->getCarInStockByModel($this->getDealer(), $request->getLocale(), $VehicleEm->getModel(), 4);
  53.         $vehicleFaqs $vehicleService->getVehicleFaqs($VehicleEm);
  54.         $historyManager->setUserCarHistory($this->getUser(), $vehicle->getVehicleEntity());
  55.         $TdForm = new Forms();
  56.         $TdForm->setVehicle($vehicle->getVehicleEntity());
  57.         $form $this->CoreFormFactory()
  58.             ->callMeForm(new Forms(), true);
  59.         $form->get('dealer')->setData($this->getDealer());
  60.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/car-card.html.twig', [
  61.             'model' => $vehicle,
  62.             'vehicleColor' => $vehicleColor,
  63.             'carInStock' => $carInStock,
  64.             'faqs' => $vehicleFaqs,
  65.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnullfalsefalse$vehicle->getPrice())->createView(),
  66.             'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm()->createView(),
  67.             'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(),
  68.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(),
  69.             'structuredData' => $this->getCarPageStructuredData($request$vehicle),
  70.             'callMeForm' => $form->createView()
  71.         ]);
  72.     }
  73.     public function carConfiguraion(VehicleService $vehicleService$car): Response
  74.     {
  75.         $Dealer $this->getDealer();
  76.         $Vehicle $this->vehicleFactory->createByUrl($car$Dealer);
  77.         if (!$Vehicle) {
  78.             throw new NotFoundHttpException();
  79.         }
  80.         $VehicleEm $Vehicle->getVehicleEntity();
  81.         $vehiclePrice $vehicleService->getVehiclePrice($VehicleEm);
  82.         $vehicleEquipment $vehicleService->getVehicleEquipment($VehicleEm);
  83.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/configuration.html.twig', [
  84.             'model' => $Vehicle,
  85.             'vehiclePrice' => $vehiclePrice,
  86.             'vehicleEquipment' => $vehicleEquipment,
  87.         ]);
  88.     }
  89.     public function catalog(Request $requestPagesService $pagesService): ?Response
  90.     {
  91.         $vehicles $this->vehicleRepository->getNewByDealer($this->getDealer());
  92.         $result = [];
  93.         /** @var Vehicle $vehicle */
  94.         foreach ($vehicles as $vehicle) {
  95.             $vModel $this->vehicleFactory->createByEntity($vehicle);
  96.             if (!$vModel) {
  97.                 continue;
  98.             }
  99.             $categoryId $vModel->getCategory()->getId();
  100.             if (!isset($result[$categoryId])) {
  101.                 $result[$categoryId] = [
  102.                     'id' => $categoryId,
  103.                     'position' => $vehicle->getCategory()->getPosition(),
  104.                     'title' => $vehicle->getCategory()->getTitle($request->getLocale()),
  105.                     'url' => $vehicle->getCategory()->getUrl(),
  106.                     'cars' => [],
  107.                 ];
  108.             }
  109.             $result[$categoryId]['cars'][] = $vModel;
  110.         }
  111.         uasort($result, fn($a$b) => $a['position'] <=> $b['position']);
  112.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/catalog.html.twig', [
  113.             'data' => $result,
  114.             'catalogModelRangePages' => $pagesService
  115.                 ->setLang($request->getLocale())
  116.                 ->getPages($this->getDealer())
  117.         ]);
  118.     }
  119.     public function catalogPage(Request $requestPagesService $pagesServicestring $url): ?Response
  120.     {
  121.         $page $pagesService
  122.             ->setLang($request->getLocale())
  123.             ->getPage($this->getDealer(), $url);
  124.         if (empty($page)) {
  125.             throw new NotFoundHttpException();
  126.         }
  127.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/catalog-page.html.twig', ['page' => $page]);
  128.     }
  129.     public function category(Request $request): ?Response
  130.     {
  131.         $categoryUrl $request->get('category');
  132.         $Category $this->em->getRepository(Category::class)->findOneBy(['url' => $categoryUrl]);
  133.         if (!$Category) {
  134.             throw new NotFoundHttpException();
  135.         }
  136.         $vehicles $this->vehicleRepository->getByCategory($Category$this->getDealer());
  137.         $result = [];
  138.         foreach ($vehicles as $vehicle) {
  139.             $result[] = $this->vehicleFactory->createByEntity($vehicle);
  140.         }
  141.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/category.html.twig', [
  142.             'category' => $Category,
  143.             'cars' => $result
  144.         ]);
  145.     }
  146.     public function configurator(Request $request): Response
  147.     {
  148.         $url $request->get('url');
  149.         $Car false;
  150.         if ($url != 'start') {
  151.             $Car $this->vehicleFactory->createByUrl($url$this->getDealer());
  152.             if (!$Car) {
  153.                 throw new NotFoundHttpException();
  154.             }
  155.         }
  156.         $hash $request->query->get('hash');
  157.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Configurator/index.html.twig', [
  158.             'carId' => $Car $Car->getVehicleId() : 0,
  159.             'baseType' => Program::BASE_COEFFICIENT_TYPE,
  160.             'listType' => Program::LIST_COEFFICIENT_TYPE,
  161.             'optionType' => Program::OPTION_COEFFICIENT_TYPE,
  162.             'hash' => $hash,
  163.         ]);
  164.     }
  165.     public function testDrive(): ?Response
  166.     {
  167.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/test-drive.html.twig', [
  168.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), null, [
  169.                 'child' => false,
  170.                 'widthTime' => true
  171.             ])->createView(),
  172.         ]);
  173.     }
  174.     public function archive(): ?Response
  175.     {
  176.         $vehicles $this->vehicleRepository->getDisabled($this->getDealer());
  177.         $result = [];
  178.         foreach ($vehicles as $vehicle) {
  179.             $model $this->vehicleFactory->createByEntity($vehicle);
  180.             if (!$model) {
  181.                 continue;
  182.             }
  183.             $result[] = $model;
  184.         }
  185.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/archive.html.twig', ['cars' => $result]);
  186.     }
  187.     public function usedCarCatalog(Request $request): ?Response
  188.     {
  189.         $vehicles $this->usedVehicleService->getUsedVehicles(
  190.             $this->getDealer(),
  191.             DealerPathEnum::NISSAN_ARMADA,
  192.             $request->getLocale()
  193.         );
  194.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/used-car-catalog.html.twig', ['vehicles' => $vehicles]);
  195.     }
  196.     public function secondhandSingle(Request $requestVehicleViewService $vehicleViewServiceCreditModel $creditModel$url): ?Response
  197.     {
  198.         if (!$url) {
  199.             throw new NotFoundHttpException();
  200.         }
  201.         /** @var AbstractVehicle $vehicle */
  202.         $vehicle $this->vehicleFactory->createUsedByUrl($url);
  203.         if (!$vehicle) {
  204.             throw new NotFoundHttpException();
  205.         }
  206.         $vehicleViewService->saveViewVehicle($vehicle$request->getClientIp(), new DateTime());
  207.         $viewedCars = [];
  208.         if (isset($_COOKIE['viewedCars'])) {
  209.             $viewedCars json_decode($_COOKIE['viewedCars']);
  210.             if (!in_array($vehicle->getVehicleId(), $viewedCars)) {
  211.                 $viewedCars[] = $vehicle->getVehicleId();
  212.             }
  213.         } else {
  214.             setcookie('viewedCars'json_encode([$vehicle->getVehicleId()]));
  215.         }
  216.         $viewedCarEntities $this->em->getRepository(Vehicle::class)
  217.             ->findBy(['id' => array_slice(array_reverse(array_diff($viewedCars, [$vehicle->getVehicleId()])), 03)]);
  218.         $viewedCarFactories = [];
  219.         foreach ($viewedCarEntities as $viewedCarEntity) {
  220.             $viewedCarFactory $this->vehicleFactory->createByEntity($viewedCarEntity);
  221.             $galleryItems $viewedCarFactory->getGallery()
  222.                 ? $viewedCarFactory->getGallery()->getGalleryItems()
  223.                 : null;
  224.             $image $galleryItems && $galleryItems->count()
  225.                 ? $galleryItems->first()->getMedia()
  226.                 : $viewedCarFactory->getPreview();
  227.             $viewedCarFactories[] = [
  228.                 'vehicle' => $viewedCarFactory,
  229.                 'image' => $this->mediaExtensionVidi->getPath($image'reference'),
  230.                 'link' => $this->router->generate('nissan_armada_used_car_single', ['url' => $viewedCarFactory->getUrl()]),
  231.             ];
  232.         }
  233.         $galleryItems $vehicle->getGallery()->getGalleryItems();
  234.         $gallery_images = [];
  235.         if ($galleryItems && $galleryItems->count()) {
  236.             foreach ($galleryItems as $galleryItem) {
  237.                 $gallery_images[] = $this->mediaExtensionVidi->getPath($galleryItem->getMedia(), 'reference');
  238.             }
  239.         }
  240.         $similarVehicles = [];
  241.         $similar $this->vehicleRepository->getSimilarVehicles($vehicletruefalsetrue);
  242.         foreach ($similar as $vehicleItem) {
  243.             $VehicleInst $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle());
  244.             if (!$VehicleInst->getGallery()) {
  245.                 continue;
  246.             }
  247.             $vehicleItemGallery $VehicleInst->getGallery()->getGalleryItems();
  248.             $vehicleItemGalleryImages = [];
  249.             if ($vehicleItemGallery && $vehicleItemGallery->count()) {
  250.                 foreach ($vehicleItemGallery as $vehicleItemGallery_item) {
  251.                     $vehicleItemGalleryImages[] = $this->mediaExtensionVidi->getPath($vehicleItemGallery_item->getMedia(), 'reference');
  252.                 }
  253.             }
  254.             $similarVehicles[] = [
  255.                 'vehicle' => $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle()),
  256.                 'creditPayment' => $creditModel->getMinPayment($this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())),
  257.                 'link' => $this->router->generate('nissan_armada_used_car_single', ['url' => $vehicle->getUrl()]),
  258.                 'gallery' => $vehicleItemGalleryImages
  259.             ];
  260.         }
  261.         $options $vehicle->getOptionsArray($request->getLocale());
  262.         return $this->baseNissanArmada('@DcSite/Nissan_Armada/Car/used-car-single.html.twig', [
  263.             'secondhand' => $vehicle,
  264.             'options' => $options,
  265.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnulltruefalse$vehicle->getPrice())->createView(),
  266.             'consultForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity())->createView(),
  267.             'consultationForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity())->createView(),
  268.             'gallary' => $gallery_images,
  269.             'creditPayment' => $creditModel->getMinPayment($vehicle),
  270.             'similarCars' => $similarVehicles,
  271.             'viewedCars' => $viewedCarFactories,
  272.             'structuredCarData' => $this->getCarStructuredDataCarUsed($request$vehicle)
  273.         ]);
  274.     }
  275. }