<?php declare(strict_types=1);
namespace NrbnBasketStore\Storefront\Controller;
use NrbnBasketStore\Storefront\Page\NrbnBasketStore\NrbnBasketStorePageLoader;
use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\Checkout\Cart\LineItem\LineItem;
use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
use Shopware\Core\Framework\Uuid\Uuid;
use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Controller\StorefrontController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route(defaults={"_routeScope"={"storefront"}})
*/
class NrbnBasketStoreController extends StorefrontController
{
/**
* @var CartService
*/
private $cartService;
/**
* @var EntityRepository
*/
private $basketStoreRespository;
private NrbnBasketStorePageLoader $nrbnBasketStorePageLoader;
public function __construct(
CartService $cartService,
EntityRepository $basketStoreRespository,
NrbnBasketStorePageLoader $nrbnBasketStorePageLoader
)
{
$this->cartService = $cartService;
$this->basketStoreRespository = $basketStoreRespository;
$this->nrbnBasketStorePageLoader = $nrbnBasketStorePageLoader;
}
/**
* @Route("/NrbnBasketStore", name="frontend.nrbnbasketstore.page", methods={"GET"})
*/
public function examplePage(Request $request, SalesChannelContext $context): Response
{
$page = $this->nrbnBasketStorePageLoader->load($request,$context);
return $this->renderStorefront('@NrbnBasketStore/storefront/page/nrbnbasketstore/index.html.twig',[
'controllerName' => 'BasketStore',
'page' => $page
]);
}
/**
* @Route("/NrbnBasketStore/save", name="frontend.nrbnbasketstore.save", methods={"POST"}, defaults={ "XmlHttpRequest"=true})
*/
public function save(RequestDataBag $requestDataBag,SalesChannelContext $salesChannelContext)
{
$cart = $this->cartService->getCart($salesChannelContext->getToken(),$salesChannelContext);
$description = $requestDataBag->getAlnum('templatedesc');
if (!$description){
throw new MissingRequestParameterException($description);
}
$lineItems = $cart->getLineItems();
$basketStore = [
'id' => Uuid::randomHex(),
'customerId' => $salesChannelContext->getCustomer()->getId(),
'description' => $description,
];
/** @var LineItem $lineItem */
foreach ($lineItems as $lineItem) {
if ($lineItem->getType() != LineItem::PRODUCT_LINE_ITEM_TYPE) continue;
$basketStore['lineItems'][] = [
'id' => Uuid::randomHex(),
'cartId' => $basketStore['id'],
'identifier' => $lineItem->getId(),
'referencedId' => $lineItem->getReferencedId(),
'type' => $lineItem->getType(),
'quantity' => $lineItem->getQuantity(),
'label' => $lineItem->getLabel(),
'price' => $lineItem->getPrice(),
'priceDefinition' => $lineItem->getPriceDefinition(),
'coverId' => $lineItem->getCover() ? $lineItem->getCover()->getId() : null,
'payload' => $lineItem->getPayload(),
];
}
$this->basketStoreRespository->create([$basketStore],$salesChannelContext->getContext());
$this->addFlash(self::SUCCESS, $this->trans(
'nrbn_basketstore.checkout.saved'
));
return $this->redirectToRoute('frontend.checkout.cart.page');
}
}