src/Controller/UsedCarInspectionController.php line 126

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Order;
  4. use App\Repository\OrderRepository;
  5. use App\Repository\VehicleRepository;
  6. use Psr\Log\LoggerInterface;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  13. use Symfony\Component\Form\Extension\Core\Type\FileType;
  14. use Symfony\Component\Form\Extension\Core\Type\TextType;
  15. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  16. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  17. use Symfony\Component\Mailer\MailerInterface;
  18. use Symfony\Component\Mime\Email;
  19. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  20. class UsedCarInspectionController extends AbstractController
  21. {
  22.     private OrderRepository $orderRepository;
  23.     private LoggerInterface $logger;
  24.     public function __construct(OrderRepository $orderRepositoryLoggerInterface $logger)
  25.     {
  26.         $this->orderRepository $orderRepository;
  27.         $this->logger $logger;
  28.     }
  29.     private function createContactForm()
  30.     {
  31.         return $this->createFormBuilder()
  32.             ->add('name'TextType::class, ['label' => 'Jméno a příjmení'])
  33.             ->add('email'EmailType::class, ['label' => 'Váš e-mail'])
  34.             ->add('phone'TextType::class, ['label' => 'Váš telefon'])
  35.             ->add('message'TextareaType::class, ['label' => 'Vaše zpráva'])
  36.             ->getForm();
  37.     }
  38.     private function handleContactForm($contactForm,
  39.                                        Request $request,
  40.                                        MailerInterface $mailer,
  41.                                        string $from 'kontaktního formuláře'): array|bool|JsonResponse
  42.     {
  43.         if ($contactForm->isSubmitted() && $contactForm->isValid()) {
  44.             $data $contactForm->getData();
  45.             $data['fromText'] = $from;
  46.             try {
  47.                 $email = (new Email())
  48.                     ->from($this->getParameter('email_sender'))
  49.                     ->to($this->getParameter('contact_email'))
  50.                     ->subject('Nová zpráva z kontaktního formuláře')
  51.                     ->text($this->renderView('emails/contact.txt.twig'$data))
  52.                     ->html($this->renderView('emails/contact.html.twig'$data));
  53.                 $mailer->send($email);
  54.                 if ($request->isXmlHttpRequest()) {
  55.                     return new JsonResponse([
  56.                         'success' => true,
  57.                         'message' => 'Vaše zpráva byla odeslána. Přejeme pěkný den.'
  58.                     ]);
  59.                 }
  60.                 return true;
  61.             } catch (\Exception $e) {
  62.                 if ($request->isXmlHttpRequest()) {
  63.                     return new JsonResponse([
  64.                         'success' => false,
  65.                         'message' => 'Zprávu se nepodařilo odeslat. Zkuste to prosím později.'
  66.                     ]);
  67.                 }
  68.                 return ['Došlo k chybě při odesílání zprávy. Zkuste to prosím znovu.'];
  69.             }
  70.         }
  71.         if ($request->isXmlHttpRequest()) {
  72.             $errors = [];
  73.             foreach ($contactForm->getErrors(true) as $error) {
  74.                 $errors[] = $error->getMessage();
  75.             }
  76.             return new JsonResponse([
  77.                 'success' => false,
  78.                 'errors' => $errors
  79.             ]);
  80.         }
  81.         $errors = [];
  82.         foreach ($contactForm->getErrors(true) as $error) {
  83.             $errors[] = $error->getMessage();
  84.         }
  85.         return ['success' => false'errors' => $errors];
  86.     }
  87.     // Redirects from old URLs to new URL
  88.     #[Route('/kontrola-auta'name'redirect_kontrola_auta'methods: ['GET'])]
  89.     public function redirectKontrolaAuta(): Response
  90.     {
  91.         return $this->redirectToRoute('page_proverit_auto', [], 301);
  92.     }
  93.     #[Route('/vyhledani-vozidla'name'redirect_vyhledani_vozidla'methods: ['GET'])]
  94.     public function redirectVyhledaniVozidla(): Response
  95.     {
  96.         return $this->redirectToRoute('page_proverit_auto', [], 301);
  97.     }
  98.     #[Route('/proverka-vozidla'name'redirect_proverka_vozidla'methods: ['GET'])]
  99.     public function redirectProverkaVozidla(): Response
  100.     {
  101.         return $this->redirectToRoute('page_proverit_auto', [], 301);
  102.     }
  103.     #[Route('/prohlidka-u-prodejce'name'redirect_prohlidka_u_prodejce'methods: ['GET'])]
  104.     public function redirectProhlidkaUProdejce(): Response
  105.     {
  106.         return $this->redirectToRoute('page_proverit_auto', [], 301);
  107.     }
  108.     #[Route('/proverit-auto'name'page_proverit_auto'methods: ['GET''POST'])]
  109.     public function index(Request $requestVehicleRepository $vehicleRepositoryMailerInterface $mailer): mixed
  110.     {
  111.         $vehicleId $request->query->get('vehicleId');
  112.         $vehicle $vehicleId $vehicleRepository->find($vehicleId) : null;
  113.         $contactErrors = [];
  114.         $contactForm $this->createContactForm();
  115.         if ($request->isMethod('POST')) {
  116.             $contactForm->handleRequest($request);
  117.             $result $this->handleContactForm($contactForm$request$mailer'kontaktního formuláře na Prodejní stránce');
  118.             if ($result instanceof JsonResponse) {
  119.                 return $result;
  120.             }
  121.             if ($result === true) {
  122.                 $this->addFlash('success''Vaše zpráva byla úspěšně odeslána.');
  123.                 return $this->redirectToRoute('vehicle_search_form');
  124.             } else {
  125.                 foreach ($contactForm->getErrors(true) as $error) {
  126.                     $contactErrors[] = $error->getMessage();
  127.                 }
  128.             }
  129.         }
  130.         return $this->render('used_car_inspection/index.html.twig', [
  131.             'vehicle' => $vehicle,
  132.             'contactForm' => $contactForm->createView(),
  133.             'contactErrors' => $contactErrors,
  134.         ]);
  135.     }
  136.     private function createOrderForm($label)
  137.     {
  138.         return $this->createFormBuilder()
  139.             ->add('name'TextType::class)
  140.             ->add('email'EmailType::class)
  141.             ->add('phone'TextType::class)
  142.             ->add('message'TextareaType::class, [
  143.                 'attr' => ['rows' => 5'placeholder' => 'Odkaz na vozidlo / popis vozu']
  144.             ])
  145.             ->add('additionalService'CheckboxType::class, [
  146.                 'label' => $label,
  147.                 'label_html' => true,
  148.                 'required' => false,
  149.             ])
  150.             ->getForm();
  151.     }
  152.     #[Route('/proverka-vozidla'name'vehicle_inspection_form'methods: ['GET''POST'])]
  153.     public function vehicleInspectionForm(Request $requestMailerInterface $mailer): mixed
  154.     {
  155.         $lastSubmittedForm $request->getSession()->get('last_submitted_form');
  156.         $form $this->createOrderForm('Prohlídka vozidla u prodejce <strong>+ 3 499 Kč</strong>');
  157.         if ($lastSubmittedForm) {
  158.             $lastSubmittedForm['additionalService'] = (bool) $lastSubmittedForm['additionalService'];
  159.             $form->setData($lastSubmittedForm);
  160.             $request->getSession()->remove('last_submitted_form');
  161.         }
  162.         $contactForm $this->createContactForm();
  163.         $contactErrors = [];
  164.         if ($request->isMethod('POST')) {
  165.             if ($request->request->get('type') === 'orderForm') {
  166.                 $form->handleRequest($request);
  167.                 if ($form->isSubmitted() && $form->isValid()) {
  168.                     try {
  169.                         return $this->processOrderAndRedirect($request'Prověrka vybraného vozidla''vehicle_inspection_form'$mailer);
  170.                     } catch (\Exception $e) {
  171.                         $this->addFlash('error''Došlo k chybě při zpracování objednávky. Zkuste to prosím znovu.');
  172.                     }
  173.                 } else {
  174.                     foreach ($form->getErrors(true) as $error) {
  175.                         $this->addFlash('error'$error->getMessage());
  176.                     }
  177.                 }
  178.             }
  179.             if ($request->request->get('type') === 'contactForm') {
  180.                 $contactForm->handleRequest($request);
  181.                 $result $this->handleContactForm($contactForm$request$mailer'kontaktního formuláře na Prověření vozidel');
  182.                 if ($result instanceof JsonResponse) {
  183.                     return $result;
  184.                 }
  185.                 if ($result === true) {
  186.                     $this->addFlash('success''Vaše zpráva byla úspěšně odeslána.');
  187.                     return $this->redirectToRoute('vehicle_search_form');
  188.                 } else {
  189.                     foreach ($contactForm->getErrors(true) as $error) {
  190.                         $contactErrors[] = $error->getMessage();
  191.                     }
  192.                 }
  193.             }
  194.         }
  195.         return $this->render('used_car_inspection/vehicle_inspection_form.html.twig', [
  196.             'form' => $form->createView(),
  197.             'contactForm' => $contactForm->createView(),
  198.             'contactErrors' => $contactErrors,
  199.         ]);
  200.     }
  201.     #[Route('/vyhledani-vozidla'name'vehicle_search_form'methods: ['GET''POST'])]
  202.     public function vehicleSearchForm(Request $requestMailerInterface $mailer): mixed
  203.     {
  204.         $lastSubmittedForm $request->getSession()->get('last_submitted_form');
  205.         $form $this->createOrderForm('Prohlídka vozidla u prodejce <strong>+ 3 499 Kč</strong>');
  206.         if ($lastSubmittedForm) {
  207.             $lastSubmittedForm['additionalService'] = (bool) $lastSubmittedForm['additionalService'];
  208.             $form->setData($lastSubmittedForm);
  209.             $request->getSession()->remove('last_submitted_form');
  210.         }
  211.         $contactForm $this->createContactForm();
  212.         $contactErrors = [];
  213.         if ($request->isMethod('POST')) {
  214.             if ($request->request->get('type') === 'orderForm') {
  215.                 $form->handleRequest($request);
  216.                 if ($form->isSubmitted() && $form->isValid()) {
  217.                     try {
  218.                         return $this->processOrderAndRedirect($request'Vyhledání a výběr vozidla''vehicle_search_form'$mailer);
  219.                     } catch (\Exception $e) {
  220.                         $this->addFlash('error''Došlo k chybě při zpracování objednávky. Zkuste to prosím znovu.');
  221.                     }
  222.                 } else {
  223.                     foreach ($form->getErrors(true) as $error) {
  224.                         $this->addFlash('error'$error->getMessage());
  225.                     }
  226.                 }
  227.             }
  228.             if ($request->request->get('type') === 'contactForm') {
  229.                 $contactForm->handleRequest($request);
  230.                 $result $this->handleContactForm($contactForm$request$mailer'kontaktního formuláře na Vyhledání vozidla');
  231.                 if ($result instanceof JsonResponse) {
  232.                     return $result;
  233.                 }
  234.                 if ($result === true) {
  235.                     $this->addFlash('success''Vaše zpráva byla úspěšně odeslána.');
  236.                     return $this->redirectToRoute('vehicle_search_form');
  237.                 } else {
  238.                     foreach ($contactForm->getErrors(true) as $error) {
  239.                         $contactErrors[] = $error->getMessage();
  240.                     }
  241.                 }
  242.             }
  243.         }
  244.         return $this->render('used_car_inspection/vehicle_search_form.html.twig', [
  245.             'form' => $form->createView(),
  246.             'contactForm' => $contactForm->createView(),
  247.             'contactErrors' => $contactErrors,
  248.         ]);
  249.     }
  250.     #[Route('/prohlidka-u-prodejce'name'dealer_inspection_form'methods: ['GET''POST'])]
  251.     public function dealerInspectionForm(Request $requestMailerInterface $mailerVehicleRepository $vehicleRepository): Response
  252.     {
  253.         $vehicleId $request->query->get('vehicleId');
  254.         $vehicle $vehicleId $vehicleRepository->find($vehicleId) : null;
  255.         $vehicleUrl null;
  256.         if ($vehicle) {
  257.             $vehicleUrl $this->generateUrl('page_vehicle_detail', [
  258.                 'urlManufacturer' => $vehicle->getManufacturer()->getUrl(),
  259.                 'urlModel' => $vehicle->getModel()->getUrl(),
  260.                 'id' => $vehicle->getId()
  261.             ], UrlGeneratorInterface::ABSOLUTE_URL);
  262.         }
  263.         $lastSubmittedForm $request->getSession()->get('last_submitted_form');
  264.         $form $this->createOrderForm('Prověření historie vozidla  <strong>+ 399 Kč</strong>');
  265.         if ($lastSubmittedForm) {
  266.             $lastSubmittedForm['additionalService'] = (bool) $lastSubmittedForm['additionalService'];
  267.             $form->setData($lastSubmittedForm);
  268.             $request->getSession()->remove('last_submitted_form');
  269.         }
  270.         $form->get('message')->setData($vehicleUrl);
  271.         $contactForm $this->createContactForm();
  272.         $contactErrors = [];
  273.         if ($request->isMethod('POST')) {
  274.             if ($request->request->get('type') === 'orderForm') {
  275.                 $form->handleRequest($request);
  276.                 if ($form->isSubmitted() && $form->isValid()) {
  277.                     try {
  278.                         return $this->processOrderAndRedirect($request'Prohlídka vozidla u prodejce''dealer_inspection_form'$mailer);
  279.                     } catch (\Exception $e) {
  280.                         $this->addFlash('error''Došlo k chybě při zpracování objednávky. Zkuste to prosím znovu.');
  281.                     }
  282.                 } else {
  283.                     foreach ($form->getErrors(true) as $error) {
  284.                         $this->addFlash('error'$error->getMessage());
  285.                     }
  286.                 }
  287.             }
  288.             if ($request->request->get('type') === 'contactForm') {
  289.                 $contactForm->handleRequest($request);
  290.                 $result $this->handleContactForm($contactForm$request$mailer'kontaktního formuláře na Prohlídce u prodejce');
  291.                 if ($result instanceof JsonResponse) {
  292.                     return $result;
  293.                 }
  294.                 if ($result === true) {
  295.                     $this->addFlash('success''Vaše zpráva byla úspěšně odeslána.');
  296.                     return $this->redirectToRoute('vehicle_search_form');
  297.                 } else {
  298.                     foreach ($contactForm->getErrors(true) as $error) {
  299.                         $contactErrors[] = $error->getMessage();
  300.                     }
  301.                 }
  302.             }
  303.         }
  304.         return $this->render('used_car_inspection/dealer_inspection_form.html.twig', [
  305.             'form' => $form->createView(),
  306.             'contactForm' => $contactForm->createView(),
  307.             'contactErrors' => $contactErrors,
  308.         ]);
  309.     }
  310.     private function processOrderAndRedirect(Request $requeststring $servicestring $redirectRouteMailerInterface $mailer): Response
  311.     {
  312.         $data $request->request->all();
  313.         $this->processOrder($data['form'], $service$mailer);
  314.         $this->addFlash('success'"Vaše žádost o {$service} byla úspěšně odeslána.");
  315.         $request->getSession()->set('last_submitted_form'$data['form']);
  316.         return $this->redirectToRoute($redirectRoute);
  317.     }
  318.     private function processOrder(array $datastring $serviceMailerInterface $mailer): void
  319.     {
  320.         if (!isset($data['additionalService'])) {
  321.             $data['additionalService'] = false;
  322.         }
  323.         $order = new Order();
  324.         $order->setName($data['name']);
  325.         $order->setEmail($data['email']);
  326.         $order->setPhone($data['phone']);
  327.         $order->setMessage($data['message'] ?? '');
  328.         $order->setService($service);
  329.         $order->setAdditionalService($data['additionalService']);
  330.         $this->orderRepository->save($ordertrue);
  331.         try {
  332.             $this->sendEmail($data$service$mailer);
  333.         } catch (\Exception $exception) {
  334.             $this->logger->error($exception->getMessage());
  335.         }
  336.     }
  337.     private function sendEmail(array $datastring $serviceMailerInterface $mailer): void
  338.     {
  339.         $email = (new Email())
  340.             ->from($this->getParameter('email_sender'))
  341.             ->to($this->getParameter('contact_email'))
  342.             ->subject('Nová objednávka: ' $service)
  343.             ->html($this->renderView('emails/order.html.twig'compact('data''service')));
  344.         $mailer->send($email);
  345.     }
  346.     #[Route('/proverit-vin'name'verify_vin'methods: ['POST'])]
  347.     public function verifyVin(Request $request): Response
  348.     {
  349.         $vin $request->request->get('vin');
  350.         if (strlen($vin) !== 17) {
  351.             if ($request->isXmlHttpRequest()) {
  352.                 return new JsonResponse([
  353.                     'success' => false,
  354.                     'error' => 'Neplatný VIN kód. Zadejte prosím přesně 17 znaků.'
  355.                 ]);
  356.             }
  357.             $this->addFlash('error''Neplatný VIN kód. Zadejte prosím přesně 17 znaků.');
  358.             return $this->redirectToRoute('page_prohlidka_ojeteho_auta');
  359.         }
  360.         $url "https://cz.cebia.com/?utm_source=affilbox&utm_medium=affiliate&utm_campaign=Autanet_2013&a_box=j49grgww&vin=" urlencode($vin);
  361.         if ($request->isXmlHttpRequest()) {
  362.             return new JsonResponse([
  363.                 'success' => true,
  364.                 'redirect' => $url
  365.             ]);
  366.         }
  367.         return $this->redirect($url);
  368.     }
  369. }