<?php
namespace CioBusinesscards\Subscriber;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
class BusinesscardDataSubscriber implements EventSubscriberInterface
{
private RequestStack $requestStack;
private CartService $cartService;
public function __construct(RequestStack $requestStack, CartService $cartService)
{
$this->requestStack = $requestStack;
$this->cartService = $cartService;
}
public static function getSubscribedEvents(): array
{
return [
BeforeLineItemAddedEvent::class => 'onLineItemAdded',
ProductPageLoadedEvent::class => 'onProductPageLoaded',
];
}
public function onLineItemAdded(BeforeLineItemAddedEvent $event): void
{
$requestLineItems = $this->requestStack->getCurrentRequest()->get('lineItems');
if (is_array($requestLineItems)) {
foreach ($event->getCart()->getLineItems() as $lineItem) {
$requestLineItem = current(array_filter($requestLineItems, function ($requestLineItem) use ($lineItem) {
return $requestLineItem['id'] == $lineItem->getId();
}));
if ($requestLineItem && isset($requestLineItem['payload'])) {
foreach ($requestLineItem['payload'] as $key => $value) {
$lineItem->setPayloadValue($key, $value);
}
if ($event->isMerged() && is_array($lineItem->getPayload()) && (key_exists('businesscard_data', $lineItem->getPayload()) || key_exists('recommendation_card_data', $lineItem->getPayload()))) {
$lineItem->setQuantity($lineItem->getQuantity() - 1);
}
}
}
}
}
public function onProductPageLoaded(ProductPageLoadedEvent $event): SalesChannelProductEntity
{
$product = $event->getPage()->getProduct();
$lineItemId = $event->getRequest()->get('lineItemId');
if (!is_null($lineItemId)) {
if (!$this->cartService->getCart($event->getSalesChannelContext()->getToken(), $event->getSalesChannelContext())->has($lineItemId)) {
$request = $event->getRequest();
$response = new RedirectResponse($request->getRequestUri());
$response->send();
} else {
$lineItem = $this->cartService->getCart($event->getSalesChannelContext()->getToken(), $event->getSalesChannelContext())->getLineItems()->get($lineItemId);
if (isset($lineItem->getPayload()['businesscard_data']) && strlen($lineItem->getPayload()['businesscard_data'])) {
$product->addExtension('businesscard_data', new ArrayEntity(json_decode($lineItem->getPayload()['businesscard_data'], true)));
}
if (isset($lineItem->getPayload()['recommendation_card_data']) && strlen($lineItem->getPayload()['recommendation_card_data'])) {
$product->addExtension('recommendation_card_data', new ArrayEntity(json_decode($lineItem->getPayload()['recommendation_card_data'], true)));
}
}
}
return $product;
}
}