custom/static-plugins/SamsonCustomer/src/Controller/NewsletterController.php line 135

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Samson\Controller;
  3. /***
  4.  *
  5.  * This file is part of the "SAMSON Shop" project.
  6.  *
  7.  * For the full copyright and license information, please read the
  8.  * LICENSE.txt file that was distributed with this source code.
  9.  *
  10.  *  (c) 2021
  11.  *
  12.  ***/
  13. use Exception;
  14. use Samson\Exception\CustomerNeedsPasswordChangeException;
  15. use Samson\Pages\NE53Newsletter\NE53NewsletterPage;
  16. use Samson\Pages\NE53Newsletter\NE53NewsletterPageLoader;
  17. use Samson\Route\NE53Newsletter\AbstractNE53NewsletterChangeRoute;
  18. use Samson\Route\NE53Newsletter\AbstractNE53NewsletterConfirmRoute;
  19. use Samson\Route\NE53Newsletter\AbstractNE53NewsletterSubscribeRoute;
  20. use Samson\Route\NE53Newsletter\AbstractNE53NewsletterUnsubscribeRoute;
  21. use Shopware\Core\Checkout\Customer\CustomerEntity;
  22. use Shopware\Core\Content\Newsletter\Exception\NewsletterRecipientNotFoundException;
  23. use Shopware\Core\Content\Newsletter\SalesChannel\AbstractNewsletterConfirmRoute;
  24. use Shopware\Core\Content\Newsletter\SalesChannel\AbstractNewsletterSubscribeRoute;
  25. use Shopware\Core\Content\Newsletter\SalesChannel\AbstractNewsletterUnsubscribeRoute;
  26. use Shopware\Core\Content\Newsletter\SalesChannel\NewsletterSubscribeRoute;
  27. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  28. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  29. use Shopware\Core\Framework\Validation\DataBag\QueryDataBag;
  30. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  31. use Shopware\Core\Framework\Validation\Exception\ConstraintViolationException;
  32. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  33. use Shopware\Storefront\Framework\Routing\RequestTransformer;
  34. use Shopware\Storefront\Page\Newsletter\Subscribe\NewsletterSubscribePageLoader;
  35. use Shopware\Storefront\Pagelet\Newsletter\Account\NewsletterAccountPageletLoader;
  36. use Symfony\Component\HttpFoundation\JsonResponse;
  37. use Symfony\Component\HttpFoundation\Request;
  38. use Symfony\Component\HttpFoundation\Response;
  39. use Symfony\Component\Routing\Annotation\Route;
  40. use Samson\Annotation\CustomerNeedsPasswordChange;
  41. use Shopware\Core\Framework\Routing\Annotation\Since;
  42. use Shopware\Core\Framework\Routing\Annotation\LoginRequired;
  43. use Shopware\Storefront\Controller\NewsletterController as ShopwareNewsletterController;
  44. use Throwable;
  45. use function Sentry\captureException;
  46. /**
  47.  * @RouteScope(scopes={"storefront"})
  48.  */
  49. class NewsletterController extends ShopwareNewsletterController
  50. {
  51.     private AbstractNE53NewsletterConfirmRoute $NE53NewsletterConfirmRoute;
  52.     private NewsletterSubscribePageLoader $newsletterConfirmRegisterPageLoader;
  53.     private AbstractNE53NewsletterSubscribeRoute $NE53NewsletterSubscribeRoute;
  54.     private AbstractNE53NewsletterUnsubscribeRoute $NE53NewsletterUnsubscribeRoute;
  55.     private NE53NewsletterPageLoader $NE53NewsletterPageLoader;
  56.     private AbstractNE53NewsletterChangeRoute $NE53NewsletterChangeRoute;
  57.     public function __construct(NewsletterSubscribePageLoader          $newsletterConfirmRegisterPageLoader,
  58.                                 EntityRepositoryInterface              $customerRepository,
  59.                                 AbstractNewsletterSubscribeRoute       $newsletterSubscribeRoute,
  60.                                 AbstractNewsletterConfirmRoute         $newsletterConfirmRoute,
  61.                                 AbstractNewsletterUnsubscribeRoute     $newsletterUnsubscribeRoute,
  62.                                 NewsletterAccountPageletLoader         $newsletterAccountPageletLoader,
  63.                                 AbstractNE53NewsletterConfirmRoute     $NE53NewsletterConfirmRoute,
  64.                                 AbstractNE53NewsletterSubscribeRoute   $NE53NewsletterSubscribeRoute,
  65.                                 AbstractNE53NewsletterUnsubscribeRoute $NE53NewsletterUnsubscribeRoute,
  66.                                 NE53NewsletterPageLoader               $NE53NewsletterPageLoader,
  67.                                 AbstractNE53NewsletterChangeRoute      $NE53NewsletterChangeRoute)
  68.     {
  69.         parent::__construct($newsletterConfirmRegisterPageLoader,
  70.             $customerRepository,
  71.             $newsletterSubscribeRoute,
  72.             $newsletterConfirmRoute,
  73.             $newsletterUnsubscribeRoute,
  74.             $newsletterAccountPageletLoader);
  75.         $this->NE53NewsletterConfirmRoute $NE53NewsletterConfirmRoute;
  76.         $this->newsletterConfirmRegisterPageLoader $newsletterConfirmRegisterPageLoader;
  77.         $this->NE53NewsletterSubscribeRoute $NE53NewsletterSubscribeRoute;
  78.         $this->NE53NewsletterUnsubscribeRoute $NE53NewsletterUnsubscribeRoute;
  79.         $this->NE53NewsletterPageLoader $NE53NewsletterPageLoader;
  80.         $this->NE53NewsletterChangeRoute $NE53NewsletterChangeRoute;
  81.     }
  82.     /**
  83.      * @Since("6.0.0.0")
  84.      * @CustomerNeedsPasswordChange()
  85.      * @Route("/newsletter-subscribe", name="frontend.newsletter.subscribe", methods={"GET"})
  86.      * @throws Exception
  87.      * @throws CustomerNeedsPasswordChangeException
  88.      */
  89.     public function subscribeMail(SalesChannelContext $contextRequest $requestQueryDataBag $queryDataBag): Response
  90.     {
  91.         return parent::subscribeMail($context$request$queryDataBag);
  92.     }
  93.     /**
  94.      * @Since("6.0.0.0")
  95.      * @LoginRequired()
  96.      * @CustomerNeedsPasswordChange()
  97.      * @Route("/widgets/account/newsletter", name="frontend.account.newsletter", methods={"POST"}, defaults={"XmlHttpRequest"=true})
  98.      *
  99.      * @throws CustomerNeedsPasswordChangeException
  100.      */
  101.     public function subscribeCustomer(Request $requestRequestDataBag $dataBagSalesChannelContext $contextCustomerEntity $customer): Response
  102.     {
  103.         return parent::subscribeCustomer($request$dataBag$context$customer);
  104.     }
  105.     /**
  106.      * @Route("/newsletter/ne53/register", name="frontend.newsletter.ne53.register.handle", options={"seo"="false"}, methods={"POST"}, defaults={"XmlHttpRequest"=true})
  107.      */
  108.     public function handleNE53Newsletter(RequestDataBag $dataRequest $requestSalesChannelContext $salesChannelContext): Response
  109.     {
  110.         $subscribe $data->get('option') === NewsletterSubscribeRoute::OPTION_SUBSCRIBE;
  111.         if ($subscribe) {
  112.             $response $this->handleNE53Subscribe($request$data$salesChannelContext);
  113.         } else {
  114.             $response $this->handleNE53Unsubscribe($data$salesChannelContext);
  115.         }
  116.         return new JsonResponse($response);
  117.     }
  118.     /**
  119.      * @Route("/newsletter/ne53/form/unsubscribe", name="frontend.newsletter.ne53.form.unsubscribe", options={"seo"="false"}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
  120.      * @Route("/newsletter/ne53/form/change", name="frontend.newsletter.ne53.form.change", options={"seo"="false"}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
  121.      */
  122.     public function showNE53NewsletterFormType(Request $requestSalesChannelContext $salesChannelContext): Response
  123.     {
  124.         $unsubscribe $request->get('unsubscribe');
  125.         $changeForm $request->get('changeForm');
  126.         /** @var NE53NewsletterPage $page */
  127.         try {
  128.             $page $this->NE53NewsletterPageLoader->load($request$salesChannelContext);
  129.         } catch (Exception $exception) {
  130.             captureException($exception);
  131.             $this->addFlash(self::DANGER$this->trans('samson.ne53-newsletter.error.an-error-occurred'));
  132.             return $this->forwardToRoute('frontend.home.page');
  133.         }
  134.         return $this->renderStorefront('@Storefront/storefront/page/ne53-newsletter/index.html.twig',
  135.             [
  136.                 'page' => $page,
  137.                 'unsubscribe' => $unsubscribe,
  138.                 'changeForm' => $changeForm
  139.             ]);
  140.     }
  141.     /**
  142.      * @Route("/newsletter/ne53/form/change", name="frontend.newsletter.ne53.change.handle", options={"seo"="false"}, methods={"POST"}, defaults={"XmlHttpRequest"=true})
  143.      */
  144.     public function handleNE53NewsletterChangeForm(Request $requestSalesChannelContext $salesChannelContext): Response
  145.     {
  146.         $page $this->NE53NewsletterPageLoader->load($request$salesChannelContext);
  147.         /** @var NE53NewsletterPage $page */
  148.         try {
  149.             $page $this->NE53NewsletterPageLoader->loadNewsletterData($request$salesChannelContext);
  150.         } catch (NewsletterRecipientNotFoundException $exception) {
  151.             captureException($exception);
  152.             $this->addFlash(self::DANGER$this->trans('samson.ne53-newsletter.error.email-address-not-found'));
  153.             return $this->renderStorefront('@Storefront/storefront/page/ne53-newsletter/index.html.twig',
  154.                 [
  155.                     'page' => $page,
  156.                     'unsubscribe' => false,
  157.                     'changeForm' => true
  158.                 ]);
  159.         } catch (Exception $exception) {
  160.             captureException($exception);
  161.             $this->addFlash(self::DANGER$this->trans('samson.ne53-newsletter.error.an-error-occurred'));
  162.             return $this->renderStorefront('@Storefront/storefront/page/ne53-newsletter/index.html.twig',
  163.                 [
  164.                     'page' => $page,
  165.                     'unsubscribe' => false,
  166.                     'changeForm' => true
  167.                 ]);
  168.         }
  169.         return $this->renderStorefront('@Storefront/storefront/page/ne53-newsletter/index.html.twig',
  170.             [
  171.                 'page' => $page,
  172.                 'change' => true
  173.             ]);
  174.     }
  175.     /**
  176.      * @Route("/newsletter/ne53/change", name="frontend.newsletter.ne53.change", options={"seo"="false"}, methods={"POST"}, defaults={"XmlHttpRequest"=true})
  177.      */
  178.     public function changeNE53Newsletter(Request $requestSalesChannelContext $salesChannelContext): Response
  179.     {
  180.         try {
  181.             $this->NE53NewsletterChangeRoute->change($request$salesChannelContext);
  182.             $response[] = [
  183.                 'type' => 'info',
  184.                 'alert' => $this->renderView('@Storefront/storefront/utilities/alert.html.twig', [
  185.                     'type' => 'info',
  186.                     'list' => [$this->trans('samson.ne53-newsletter.change.information')],
  187.                 ])];
  188.         } catch (Exception $e) {
  189.             captureException($e);
  190.             $response[] = [
  191.                 'type' => 'danger',
  192.                 'alert' => $this->renderView('@Storefront/storefront/utilities/alert.html.twig', [
  193.                     'type' => 'danger',
  194.                     'list' => [$this->trans('error.message-default')],
  195.                 ]),
  196.             ];
  197.         }
  198.         return new JsonResponse($response);
  199.     }
  200.     /**
  201.      * @Route("/newsletter-ne53-subscribe", name="frontend.newsletter.ne53.subscribe", methods={"GET"})
  202.      * @throws Exception
  203.      */
  204.     public function subscribeNE53Mail(SalesChannelContext $contextRequest $requestQueryDataBag $queryDataBag): Response
  205.     {
  206.         try {
  207.             $this->NE53NewsletterConfirmRoute->confirm($queryDataBag->toRequestDataBag(), $context);
  208.         } catch (Throwable $throwable) {
  209.             $this->addFlash(self::DANGER$this->trans('newsletter.subscriptionConfirmationFailed'));
  210.             throw new Exception($throwable->getMessage(), $throwable->getCode(), $throwable);
  211.         }
  212.         $page $this->newsletterConfirmRegisterPageLoader->load($request$context);
  213.         return $this->renderStorefront('@Storefront/storefront/page/newsletter/confirm-subscribe.html.twig', ['page' => $page]);
  214.     }
  215.     /**
  216.      * @Route("/newsletter/off-canvas/subscription", name="frontend.newsletter.off-canvas.subscription", options={"seo"="false"}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
  217.      * @param SalesChannelContext $context
  218.      * @return Response
  219.      */
  220.     public function subscription(SalesChannelContext $context): Response
  221.     {
  222.         $customer $context->getCustomer();
  223.         $newsletter false;
  224.         return $this->renderStorefront(
  225.             '@SamsonCustomer/storefront/module/newsletter/subscription.html.twig',
  226.             [
  227.                 'customer' => $customer,
  228.                 'newsletter' => $newsletter
  229.             ]
  230.         );
  231.     }
  232.     private function handleNE53Subscribe(Request $requestRequestDataBag $dataSalesChannelContext $context): array
  233.     {
  234.         try {
  235.             $data->set('storefrontUrl'$request->attributes->get(RequestTransformer::STOREFRONT_URL));
  236.             $this->NE53NewsletterSubscribeRoute->subscribe($data$contextfalse);
  237.             $response[] = [
  238.                 'type' => 'info',
  239.                 'alert' => $this->renderView('@Storefront/storefront/utilities/alert.html.twig', [
  240.                     'type' => 'info',
  241.                     'list' => [$this->trans('samson.newsletter.subscriptionPersistedInfo')],
  242.                 ]),
  243.             ];
  244.         } catch (ConstraintViolationException $exception) {
  245.             $errors = [];
  246.             foreach ($exception->getViolations() as $error) {
  247.                 $errors[] = $error->getMessage();
  248.             }
  249.             $response[] = [
  250.                 'type' => 'danger',
  251.                 'alert' => $this->renderView('@Storefront/storefront/utilities/alert.html.twig', [
  252.                     'type' => 'danger',
  253.                     'list' => $errors,
  254.                 ]),
  255.             ];
  256.         } catch (Exception $exception) {
  257.             captureException($exception);
  258.             $response[] = [
  259.                 'type' => 'danger',
  260.                 'alert' => $this->renderView('@Storefront/storefront/utilities/alert.html.twig', [
  261.                     'type' => 'danger',
  262.                     'list' => [$this->trans('error.message-default')],
  263.                 ]),
  264.             ];
  265.         }
  266.         return $response;
  267.     }
  268.     private function handleNE53Unsubscribe(RequestDataBag $dataSalesChannelContext $context): array
  269.     {
  270.         try {
  271.             $this->NE53NewsletterUnsubscribeRoute->unsubscribe($data$context);
  272.             $response[] = [
  273.                 'type' => 'success',
  274.                 'alert' => $this->trans('newsletter.subscriptionRevokeSuccess'),
  275.             ];
  276.         } catch (ConstraintViolationException $exception) {
  277.             $errors = [];
  278.             foreach ($exception->getViolations() as $error) {
  279.                 $errors[] = $error->getMessage();
  280.             }
  281.             $response[] = [
  282.                 'type' => 'danger',
  283.                 'alert' => $this->renderView('@Storefront/storefront/utilities/alert.html.twig', [
  284.                     'type' => 'danger',
  285.                     'list' => $errors,
  286.                 ]),
  287.             ];
  288.         } catch (Exception $exception) {
  289.             captureException($exception);
  290.             $response = [];
  291.         }
  292.         return $response;
  293.     }
  294. }