<?php declare(strict_types=1);
namespace NrbnBasketStore\Storefront\Page\NrbnBasketStore;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\RequestCriteriaBuilder;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Framework\Page\StorefrontSearchResult;
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
class NrbnBasketStorePageLoader{
private GenericPageLoaderInterface $genericPageLoader;
private RequestCriteriaBuilder $requestCriteriaBuilder;
private EntityRepository $nrbnBasketStoreRepository;
public function __construct(
GenericPageLoaderInterface $genericPageLoader,
RequestCriteriaBuilder $requestCriteriaBuilder,
EntityRepository $nrbnBasketStoreRepository
){
$this->genericPageLoader = $genericPageLoader;
$this->requestCriteriaBuilder = $requestCriteriaBuilder;
$this->nrbnBasketStoreRepository = $nrbnBasketStoreRepository;
}
public function load(Request $request, SalesChannelContext $context):NrbnBasketStorePage {
$page = $this->genericPageLoader->load($request,$context);
/** @var NrbnBasketStorePage $page */
$page = NrbnBasketStorePage::createFrom($page);
$page->setOrders(StorefrontSearchResult::createFrom($this->getOrders($request,$context)));
return $page;
}
private function getOrders(Request $request, SalesChannelContext $context): EntitySearchResult {
$criteria = $this->createCriteria($request, $context->getCustomer()->getId());
$routeRequest = new Request();
$routeRequest->query->replace($this->requestCriteriaBuilder->toArray($criteria));
return $this->nrbnBasketStoreRepository->search($criteria,$context->getContext());
}
private function createCriteria(Request $request, $customerId): Criteria
{
$limit = (int)$request->query->get('limit', 10);
$page = (int)$request->query->get('p', 1);
$criteria = (new Criteria())
->setLimit($limit)
->setOffset(($page - 1) * $limit)
->setTotalCountMode(Criteria::TOTAL_COUNT_MODE_NEXT_PAGES)
->addAssociation('lineItems')
->addAssociation('lineItems.cover');
$criteria->addSorting(new FieldSorting('createdAt',FieldSorting::DESCENDING));
$criteria->addFilter(new EqualsFilter('customerId', $customerId));
return $criteria;
}
}