<?php declare(strict_types=1);
namespace db_ProductConfigurator\Storefront\Page\Cart;
use Shopware\Core\Checkout\Cart\Event\AfterLineItemAddedEvent;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
use Shopware\Core\Checkout\Cart\Event\CartChangedEvent;
use Shopware\Core\Checkout\Cart\LineItem\LineItem;
use Shopware\Core\Checkout\Cart\Price\QuantityPriceCalculator;
use Shopware\Core\Checkout\Cart\Price\Struct\QuantityPriceDefinition;
use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
use Shopware\Core\Content\Product\Cart\ProductGatewayInterface;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Shopware\Core\Framework\Uuid\Uuid;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class CartItemSubscriber implements EventSubscriberInterface
{
/**
* @var RequestStack
*/
private RequestStack $requestStack;
/**
* @var CartService
*/
private $cartService;
/**
* @var QuantityPriceCalculator
*/
private $calculator;
/**
* @var ProductGatewayInterface
*/
private $productGateway;
public function __construct(
RequestStack $requestStack,
CartService $cartService,
QuantityPriceCalculator $calculator,
ProductGatewayInterface $productGateway
) {
$this->requestStack = $requestStack;
$this->cartService = $cartService;
$this->calculator = $calculator;
$this->productGateway = $productGateway;
}
public static function getSubscribedEvents(): array
{
return [
BeforeLineItemAddedEvent::class => 'beforeLineItemAdded'
];
}
public function beforeLineItemAdded(BeforeLineItemAddedEvent $event): void
{
$request = $this->requestStack->getCurrentRequest();
$dbConfiguration = $request->get('dbConfigurator');
$dbPrice = $request->get('dbCalculatedPrice');
if ($dbConfiguration) {
$lineItem = $event->getLineItem();
$cart = $event->getCart();
$product = $this->productGateway->get([$lineItem->getId()], $event->getSalesChannelContext());
$productId = $lineItem->getId();
$dbQuantity = $request->get('db-quantity');
if ($dbQuantity) {
$quantity = (int)$dbQuantity;
} else {
$quantity = $cart->get($lineItem->getId())->getQuantity();
}
$cart->remove($lineItem->getId());
$newId = Uuid::randomHex();
$newItem = new LineItem($newId, LineItem::PRODUCT_LINE_ITEM_TYPE, $productId, $quantity);
$newItem->setPayloadValue('dbPrice', $dbPrice);
$newItem->setPayloadValue('dbConfigurator', json_decode($dbConfiguration, true))
->setStackable(true)
->setRemovable(true);
$cart->add($newItem);
}
}
}