<?php
namespace CoeBasketOfferSw6\Offer\Subscriber;
use CoeBasketOfferSw6\Offer\OfferEntity;
use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\Checkout\Cart\CartPersister;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Shopware\Core\Framework\Uuid\Uuid;
use Shopware\Core\System\SalesChannel\Context\AbstractSalesChannelContextFactory;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class OfferRuntimeSubscriber implements EventSubscriberInterface {
/**
* @var CartPersister
*/
private CartPersister $cartPersister;
/**
* @var AbstractSalesChannelContextFactory
*/
private AbstractSalesChannelContextFactory $salesChannelContextFactory;
/**
* OfferRuntimeSubscriber constructor.
* @param CartPersister $cartPersister
* @param AbstractSalesChannelContextFactory $salesChannelContextFactory
*/
public function __construct(
CartPersister $cartPersister,
AbstractSalesChannelContextFactory $salesChannelContextFactory
) {
$this->cartPersister = $cartPersister;
$this->salesChannelContextFactory = $salesChannelContextFactory;
}
public static function getSubscribedEvents(): array {
return [
'coe_offer.loaded' => 'onOfferLoaded'
];
}
public function onOfferLoaded(EntityLoadedEvent $event): void
{
/** @var string $salesChannelId */
$salesChannelId = $event->getContext()->getSource()->getSalesChannelId();
/** @var SalesChannelContext $salesChannelContext */
$salesChannelContext = $this->salesChannelContextFactory->create(Uuid::randomHex(), $salesChannelId);
/** @var OfferEntity $offer */
foreach ($event->getEntities() as $offer) {
$offer->setCart($this->computeCart($offer, $salesChannelContext));
}
}
protected function computeCart(OfferEntity $offer, SalesChannelContext $context) : Cart{
$cart = $this->cartPersister->load($offer->getCartToken(), $context);
return $cart;
}
}