<?php declare(strict_types=1);
namespace Wexo\GreenAlternatives\Subscriber;
use Shopware\Core\Checkout\Cart\LineItem\LineItem;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Wexo\GreenAlternatives\Service\GreenAlternativeService;
class WexoGreenAlternativesCartSubscriber implements EventSubscriberInterface
{
private GreenAlternativeService $alternativeService;
private EntityRepository $greenAlternativeRepository;
public function __construct(
GreenAlternativeService $alternativeService,
EntityRepository $greenAlternativeRepository
) {
$this->alternativeService = $alternativeService;
$this->greenAlternativeRepository = $greenAlternativeRepository;
}
public static function getSubscribedEvents(): array
{
return [
CheckoutCartPageLoadedEvent::class => 'onCheckoutCartPageLoaded'
];
}
public function onCheckoutCartPageLoaded(CheckoutCartPageLoadedEvent $event)
{
$lineItems = $event->getPage()->getCart()->getLineItems();
$greenAlternatives = $lineItems->filter(
/* Filter out any non products, such as custom products and promotions */
fn($item) => $item->getType() === LineItem::PRODUCT_LINE_ITEM_TYPE
)->map(fn($lineItem) => [
'current' => $lineItem,
'alternative' => $this->alternativeService->getGreenAlternativeByPriority(
$lineItem->getId(),
$event->getSalesChannelContext()->getContext()
)
?? null
]);
foreach ($greenAlternatives as $greenAlternative) {
if ($greenAlternative['alternative']) {
$lineItems->addExtension('wexoGreenAlternative', new ArrayStruct(['alternativesAvailable' => true]));
break;
}
}
}
}