src/Controller/Shop/ContactController.php line 102

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Sylius package.
  4.  *
  5.  * (c) Paweł Jędrzejewski
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace App\Controller\Shop;
  12. use Sylius\Bundle\CoreBundle\Form\Type\ContactType;
  13. use Sylius\Bundle\ShopBundle\EmailManager\ContactEmailManagerInterface;
  14. use Sylius\Component\Channel\Context\ChannelContextInterface;
  15. use Sylius\Component\Core\Model\ChannelInterface;
  16. use Sylius\Component\Customer\Context\CustomerContextInterface;
  17. use Sylius\Component\Locale\Context\LocaleContextInterface;
  18. use Symfony\Component\Form\FormFactoryInterface;
  19. use Symfony\Component\HttpFoundation\RedirectResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpFoundation\JsonResponse;
  23. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  24. use Symfony\Component\Routing\RouterInterface;
  25. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  26. use BitBag\SyliusCmsPlugin\Repository\PageRepository;
  27. use Symfony\Contracts\Translation\TranslatorInterface;
  28. use Twig\Environment;
  29. use Webmozart\Assert\Assert;
  30. use Psr\Log\LoggerInterface;
  31. use ReCaptcha\ReCaptcha;
  32. use MailchimpMarketing;
  33. final class ContactController
  34. {
  35.     /** @var RouterInterface */
  36.     private $router;
  37.     /** @var FormFactoryInterface */
  38.     private $formFactory;
  39.     /** @var Environment */
  40.     private $templatingEngine;
  41.     /** @var ChannelContextInterface */
  42.     private $channelContext;
  43.     /** @var CustomerContextInterface */
  44.     private $customerContext;
  45.     /** @var LocaleContextInterface */
  46.     private $localeContext;
  47.     /** @var ContactEmailManagerInterface */
  48.     private $contactEmailManager;
  49.     /** @var PageRepository */
  50.     private $pageRepository;
  51.     /** @var ParameterBagInterface */
  52.     private $params;
  53.     /** @var LoggerInterface */
  54.     private $logger;
  55.     /** @var TranslatorInterface */
  56.     private $translator;
  57.     /**
  58.      * @param Environment $templatingEngine
  59.      */
  60.     public function __construct(
  61.         RouterInterface $router,
  62.         FormFactoryInterface $formFactory,
  63.         Environment $templatingEngine,
  64.         ChannelContextInterface $channelContext,
  65.         CustomerContextInterface $customerContext,
  66.         LocaleContextInterface $localeContext,
  67.         ContactEmailManagerInterface $contactEmailManager,
  68.         PageRepository $pageRepository,
  69.         ParameterBagInterface $params,
  70.         LoggerInterface $logger,
  71.         TranslatorInterface $translator
  72.     ) {
  73.         $this->router $router;
  74.         $this->formFactory $formFactory;
  75.         $this->templatingEngine $templatingEngine;
  76.         $this->channelContext $channelContext;
  77.         $this->customerContext $customerContext;
  78.         $this->localeContext $localeContext;
  79.         $this->contactEmailManager $contactEmailManager;
  80.         $this->pageRepository $pageRepository;
  81.         $this->params $params;
  82.         $this->logger $logger;
  83.         $this->translator $translator;
  84.     }
  85.     public function requestAction(Request $request): Response
  86.     {
  87.         $formType $this->getSyliusAttribute($request'form'ContactType::class);
  88.         $form $this->formFactory->create($formTypenull$this->getFormOptions());
  89.         $localeCode $this->localeContext->getLocaleCode();
  90.         if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
  91.             $data $form->getData();
  92.             // Check the captcha token
  93.             $token $request->request->get('recaptcha_token');
  94.             $recaptcha = new ReCaptcha($this->params->get('GOOGLE_RECAPTCHA_SECRET_KEY'));
  95.             $resp $recaptcha->setExpectedHostname($_SERVER['SERVER_NAME'])
  96.                 ->verify($token$_SERVER['REMOTE_ADDR']);
  97.             if (!$resp->isSuccess()) {
  98.                 $errorMessage $this->getSyliusAttribute(
  99.                     $request,
  100.                     'error_flash',
  101.                     $this->translator->trans('sylius.contact.captcha_not_valid')
  102.                 );
  103.                 /** @var FlashBagInterface $flashBag */
  104.                 $flashBag $request->getSession()->getBag('flashes');
  105.                 $flashBag->add('error'$errorMessage);
  106.                 return new RedirectResponse($request->headers->get('referer'));
  107.             }
  108.             $channel $this->channelContext->getChannel();
  109.             /** @var ChannelInterface $channel */
  110.             Assert::isInstanceOf($channelChannelInterface::class);
  111.             // $contactEmail = $channel->getContactEmail();
  112.             // WE SHOULD NOT SEND THE EMAIL CONDITIONALLY.
  113.             // WE SHOULD ALWAYS SEND IT TO THE HEADQUARTERS
  114.             // HENCE, WE'RE USING .ENV PARAM TO SET THIS CONTACT EMAIL
  115.             switch ($data['subject']) {
  116.                 case 'sylius.ui.subjects.product_information_request':
  117.                     $contactEmail $this->params->get('product_information_email');
  118.                     break;
  119.                 case 'sylius.ui.subjects.event_quote_request':
  120.                     $contactEmail $this->params->get('quote_request_email');
  121.                     break;
  122.                 case 'sylius.ui.subjects.training_information_request':
  123.                     $contactEmail $this->params->get('information_request_email');
  124.                     break;
  125.                 case 'sylius.ui.subjects.order_information_request':
  126.                     $contactEmail $this->params->get('order_help_email');
  127.                     break;
  128.                 case 'sylius.ui.subjects.other_subjects':
  129.                     $contactEmail $this->params->get('contact_email');
  130.                     break;
  131.                 default:
  132.                     $contactEmail $this->params->get('contact_email');
  133.                     break;
  134.             }
  135.             $currentUrl $request->request->get('url');
  136.             if (null === $contactEmail) {
  137.                 $errorMessage $this->getSyliusAttribute(
  138.                     $request,
  139.                     'error_flash',
  140.                     $this->translator->trans('sylius.contact.request_error')
  141.                 );
  142.                 /** @var FlashBagInterface $flashBag */
  143.                 $flashBag $request->getSession()->getBag('flashes');
  144.                 $flashBag->add('error'$errorMessage);
  145.                 return new RedirectResponse($request->headers->get('referer'));
  146.             }
  147.             $this->contactEmailManager->sendContactRequest($data, [$contactEmail], $channel$localeCode);
  148.             $mailchimpApiKey $channel->getMailchimpApiKey();
  149.             /* MailChimp ajout a la liste */
  150.             if ($data["subscribedToNewsletter"] && isset($mailchimpApiKey) && !empty($mailchimpApiKey))
  151.             {                
  152.                 //https://mailchimp.com/developer/marketing/api/list-members/
  153.                 try {
  154.                     $mcr true;
  155.                     $mailchimp = new MailchimpMarketing\ApiClient();
  156.                     $mailchimp->setConfig([
  157.                     'apiKey' => $channel->getMailchimpApiKey(),
  158.                     'server' =>  $channel->getMailchimpServer(),
  159.                     ]);
  160.                 }
  161.                 catch (\EXCEPTION $e) {            
  162.                     $mcr false;
  163.                 } 
  164.                 $listId $channel->getMailchimpListId ();
  165.                 
  166.                 if ( $mcr && isset($listId) && !empty($listId) )
  167.                 {
  168.                     try {
  169.                         $response $mailchimp->lists->addListMember($listId, [
  170.                             "email_address" => strtolower($data["email"]),
  171.                             "status" => "subscribed",
  172.                         ]);            
  173.                     }
  174.                     catch (\EXCEPTION $e) {            
  175.                     }
  176.                 } 
  177.             }
  178.             $successMessage $this->getSyliusAttribute(
  179.                 $request,
  180.                 'success_flash',
  181.                 $this->translator->trans('sylius.contact.request_success')
  182.             );
  183.             /** @var FlashBagInterface $flashBag */
  184.             $flashBag $request->getSession()->getBag('flashes');
  185.             $flashBag->add('success'$successMessage);
  186.             // $redirectRoute = $this->getSyliusAttribute($request, 'redirect', 'referer');
  187.             return new RedirectResponse($currentUrl);
  188.         }
  189.         // Identify the page calling this endpoint to define which template to load
  190.         $urlSegments explode("/"$_SERVER['REQUEST_URI']);
  191.         if(isset($urlSegments[2]) && isset($urlSegments[3]) && ($urlSegments[2] === "page")) {
  192.             $channel $this->channelContext->getChannel();
  193.             $page $this->pageRepository->findOneEnabledBySlugAndChannelCode($urlSegments[3], $urlSegments[1], $channel->getCode());
  194.             $pageSlug "/" $localeCode "/page/" $page->getSlug();
  195.             switch ($page->getCode()) {
  196.                 case 'fromagers-evenementiels':
  197.                     $template $this->getSyliusAttribute($request'template''@SyliusShop/Contact/contact-request-service.html.twig');
  198.                     break;
  199.                 case 'centre-international-mons-formation':
  200.                     $template $this->getSyliusAttribute($request'template''@SyliusShop/Contact/contact-request-training.html.twig');
  201.                     break;
  202.                 case 'contact':
  203.                 default:
  204.                     $template $this->getSyliusAttribute($request'template''@SyliusShop/Contact/request.html.twig');
  205.                     break;
  206.             }
  207.         }
  208.         else {
  209.             $template $this->getSyliusAttribute($request'template''@SyliusShop/Contact/request.html.twig');
  210.             $pageSlug "/" $localeCode;
  211.         }
  212.         return new Response($this->templatingEngine->render($template, ['form' => $form->createView(), 'url' => $pageSlug]));
  213.     }
  214.     private function getSyliusAttribute(Request $requeststring $attributeName, ?string $default): ?string
  215.     {
  216.         $attributes $request->attributes->get('_sylius');
  217.         return $attributes[$attributeName] ?? $default;
  218.     }
  219.     private function getFormOptions(): array
  220.     {
  221.         $customer $this->customerContext->getCustomer();
  222.         if (null === $customer) {
  223.             return [];
  224.         }
  225.         return ['email' => $customer->getEmail()];
  226.     }
  227. }