<?php declare(strict_types=1);
namespace Dkc\Productoptions\Subscriber;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class CartPriceSubscriber implements EventSubscriberInterface
{
private RequestStack $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
public static function getSubscribedEvents(): array
{
return [
BeforeLineItemAddedEvent::class => ['onBeforeLineItemAdded', 9999],
];
}
public function onBeforeLineItemAdded(BeforeLineItemAddedEvent $event): void
{
$lineItem = $event->getLineItem();
$lineItemId = $lineItem->getId();
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return;
}
$allParams = $request->request->all();
if (!isset($allParams['lineItems'][$lineItemId]['payload']['dkc_product_options'])) {
return;
}
$options = $allParams['lineItems'][$lineItemId]['payload']['dkc_product_options'];
$price = $allParams['lineItems'][$lineItemId]['payload']['dkc_product_options_price'] ?? 0;
$labels = $allParams['lineItems'][$lineItemId]['payload']['dkc_product_options_labels'] ?? null;
if (is_string($options)) {
$options = json_decode($options, true);
}
if (is_string($labels)) {
$labels = json_decode($labels, true);
}
$lineItem->setPayloadValue('dkc_product_options', $options);
$lineItem->setPayloadValue('dkc_product_options_price', (float) $price);
if ($labels) {
$lineItem->setPayloadValue('dkc_product_options_labels', $labels);
}
}
}