src/PortalBundle/Controller/ComparisonController.php line 34

Open in your IDE?
  1. <?php
  2. namespace PortalBundle\Controller;
  3. use CoreBundle\Component\CoreFormFactory;
  4. use CoreBundle\Entity\Vehicles\EquipmentOptions;
  5. use CoreBundle\Entity\Vehicles\VariationCharacteristic;
  6. use CoreBundle\Entity\Vehicles\VehicleItem;
  7. use CoreBundle\Model\Vehicles\Repository;
  8. use DcSiteBundle\Services\AccessoryService;
  9. use DcSiteBundle\Twig\TwigDcExtension;
  10. use Exception;
  11. use PortalBundle\Services\ComparisonService;
  12. use PortalBundle\Services\ServiceService;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\RouterInterface;
  18. use Symfony\Contracts\Translation\TranslatorInterface;
  19. class ComparisonController extends BaseController
  20. {
  21.     public function __construct(CoreFormFactory $coreFormFactoryRequestStack $requestStackRouterInterface $router,
  22.                                 Repository $vehicleRepositoryServiceService $serviceService)
  23.     {
  24.         parent::__construct($coreFormFactory$requestStack$router$vehicleRepository$serviceService);
  25.     }
  26.     /**
  27.      * @param Request $request
  28.      * @return Response
  29.      */
  30.     public function index(): Response
  31.     {
  32.         return $this->basePortalRender('@Portal/Comparison/comparison.html.twig');
  33.     }
  34.     public function init(Request $requestComparisonService $comparisonService): JsonResponse
  35.     {
  36.         return new JsonResponse(['success' => true'data' => $comparisonService->initComparison($request)]);
  37.     }
  38.     public function getComparisonByItems(Request $requestComparisonService $comparisonService): JsonResponse
  39.     {
  40.         $data $comparisonService->getComparison($request);
  41.         if ($data['options']){
  42.             foreach($data['options'] as $key => $option){
  43.                 if (isset($option['options']) && is_array($option['options'])) {
  44.                     usort($option['options'], fn($a$b) => $a['sort'] <=> $b['sort']);
  45.                 }
  46.                 $data['options'][$key]['options'] = $option['options'];
  47.             }
  48.         }
  49.         return new JsonResponse(['success' => true'data' => $data]);
  50.     }
  51.     private function buildComparison($vehicleItems$localeTwigDcExtension $twigDcExtensionTranslatorInterface $translator): array
  52.     {
  53.         $result = [
  54.             'cars' => [],
  55.             'tech' => [],
  56.             'options' => [],
  57.         ];
  58.         $result['tech'][0] = [
  59.             'title' => $translator->trans('car_page.compare.year', [], 'dc_base'),
  60.             'vars' => []
  61.         ];
  62.         /** @var VehicleItem $vehicleItem */
  63.         foreach ($vehicleItems as $vehicleItem) {
  64.             $carModel $this->container->get('core.factory.vehicle')->createByVehicleItem($vehicleItem);
  65.             $result['cars'][$vehicleItem->getId()] = [
  66.                 'id' => $vehicleItem->getId(),
  67.                 'title' => $carModel->getFullName(),
  68.                 'price' => $twigDcExtension->priceFilter(ceil($carModel->price())),
  69.                 'image' => $carModel->getPreviewPath('small'),
  70.                 'isUsed' => $carModel->isUsed(),
  71.                 'equipment' => $carModel->isUsed() ? '' $carModel->getEquipmentTitle()
  72.             ];
  73.             $result['tech'][0]['vars'][$vehicleItem->getId()] = $vehicleItem->getYear();
  74.             /** @var VariationCharacteristic $vCharacteristic */
  75.             foreach ($vehicleItem->getVariation()->getCharacteristics() as $vCharacteristic) {
  76.                 $characteristic $vCharacteristic->getCharacteristic();
  77.                 $result['tech'][$characteristic->getId()]['title'] = $characteristic->getTitle($locale);
  78.                 $result['tech'][$characteristic->getId()]['vars'][$vehicleItem->getId()] = $vCharacteristic->getValue($locale);
  79.             }
  80.             $options $vehicleItem->getEquipment()->getOptions();
  81.             /** @var EquipmentOptions $option */
  82.             foreach ($options as $option) {
  83.                 $oneOption $option->getOption();
  84.                 $oType $option->getOption()->getOptionType();
  85.                 if (!isset($result['options'][$oType])) {
  86.                     $result['options'][$oType] = [
  87.                         'id' => $oType,
  88.                         'title' => \CoreBundle\Model\Vehicles\EquipmentOptions::getTypeName($oType$locale),
  89.                         'options' => []
  90.                     ];
  91.                 }
  92.                 if (!isset($result['options'][$oType]['options'][$oneOption->getId()])) {
  93.                     $opTitle $locale == 'ru' $oneOption->getTitleRu() : $oneOption->getTitleUa();
  94.                     $result['options'][$oType]['options'][$oneOption->getId()] = [
  95.                         'id' => $oneOption->getId(),
  96.                         'title' => $opTitle,
  97.                         'values' => []
  98.                     ];
  99.                 }
  100.                 $result['options'][$oType]['options'][$oneOption->getId()]['values'][$vehicleItem->getId()] = [
  101.                     'price' => $option->getPrice(),
  102.                     'value' => $option->getValue($locale),
  103.                 ];
  104.             }
  105.         }
  106.         foreach ($result['tech'] as $charId => $row) {
  107.             $hasValues false;
  108.             foreach ($row['vars'] as $val) {
  109.                 if ($val) {
  110.                     $hasValues true;
  111.                 }
  112.             }
  113.             if (!$hasValues) {
  114.                 unset($result['tech'][$charId]);
  115.             }
  116.         }
  117.         return $result;
  118.     }
  119.     public function featured(AccessoryService $accessoryService)
  120.     {
  121.         try {
  122.             if (empty($this->getUser())) {
  123.                 throw new Exception('Unauthorized'401);
  124.             }
  125.             return $this->basePortalRender('@Portal/Comparison/featured.html.twig', [
  126.                 'result' => $accessoryService->getListFavoritesAccessory($this->getUser())
  127.             ]);
  128.         } catch (Exception $e) {
  129.             if ($e->getCode() === 401) {
  130.                 return $this->redirectToRoute('my_login_page');
  131.             }
  132.             return $this->error($e);
  133.         }
  134.     }
  135. }