src/Controller/Frontend/IndexController.php line 233

Open in your IDE?
  1. <?php
  2. /**
  3.  * This file is part of Symfony Keen Template Project.
  4.  * (c) 2021 One AM SRL
  5.  */
  6. namespace App\Controller\Frontend;
  7. use App\Entity\Article;
  8. use App\Entity\CallToAction;
  9. use App\Entity\Category;
  10. use App\Entity\Component;
  11. use App\Entity\Contact;
  12. use App\Entity\Legal;
  13. use App\Entity\Page;
  14. use App\Entity\Product;
  15. use App\Entity\Reseller;
  16. use App\Repository\ArticleRepository;
  17. use App\Repository\BrandRepository;
  18. use App\Repository\CompanyRepository;
  19. use App\Repository\ContactRepository;
  20. use App\Repository\ResellerRepository;
  21. use App\Twig\AppExtension;
  22. use App\Twig\LegalExtension;
  23. use App\WhiteRabbit\ApiClient;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use Keen\Attribute\Breadcrumb;
  26. use Keen\Attribute\NavbarTag;
  27. use Keen\Event\Listener\BreadcrumbAnnotationListener;
  28. use Psr\Log\LoggerInterface;
  29. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
  30. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  31. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  32. use Symfony\Component\HttpFoundation\Request;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  35. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  36. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  37. use Symfony\Component\Mailer\MailerInterface;
  38. use Symfony\Component\Mime\Address;
  39. use Symfony\Component\Routing\Annotation\Route;
  40. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  41. use Symfony\Contracts\Translation\TranslatorInterface;
  42. class IndexController extends AbstractController
  43. {
  44.     #[Route(path'/'name'frontend_index'methods: ['GET'])]
  45.     #[Breadcrumb('La piscina a 360°')]
  46.     #[NavbarTag('home')]
  47.     public function index(ArticleRepository $articleRepositoryBrandRepository $brandRepository): Response
  48.     {
  49.         return $this->render('frontend/index.html.twig', [
  50.             'latestArticles' => $articleRepository->findBy(['visible' => true], ['id' => 'DESC'], 3),
  51.             'brands' => $brandRepository->findBy(['visible' => true]),
  52.         ]);
  53.     }
  54.     #[Route(path'/prodotti/{product}/{page}'name'frontend_product_page_index'requirements: ['page' => '.+'], methods: ['GET'])]
  55.     #[Entity('product'expr'repository.findOneBySlug(product)')]
  56.     #[Entity('page'expr'repository.findOneBySlug(page)')]
  57.     public function page(Product $productPage $pageBreadcrumbAnnotationListener $annotationListener): Response
  58.     {
  59.         $annotationListener->addBreadcrumb(new Breadcrumb('Prodotti'));
  60.         $annotationListener->addBreadcrumb(new Breadcrumb($product->getName(), 'frontend_product_index', ['product' => $product->getSlug()]));
  61.         if ($page->getParent()) {
  62.             $annotationListener->addBreadcrumb(new Breadcrumb($page->getParent()->getName(), 'frontend_product_page_index', [
  63.                 'product' => $product->getSlug(),
  64.                 'page' => $page->getParent()->getSlug(),
  65.             ]));
  66.         }
  67.         $annotationListener->addBreadcrumb(new Breadcrumb($page->getName()));
  68.         return $this->render('frontend/product/page/index.html.twig', [
  69.             'product' => $product,
  70.             'page' => $page,
  71.         ]);
  72.     }
  73.     #[Route(path'/prodotti/{product}'name'frontend_product_index'methods: ['GET'])]
  74.     #[Entity('product'expr'repository.findOneBySlug(product)')]
  75.     public function product(Product $productBreadcrumbAnnotationListener $annotationListener): Response
  76.     {
  77.         $annotationListener->addBreadcrumb(new Breadcrumb('Prodotti'));
  78.         $annotationListener->addBreadcrumb(new Breadcrumb($product->getName()));
  79.         return $this->render('frontend/product/index.html.twig', [
  80.             'product' => $product,
  81.         ]);
  82.     }
  83.     #[Route(path'/chi-siamo'name'frontend_about'methods: ['GET'])]
  84.     #[Breadcrumb('Chi siamo')]
  85.     #[NavbarTag('about')]
  86.     public function about(CompanyRepository $companyRepositoryAppExtension $appExtension): Response
  87.     {
  88.         return $this->render('frontend/about.html.twig', [
  89.             'companies' => $companyRepository->findAll(),
  90.             'aboutConfiguration' => $appExtension->aboutConfiguration(),
  91.         ]);
  92.     }
  93.     #[Route(path'/configuratore-piscine'name'frontend_configurator'methods: ['GET'])]
  94.     #[Breadcrumb('Configuratore piscine')]
  95.     #[NavbarTag('configurator')]
  96.     public function configurator(): Response
  97.     {
  98.         return $this->render('frontend/configurator.html.twig');
  99.     }
  100.     #[Route(path'/comparatore-consumo-energetico-pompe'name'frontend_variable_speed_pump_configurator'methods: ['GET'])]
  101.     #[Breadcrumb('Comparatore consumo energetico pompe')]
  102.     #[NavbarTag('configurator')]
  103.     public function variableSpeedPumpConfigurator(): Response
  104.     {
  105.         return $this->render('frontend/variable_speed_pump_configurator.html.twig');
  106.     }
  107.     #[Route(path'/rivenditori'name'frontend_resellers'methods: ['GET'])]
  108.     #[Breadcrumb('Rivenditori')]
  109.     #[NavbarTag('resellers')]
  110.     public function resellers(ResellerRepository $resellerRepository): Response
  111.     {
  112.         $resellers $resellerRepository->createQueryBuilder('reseller')
  113.             ->andWhere('reseller.type = :official OR reseller.type = :ePartner')
  114.             ->setParameter('official'Reseller::TYPE_OFFICIAL_PARTNER)
  115.             ->setParameter('ePartner'Reseller::TYPE_E_PARTNER)
  116.             ->getQuery()->getResult();
  117.         return $this->render('frontend/resellers.html.twig', [
  118.             'resellers' => $resellers,
  119.         ]);
  120.     }
  121.     #[Route(path'/rivenditori-spa-professional'name'frontend_resellers_spa_professional'methods: ['GET'])]
  122.     #[Breadcrumb('Rivenditori SPA Professional')]
  123.     public function resellerSpaProfessional(ResellerRepository $resellerRepository): Response
  124.     {
  125.         $resellers $resellerRepository->createQueryBuilder('reseller')
  126.             ->andWhere('reseller.type = :spaProfessional')
  127.             ->setParameter('spaProfessional'Reseller::SPA_PROFESSIONAL)
  128.             ->getQuery()->getResult();
  129.         return $this->render('frontend/spa-professional.html.twig', [
  130.             'resellers' => $resellers,
  131.         ]);
  132.     }
  133.     #[Route(path'/contatti'name'frontend_contacts'methods: ['GET''POST'])]
  134.     #[Breadcrumb('Contatti')]
  135.     #[NavbarTag('contacts')]
  136.     public function contacts(Request $requestApiClient $apiClientContactRepository $contactRepositoryEntityManagerInterface $entityManagerMailerInterface $mailerLoggerInterface $logger): Response
  137.     {
  138.         if (Request::METHOD_POST === $request->getMethod()) {
  139.             $name $request->request->get('name');
  140.             $surname $request->request->get('surname');
  141.             $email $request->request->get('email');
  142.             $phone $request->request->get('phone');
  143.             $city $request->request->get('city');
  144.             $province $request->request->get('province');
  145.             $hasPool $request->request->get('hasPool');
  146.             $type $request->request->get('type');
  147.             $contactField $request->request->get('contact');
  148.             $message $request->request->get('message');
  149.             $marketingConsent 'on' === $request->request->get('marketingConsent');
  150.             if (!$name || !$surname || !$email || !$phone || !$city || !$province || !$hasPool || !$type || !$contactField) {
  151.                 throw new BadRequestHttpException();
  152.             }
  153.             if (null === $contact $contactRepository->findOneBy(['email' => $email])) {
  154.                 $contact = new Contact();
  155.                 $contact->setEmail($email);
  156.             }
  157.             $poolType = [
  158.                 'Sì, interrata' => 'Newsletter Lead Piscina SI',
  159.                 'Sì, fuori terra' => 'Newsletter Lead LAGHETTO',
  160.                 'No' => 'Newsletter Lead Piscina NO',
  161.             ][$hasPool];
  162.             $contact->setName($name);
  163.             $contact->setSurname($surname);
  164.             $contact->setPhone($phone);
  165.             $contact->setCity($city);
  166.             $contact->setProvince($province);
  167.             $contact->setHasPool($hasPool);
  168.             $contact->setContact($contactField);
  169.             $contact->setType($type);
  170.             $contact->setMessage($message);
  171.             $contact->setTags(array_unique(['Astralpool_form_contatti_ok'$poolType]));
  172.             $contact->setMarketingConsent($marketingConsent);
  173.             $entityManager->persist($contact);
  174.             $entityManager->flush();
  175.             if ($apiClient->createContact($contact)) {
  176.                 $this->addFlash('contactSuccess''Richiesta inviata con successo!');
  177.                 $email = (new TemplatedEmail())
  178.                     ->from(new Address('fluidraexperience@fluidra.it''astralpool.it'))
  179.                     ->to(
  180.                         new Address('fluidraexperience@fluidra.it'),
  181.                         new Address('marketing@fluidra.it'),
  182.                         new Address('ctonghini@fluidra.it')
  183.                     )
  184.                     ->replyTo($contact->getEmail())
  185.                     ->subject('Richiesta form contatti astralpool.it')
  186.                     ->htmlTemplate('emails/contact.html.twig')
  187.                     ->context([
  188.                         'contact' => $contact,
  189.                     ])
  190.                 ;
  191.                 try {
  192.                     $mailer->send($email);
  193.                 } catch (TransportExceptionInterface $e) {
  194.                     $logger->error(sprintf('Unexpected error while sending confirmation token message: %s'$e->getMessage() ?: get_class($e)));
  195.                 }
  196.                 return $this->render('frontend/contacts.html.twig');
  197.             }
  198.             return $this->render('frontend/error.html.twig');
  199.         }
  200.         return $this->render('frontend/contacts.html.twig');
  201.     }
  202.     #[Route(path'/newsletter'name'frontend_newsletter'methods: ['GET''POST'])]
  203.     #[Breadcrumb('Newsletter')]
  204.     #[NavbarTag('newsletter')]
  205.     public function newsletter(Request $requestApiClient $apiClientContactRepository $contactRepositoryEntityManagerInterface $entityManager): Response
  206.     {
  207.         if (Request::METHOD_POST === $request->getMethod()) {
  208.             $name $request->request->get('name');
  209.             $surname $request->request->get('surname');
  210.             $email $request->request->get('email');
  211.             $phone $request->request->get('phone');
  212.             $city $request->request->get('city');
  213.             $province $request->request->get('province');
  214.             $hasPool $request->request->get('hasPool');
  215.             if (!$name || !$surname || !$email || !$phone || !$city || !$province || !$hasPool) {
  216.                 throw new BadRequestHttpException();
  217.             }
  218.             if (null === $contact $contactRepository->findOneBy(['email' => $email])) {
  219.                 $contact = new Contact();
  220.                 $contact->setEmail($email);
  221.             }
  222.             $poolType = [
  223.                 'Sì, interrata' => 'Newsletter Lead Piscina SI',
  224.                 'Sì, fuori terra' => 'Newsletter Lead LAGHETTO',
  225.                 'No' => 'Newsletter Lead Piscina NO',
  226.             ][$hasPool];
  227.             $contact->setName($name);
  228.             $contact->setSurname($surname);
  229.             $contact->setPhone($phone);
  230.             $contact->setCity($city);
  231.             $contact->setProvince($province);
  232.             $contact->setHasPool($hasPool);
  233.             $contact->setContact(null);
  234.             $contact->setType(null);
  235.             $contact->setTags(array_unique(['tag newsletter''Astralpool_form_contatti_ok'$poolType]));
  236.             $contact->setMarketingConsent(true);
  237.             $entityManager->persist($contact);
  238.             $entityManager->flush();
  239.             if ($apiClient->createContact($contact)) {
  240.                 return $this->render('frontend/success.html.twig');
  241.             }
  242.             return $this->render('frontend/error.html.twig');
  243.         }
  244.         // TAG
  245.         return $this->render('frontend/newsletter.html.twig');
  246.     }
  247.     #[Route(path'/sostenibilita'name'frontend_sustainability'methods: ['GET'])]
  248.     #[Breadcrumb('Sostenibilità')]
  249.     #[NavbarTag('sustainability')]
  250.     public function sustainability(): Response
  251.     {
  252.         return $this->render('frontend/sustainability.html.twig');
  253.     }
  254.     #[Route(path'/download/{callToAction}'name'app_download'methods: ['GET''POST'])]
  255.     #[Breadcrumb('Scarica il documento')]
  256.     #[Entity('callToAction'expr'repository.findOneBySlug(callToAction)')]
  257.     public function download(
  258.         CallToAction $callToAction,
  259.         ApiClient $apiClient,
  260.         ContactRepository $contactRepository,
  261.         EntityManagerInterface $entityManager,
  262.         Request $request,
  263.         SessionInterface $session,
  264.         MailerInterface $mailer,
  265.         LoggerInterface $logger
  266.     ): Response {
  267.         if (!$callToAction->isWhiteRabbit()) {
  268.             throw new BadRequestHttpException();
  269.         }
  270.         if (Request::METHOD_POST === $request->getMethod()) {
  271.             $name $request->request->get('name');
  272.             $surname $request->request->get('surname');
  273.             $email $request->request->get('email');
  274.             $phone $request->request->get('phone');
  275.             $city $request->request->get('city');
  276.             $province $request->request->get('province');
  277.             $hasPool $request->request->get('hasPool');
  278.             $contactField $request->request->get('contact');
  279.             $marketingConsent 'on' === $request->request->get('marketingConsent');
  280.             if (!$name || !$surname || !$email || !$phone || !$city || !$province || !$hasPool || !$contactField) {
  281.                 throw new BadRequestHttpException();
  282.             }
  283.             if (null === $contact $contactRepository->findOneBy(['email' => $email])) {
  284.                 $contact = new Contact();
  285.                 $contact->setEmail($email);
  286.             }
  287.             $poolType = [
  288.                 'Sì, interrata' => 'Newsletter Lead Piscina SI',
  289.                 'Sì, fuori terra' => 'Newsletter Lead LAGHETTO',
  290.                 'No' => 'Newsletter Lead Piscina NO',
  291.             ][$hasPool];
  292.             $contact->setName($name);
  293.             $contact->setSurname($surname);
  294.             $contact->setPhone($phone);
  295.             $contact->setCity($city);
  296.             $contact->setProvince($province);
  297.             $contact->setHasPool($hasPool);
  298.             $contact->setContact($contactField);
  299.             $contact->setType(null);
  300.             $contact->setTags(array_unique([$callToAction->getTag(), $poolType]));
  301.             $contact->setMarketingConsent($marketingConsent);
  302.             $entityManager->persist($contact);
  303.             $entityManager->flush();
  304.             if ($apiClient->createContact($contact)) {
  305.                 $session->set($callToAction->getTitle(), true);
  306.                 $email = (new TemplatedEmail())
  307.                     ->from(new Address('fluidraexperience@fluidra.it''astralpool.it'))
  308.                     ->to(
  309.                         new Address('fluidraexperience@fluidra.it'),
  310.                         new Address('marketing@fluidra.it'),
  311.                     )
  312.                     ->replyTo($contact->getEmail())
  313.                     ->subject('Richiesta form download astralpool.it')
  314.                     ->htmlTemplate('emails/contact.html.twig')
  315.                     ->context([
  316.                         'contact' => $contact,
  317.                         'callToAction' => $callToAction->getTitle(),
  318.                     ])
  319.                 ;
  320.                 try {
  321.                     $mailer->send($email);
  322.                 } catch (TransportExceptionInterface $e) {
  323.                     $logger->error(sprintf('Unexpected error while sending confirmation token message: %s'$e->getMessage() ?: get_class($e)));
  324.                 }
  325.                 return $this->redirectToRoute('app_download_success', ['callToAction' => $callToAction->getSlug()]);
  326.             }
  327.             return $this->render('frontend/error.html.twig');
  328.         }
  329.         return $this->render('frontend/download.html.twig', [
  330.             'callToAction' => $callToAction,
  331.         ]);
  332.     }
  333.     #[Route(path'/download/{callToAction}}/success'name'app_download_success'methods: ['GET''POST'])]
  334.     #[Breadcrumb('Scarica il documento')]
  335.     #[Entity('callToAction'expr'repository.findOneBySlug(callToAction)')]
  336.     public function downloadSuccess(CallToAction $callToActionSessionInterface $session): Response
  337.     {
  338.         $session->remove($callToAction->getTitle());
  339.         return $this->render('frontend/download_success.html.twig', [
  340.             'callToAction' => $callToAction,
  341.         ]);
  342.     }
  343.     #[Route(path'/{type}'name'app_legal'requirements: ['type' => 'cookie-policy|legal-notice|privacy-newsletter|privacy-policy'], methods: ['GET'])]
  344.     public function legal(string $typeLegalExtension $legalExtensionBreadcrumbAnnotationListener $breadcrumbAnnotationListenerTranslatorInterface $translator): Response
  345.     {
  346.         $legal = [
  347.             Legal::PRIVACY_POLICY => $legalExtension->privacyPolicy(),
  348.             Legal::PRIVACY_NEWSLETTER => $legalExtension->privacyNewsletter(),
  349.             Legal::LEGAL_NOTICE => $legalExtension->legalNotice(),
  350.             Legal::COOKIE_POLICY => $legalExtension->cookiePolicy(),
  351.         ][$type];
  352.         $breadcrumbAnnotationListener->addBreadcrumb(new Breadcrumb($translator->trans($type)));
  353.         return $this->render('frontend/legal.html.twig', [
  354.             'legal' => $legal,
  355.         ]);
  356.     }
  357.     #[Route(path'/sitemap.xml'name'app_sitemap'methods: ['GET'])]
  358.     public function sitemap(Request $requestUrlGeneratorInterface $urlGeneratorEntityManagerInterface $entityManager): Response
  359.     {
  360.         $urls = [];
  361.         $hostname $request->getHost();
  362.         $urls[] = ['loc' => $urlGenerator->generate('frontend_index'), 'changefreq' => 'monthly''priority' => '1.0'];
  363.         $urls[] = ['loc' => $urlGenerator->generate('frontend_about'), 'changefreq' => 'monthly''priority' => '1.0'];
  364.         $urls[] = ['loc' => $urlGenerator->generate('frontend_sustainability'), 'changefreq' => 'monthly''priority' => '1.0'];
  365.         $urls[] = ['loc' => $urlGenerator->generate('frontend_talk_about_us_list'), 'changefreq' => 'monthly''priority' => '1.0'];
  366.         $urls[] = ['loc' => $urlGenerator->generate('frontend_blog'), 'changefreq' => 'monthly''priority' => '1.0'];
  367.         $urls[] = ['loc' => $urlGenerator->generate('frontend_resellers'), 'changefreq' => 'monthly''priority' => '1.0'];
  368.         $urls[] = ['loc' => $urlGenerator->generate('frontend_resellers_spa_professional'), 'changefreq' => 'monthly''priority' => '1.0'];
  369.         $urls[] = ['loc' => $urlGenerator->generate('frontend_configurator'), 'changefreq' => 'monthly''priority' => '1.0'];
  370.         $urls[] = ['loc' => $urlGenerator->generate('frontend_contacts'), 'changefreq' => 'monthly''priority' => '1.0'];
  371.         $urls[] = ['loc' => $urlGenerator->generate('frontend_newsletter'), 'changefreq' => 'monthly''priority' => '1.0'];
  372.         $urls[] = ['loc' => $urlGenerator->generate('frontend_component_list'), 'changefreq' => 'monthly''priority' => '1.0'];
  373.         foreach ($entityManager->getRepository(Component::class)->findBy(['visible' => true]) as $component) {
  374.             $urls[] = ['loc' => $urlGenerator->generate('frontend_component_index', ['component' => $component->getSlug()]), 'changefreq' => 'monthly''priority' => '1.0'];
  375.         }
  376.         foreach ($entityManager->getRepository(Page::class)->findBy(['visible' => true]) as $page) {
  377.             $urls[] = ['loc' => $urlGenerator->generate('frontend_product_page_index', ['product' => $page->getProduct()->getSlug(), 'page' => $page->getSlug()]), 'changefreq' => 'monthly''priority' => '1.0'];
  378.         }
  379.         foreach ($entityManager->getRepository(Product::class)->findBy(['visible' => true]) as $product) {
  380.             $urls[] = ['loc' => $urlGenerator->generate('frontend_product_index', ['product' => $product->getSlug()]), 'changefreq' => 'monthly''priority' => '1.0'];
  381.         }
  382.         foreach ($entityManager->getRepository(Category::class)->findAll() as $category) {
  383.             $urls[] = ['loc' => $urlGenerator->generate('frontend_blog', ['slug' => $category->getSlug()]), 'changefreq' => 'monthly''priority' => '1.0'];
  384.         }
  385.         foreach ($entityManager->getRepository(Article::class)->findAll() as $article) {
  386.             $urls[] = ['loc' => $urlGenerator->generate('frontend_blog_article_read', ['slug' => $article->getSlug()]), 'changefreq' => 'monthly''priority' => '1.0'];
  387.         }
  388.         $response = new Response();
  389.         $response->headers->set('Content-Type''text/xml');
  390.         return $this->render('frontend/sitemap.xml.twig', [
  391.             'urls' => $urls,
  392.             'hostname' => $hostname,
  393.         ], $response);
  394.     }
  395. }