vendor/shopware/storefront/Controller/CheckoutController.php line 212

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Controller;
  3. use Shopware\Core\Checkout\Cart\Error\Error;
  4. use Shopware\Core\Checkout\Cart\Exception\CartTokenNotFoundException;
  5. use Shopware\Core\Checkout\Cart\Exception\CustomerNotLoggedInException;
  6. use Shopware\Core\Checkout\Cart\Exception\OrderNotFoundException;
  7. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  8. use Shopware\Core\Checkout\Customer\SalesChannel\AbstractLogoutRoute;
  9. use Shopware\Core\Checkout\Order\Exception\EmptyCartException;
  10. use Shopware\Core\Checkout\Order\SalesChannel\OrderService;
  11. use Shopware\Core\Checkout\Payment\Exception\InvalidOrderException;
  12. use Shopware\Core\Checkout\Payment\Exception\PaymentProcessException;
  13. use Shopware\Core\Checkout\Payment\Exception\UnknownPaymentMethodException;
  14. use Shopware\Core\Checkout\Payment\PaymentService;
  15. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  16. use Shopware\Core\Framework\Routing\Annotation\Since;
  17. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  18. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  19. use Shopware\Core\Framework\Validation\Exception\ConstraintViolationException;
  20. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  21. use Shopware\Core\System\SystemConfig\SystemConfigService;
  22. use Shopware\Storefront\Framework\AffiliateTracking\AffiliateTrackingListener;
  23. use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoader;
  24. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoader;
  25. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoader;
  26. use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoader;
  27. use Symfony\Component\HttpFoundation\RedirectResponse;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. /**
  33.  * @RouteScope(scopes={"storefront"})
  34.  */
  35. class CheckoutController extends StorefrontController
  36. {
  37.     /**
  38.      * @var CartService
  39.      */
  40.     private $cartService;
  41.     /**
  42.      * @var CheckoutCartPageLoader
  43.      */
  44.     private $cartPageLoader;
  45.     /**
  46.      * @var CheckoutConfirmPageLoader
  47.      */
  48.     private $confirmPageLoader;
  49.     /**
  50.      * @var CheckoutFinishPageLoader
  51.      */
  52.     private $finishPageLoader;
  53.     /**
  54.      * @var OrderService
  55.      */
  56.     private $orderService;
  57.     /**
  58.      * @var PaymentService
  59.      */
  60.     private $paymentService;
  61.     /**
  62.      * @var OffcanvasCartPageLoader
  63.      */
  64.     private $offcanvasCartPageLoader;
  65.     /**
  66.      * @var SystemConfigService
  67.      */
  68.     private $config;
  69.     /**
  70.      * @var AbstractLogoutRoute
  71.      */
  72.     private $logoutRoute;
  73.     public function __construct(
  74.         CartService $cartService,
  75.         CheckoutCartPageLoader $cartPageLoader,
  76.         CheckoutConfirmPageLoader $confirmPageLoader,
  77.         CheckoutFinishPageLoader $finishPageLoader,
  78.         OrderService $orderService,
  79.         PaymentService $paymentService,
  80.         OffcanvasCartPageLoader $offcanvasCartPageLoader,
  81.         SystemConfigService $config,
  82.         AbstractLogoutRoute $logoutRoute
  83.     ) {
  84.         $this->cartService $cartService;
  85.         $this->cartPageLoader $cartPageLoader;
  86.         $this->confirmPageLoader $confirmPageLoader;
  87.         $this->finishPageLoader $finishPageLoader;
  88.         $this->orderService $orderService;
  89.         $this->paymentService $paymentService;
  90.         $this->offcanvasCartPageLoader $offcanvasCartPageLoader;
  91.         $this->config $config;
  92.         $this->logoutRoute $logoutRoute;
  93.     }
  94.     /**
  95.      * @Since("6.0.0.0")
  96.      * @Route("/checkout/cart", name="frontend.checkout.cart.page", options={"seo"="false"}, methods={"GET"})
  97.      */
  98.     public function cartPage(Request $requestSalesChannelContext $context): Response
  99.     {
  100.         $page $this->cartPageLoader->load($request$context);
  101.         return $this->renderStorefront('@Storefront/storefront/page/checkout/cart/index.html.twig', ['page' => $page]);
  102.     }
  103.     /**
  104.      * @Since("6.0.0.0")
  105.      * @Route("/checkout/confirm", name="frontend.checkout.confirm.page", options={"seo"="false"}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
  106.      */
  107.     public function confirmPage(Request $requestSalesChannelContext $context): Response
  108.     {
  109.         if (!$context->getCustomer()) {
  110.             return $this->redirectToRoute('frontend.checkout.register.page');
  111.         }
  112.         if ($this->cartService->getCart($context->getToken(), $context)->getLineItems()->count() === 0) {
  113.             return $this->redirectToRoute('frontend.checkout.cart.page');
  114.         }
  115.         $page $this->confirmPageLoader->load($request$context);
  116.         return $this->renderStorefront('@Storefront/storefront/page/checkout/confirm/index.html.twig', ['page' => $page]);
  117.     }
  118.     /**
  119.      * @Since("6.0.0.0")
  120.      * @Route("/checkout/finish", name="frontend.checkout.finish.page", options={"seo"="false"}, methods={"GET"})
  121.      *
  122.      * @throws CustomerNotLoggedInException
  123.      * @throws MissingRequestParameterException
  124.      * @throws OrderNotFoundException
  125.      */
  126.     public function finishPage(Request $requestSalesChannelContext $context): Response
  127.     {
  128.         if ($context->getCustomer() === null) {
  129.             return $this->redirectToRoute('frontend.checkout.register.page');
  130.         }
  131.         $page $this->finishPageLoader->load($request$context);
  132.         if ($page->isPaymentFailed() === true) {
  133.             // @deprecated tag:v6.4.0 - errors will be redirected immediately to the edit order page
  134.             $this->addFlash(
  135.                 'danger',
  136.                 $this->trans(
  137.                     'checkout.finishPaymentFailed',
  138.                     [
  139.                         '%editOrderUrl%' => $this->generateUrl('frontend.account.edit-order.page', ['orderId' => $request->get('orderId')]),
  140.                     ]
  141.                 )
  142.             );
  143.         }
  144.         if ($context->getCustomer()->getGuest() && $this->config->get('core.cart.logoutGuestAfterCheckout'$context->getSalesChannelId())) {
  145.             $this->logoutRoute->logout($context);
  146.         }
  147.         return $this->renderStorefront('@Storefront/storefront/page/checkout/finish/index.html.twig', ['page' => $page]);
  148.     }
  149.     /**
  150.      * @Since("6.0.0.0")
  151.      * @Route("/checkout/order", name="frontend.checkout.finish.order", options={"seo"="false"}, methods={"POST"})
  152.      */
  153.     public function order(RequestDataBag $dataSalesChannelContext $contextRequest $request): Response
  154.     {
  155.         if (!$context->getCustomer()) {
  156.             return $this->redirectToRoute('frontend.checkout.register.page');
  157.         }
  158.         $formViolations null;
  159.         $orderId null;
  160.         try {
  161.             $this->addAffiliateTracking($data$request->getSession());
  162.             $orderId $this->orderService->createOrder($data$context);
  163.             $finishUrl $this->generateUrl('frontend.checkout.finish.page', ['orderId' => $orderId]);
  164.             $errorUrl $this->generateUrl('frontend.account.edit-order.page', ['orderId' => $orderId]);
  165.             $response $this->paymentService->handlePaymentByOrder($orderId$data$context$finishUrl$errorUrl);
  166.             return $response ?? new RedirectResponse($finishUrl);
  167.         } catch (ConstraintViolationException $formViolations) {
  168.         } catch (Error $blockedError) {
  169.         } catch (EmptyCartException $blockedError) {
  170.         } catch (PaymentProcessException InvalidOrderException UnknownPaymentMethodException $e) {
  171.             return $this->forwardToRoute('frontend.checkout.finish.page', ['orderId' => $orderId'changedPayment' => false'paymentFailed' => true]);
  172.         }
  173.         return $this->forwardToRoute('frontend.checkout.confirm.page', ['formViolations' => $formViolations]);
  174.     }
  175.     /**
  176.      * @Since("6.0.0.0")
  177.      * @Route("/widgets/checkout/info", name="frontend.checkout.info", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  178.      *
  179.      * @throws CartTokenNotFoundException
  180.      */
  181.     public function info(Request $requestSalesChannelContext $context): Response
  182.     {
  183.         $page $this->offcanvasCartPageLoader->load($request$context);
  184.         return $this->renderStorefront('@Storefront/storefront/layout/header/actions/cart-widget.html.twig', ['page' => $page]);
  185.     }
  186.     /**
  187.      * @Since("6.0.0.0")
  188.      * @Route("/checkout/offcanvas", name="frontend.cart.offcanvas", options={"seo"="false"}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
  189.      *
  190.      * @throws CartTokenNotFoundException
  191.      */
  192.     public function offcanvas(Request $requestSalesChannelContext $context): Response
  193.     {
  194.         $page $this->offcanvasCartPageLoader->load($request$context);
  195.         if ($request->cookies->get('sf_redirect') === null) {
  196.             $cart $page->getCart();
  197.             $this->addCartErrors($cart);
  198.             $cart->getErrors()->clear();
  199.         }
  200.         return $this->renderStorefront('@Storefront/storefront/component/checkout/offcanvas-cart.html.twig', ['page' => $page]);
  201.     }
  202.     private function addAffiliateTracking(RequestDataBag $dataBagSessionInterface $session): void
  203.     {
  204.         $affiliateCode $session->get(AffiliateTrackingListener::AFFILIATE_CODE_KEY);
  205.         $campaignCode $session->get(AffiliateTrackingListener::CAMPAIGN_CODE_KEY);
  206.         if ($affiliateCode) {
  207.             $dataBag->set(AffiliateTrackingListener::AFFILIATE_CODE_KEY$affiliateCode);
  208.         }
  209.         if ($campaignCode) {
  210.             $dataBag->set(AffiliateTrackingListener::CAMPAIGN_CODE_KEY$campaignCode);
  211.         }
  212.     }
  213. }