vendor/dvdw/platform-choice/src/Storefront/Controller/PlatformChoiceController.php line 59

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Dvdw\PlatformChoice\Storefront\Controller;
  3. use Dvdw\PlatformChoice\Checkout\Customer\SalesChannel\AbstractCustomerGroupRoute;
  4. use Dvdw\PlatformChoice\Framework\Routing\RouterHelper;
  5. use Dvdw\PlatformChoice\System\SalesChannel\Struct\PlatformChoiceExtension;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Exception\EntityNotFoundException;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  10. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextPersister;
  11. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  12. use Shopware\Storefront\Controller\StorefrontController;
  13. use Shopware\Storefront\Framework\Cache\Annotation\HttpCache;
  14. use Shopware\Storefront\Framework\Routing\Annotation\NoStore;
  15. use Shopware\Storefront\Page\GenericPageLoader;
  16. use Shopware\Storefront\Page\Page;
  17. use Symfony\Component\HttpFoundation\Cookie;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. /**
  23.  * @Route(defaults={"_routeScope"={"storefront"}})
  24.  */
  25. class PlatformChoiceController extends StorefrontController
  26. {
  27.     private SalesChannelContextPersister $contextPersister;
  28.     private RouterHelper $router;
  29.     private GenericPageLoader $pageLoader;
  30.     private AbstractCustomerGroupRoute $groupRoute;
  31.     private EntityRepository $customerRepo;
  32.     public function __construct(
  33.         SalesChannelContextPersister $contextPersister,
  34.         RouterHelper $router,
  35.         GenericPageLoader $pageLoader,
  36.         AbstractCustomerGroupRoute $groupRoute,
  37.         EntityRepository $customerRepo
  38.     )
  39.     {
  40.         $this->contextPersister $contextPersister;
  41.         $this->router $router;
  42.         $this->pageLoader $pageLoader;
  43.         $this->groupRoute $groupRoute;
  44.         $this->customerRepo $customerRepo;
  45.     }
  46.     /**
  47.      * @Route("/platform-choice", name="frontend.platform-choice.index", methods={"GET"})
  48.      * @HttpCache()
  49.      */
  50.     public function platformChoice(Request $requestSalesChannelContext $context): Response
  51.     {
  52.         $page $this->pageLoader->load($request$context);
  53.         $this->resetCustomFields($page);
  54.         return $this->renderStorefront(
  55.             '@DvdwPlatformChoice/storefront/page/platform-choice/platform-choice.html.twig',
  56.             [
  57.                 'page' => $page,
  58.                 'route' => $request->query->get('redirectTo''frontend.home.page'),
  59.                 'routeParams' => json_decode((string) $request->query->get('redirectParams'), true)
  60.             ]
  61.         );
  62.     }
  63.     /**
  64.      * @Route("/platform-choice/persist", name="frontend.platform-choice.persist", options={"seo"="false"}, methods={"POST"})
  65.      * @NoStore
  66.      */
  67.     public function persistPlatformChoice(Request $requestSalesChannelContext $context): Response
  68.     {
  69.         $platformChoice $request->request->get(PlatformChoiceExtension::KEY);
  70.         if ($platformChoice !== PlatformChoiceExtension::B2B && $platformChoice !== PlatformChoiceExtension::B2C) {
  71.             $platformChoice PlatformChoiceExtension::B2C;
  72.         }
  73.         $this->contextPersister->save(
  74.             $context->getToken(),
  75.             [PlatformChoiceExtension::KEY => $platformChoice],
  76.             $context->getSalesChannelId(),
  77.             $context->getCustomerId()
  78.         );
  79.         if (($customer $context->getCustomer()) !== null) {
  80.             $this->customerRepo->update([[
  81.                 'id' => $customer->getId(),
  82.                 'groupId' => $this->getGroupId($request$context$platformChoice)
  83.             ]], $context->getContext());
  84.         }
  85.         $redirectTo $request->request->get('redirectTo''frontend.home.page');
  86.         $redirectParams $request->request->get('redirectParameters', []);
  87.         if (is_string($redirectParams)) {
  88.             $redirectParams json_decode($redirectParamstrue);
  89.         }
  90.         $url $this->router->generate($request$redirectTo$redirectParams);
  91.         $response = new RedirectResponse($url);
  92.         $response->headers->setCookie(new Cookie(
  93.             PlatformChoiceExtension::KEY,
  94.             $platformChoice,
  95.             (new \DateTime())->modify('+1 year')
  96.         ));
  97.         return $response;
  98.     }
  99.     private function getGroupId(Request $requestSalesChannelContext $contextstring $platformChoice): string
  100.     {
  101.         $displayGross $platformChoice === PlatformChoiceExtension::B2C;
  102.         $criteria = (new Criteria())
  103.             ->addFilter(new EqualsFilter('displayGross'$displayGross));
  104.         $group $this->groupRoute->load($request$criteria$context)->getGroups()->first();
  105.         if ($group === null) {
  106.             throw new EntityNotFoundException(
  107.                 'customer_group',
  108.                 'displayGross: ' $displayGross 'true' 'false'
  109.             );
  110.         }
  111.         return $group->getId();
  112.     }
  113.     private function resetCustomFields(Page $page): void
  114.     {
  115.         if (($header $page->getHeader()) === null
  116.             || ($nav $header->getNavigation()) === null
  117.             || ($active $nav->getActive()) === null)
  118.         {
  119.             return;
  120.         }
  121.         $active->setCustomFields([]);
  122.     }
  123. }