vendor/shopware/storefront/Page/Account/Order/AccountOrderPageLoader.php line 72

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Page\Account\Order;
  3. use Shopware\Core\Checkout\Cart\CartException;
  4. use Shopware\Core\Checkout\Cart\Exception\CustomerNotLoggedInException;
  5. use Shopware\Core\Checkout\Customer\SalesChannel\AccountService;
  6. use Shopware\Core\Checkout\Order\Exception\GuestNotAuthenticatedException;
  7. use Shopware\Core\Checkout\Order\Exception\WrongGuestCredentialsException;
  8. use Shopware\Core\Checkout\Order\SalesChannel\AbstractOrderRoute;
  9. use Shopware\Core\Content\Category\Exception\CategoryNotFoundException;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  15. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  16. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  17. use Shopware\Storefront\Event\RouteRequest\OrderRouteRequestEvent;
  18. use Shopware\Storefront\Framework\Page\StorefrontSearchResult;
  19. use Shopware\Storefront\Page\GenericPageLoaderInterface;
  20. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  21. use Symfony\Component\HttpFoundation\Request;
  22. class AccountOrderPageLoader
  23. {
  24.     private GenericPageLoaderInterface $genericLoader;
  25.     private EventDispatcherInterface $eventDispatcher;
  26.     private AbstractOrderRoute $orderRoute;
  27.     private AccountService $accountService;
  28.     /**
  29.      * @internal
  30.      */
  31.     public function __construct(
  32.         GenericPageLoaderInterface $genericLoader,
  33.         EventDispatcherInterface $eventDispatcher,
  34.         AbstractOrderRoute $orderRoute,
  35.         AccountService $accountService
  36.     ) {
  37.         $this->genericLoader $genericLoader;
  38.         $this->eventDispatcher $eventDispatcher;
  39.         $this->orderRoute $orderRoute;
  40.         $this->accountService $accountService;
  41.     }
  42.     /**
  43.      * @throws CategoryNotFoundException
  44.      * @throws CustomerNotLoggedInException
  45.      * @throws GuestNotAuthenticatedException
  46.      * @throws InconsistentCriteriaIdsException
  47.      * @throws MissingRequestParameterException
  48.      * @throws WrongGuestCredentialsException
  49.      */
  50.     public function load(Request $requestSalesChannelContext $salesChannelContext): AccountOrderPage
  51.     {
  52.         if (!$salesChannelContext->getCustomer() && $request->get('deepLinkCode'false) === false) {
  53.             throw CartException::customerNotLoggedIn();
  54.         }
  55.         $page $this->genericLoader->load($request$salesChannelContext);
  56.         $page AccountOrderPage::createFrom($page);
  57.         if ($page->getMetaInformation()) {
  58.             $page->getMetaInformation()->setRobots('noindex,follow');
  59.         }
  60.         $page->setOrders(StorefrontSearchResult::createFrom($this->getOrders($request$salesChannelContext)));
  61.         $page->setDeepLinkCode($request->get('deepLinkCode'));
  62.         if ($request->get('deepLinkCode') && $page->getOrders()->first() !== null) {
  63.             $this->accountService->loginById(
  64.                 $page->getOrders()->first()->getOrderCustomer()->getCustomer()->getId(),
  65.                 $salesChannelContext
  66.             );
  67.         }
  68.         $this->eventDispatcher->dispatch(
  69.             new AccountOrderPageLoadedEvent($page$salesChannelContext$request)
  70.         );
  71.         return $page;
  72.     }
  73.     /**
  74.      * @throws CustomerNotLoggedInException
  75.      * @throws GuestNotAuthenticatedException
  76.      * @throws WrongGuestCredentialsException
  77.      */
  78.     private function getOrders(Request $requestSalesChannelContext $context): EntitySearchResult
  79.     {
  80.         $criteria $this->createCriteria($request);
  81.         $apiRequest = new Request();
  82.         // Add email and zipcode for guest customer verification in order view
  83.         if ($request->get('email'false) && $request->get('zipcode'false)) {
  84.             $apiRequest->query->set('email'$request->get('email'));
  85.             $apiRequest->query->set('zipcode'$request->get('zipcode'));
  86.         }
  87.         $event = new OrderRouteRequestEvent($request$apiRequest$context$criteria);
  88.         $this->eventDispatcher->dispatch($event);
  89.         $responseStruct $this->orderRoute
  90.             ->load($event->getStoreApiRequest(), $context$criteria);
  91.         return $responseStruct->getOrders();
  92.     }
  93.     private function createCriteria(Request $request): Criteria
  94.     {
  95.         $limit $request->get('limit');
  96.         $limit $limit ? (int) $limit 10;
  97.         $page $request->get('p');
  98.         $page $page ? (int) $page 1;
  99.         $criteria = (new Criteria())
  100.             ->addSorting(new FieldSorting('order.createdAt'FieldSorting::DESCENDING))
  101.             ->addAssociation('transactions.paymentMethod')
  102.             ->addAssociation('deliveries.shippingMethod')
  103.             ->addAssociation('orderCustomer.customer')
  104.             ->addAssociation('lineItems')
  105.             ->addAssociation('lineItems.cover')
  106.             ->addAssociation('addresses')
  107.             ->addAssociation('currency')
  108.             ->addAssociation('documents.documentType')
  109.             ->setLimit($limit)
  110.             ->setOffset(($page 1) * $limit)
  111.             ->setTotalCountMode(Criteria::TOTAL_COUNT_MODE_EXACT);
  112.         $criteria
  113.             ->getAssociation('transactions')
  114.             ->addSorting(new FieldSorting('createdAt'));
  115.         $criteria
  116.             ->addSorting(new FieldSorting('orderDateTime'FieldSorting::DESCENDING));
  117.         if ($request->get('deepLinkCode')) {
  118.             $criteria->addFilter(new EqualsFilter('deepLinkCode'$request->get('deepLinkCode')));
  119.         }
  120.         return $criteria;
  121.     }
  122. }