<?php
declare(strict_types=1);
namespace EsmCmsExtensions\Storefront\Subscriber;
use Shopware\Core\Content\Product\Events\ProductListingResultEvent;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class OfferSubscriber implements EventSubscriberInterface
{
protected EntityRepository $offerRepository;
public function __construct(EntityRepository $offerRepository)
{
$this->offerRepository = $offerRepository;
}
public static function getSubscribedEvents(): array
{
return [
ProductListingResultEvent::class => 'onProductListingResult',
NavigationPageLoadedEvent::class => 'onNavigationPageLoaded',
];
}
public function onProductListingResult(ProductListingResultEvent $event): void
{
$categoryId = $event->getRequest()->get('navigationId');
if(!$categoryId) {
return;
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('categories.id', $categoryId));
$offer = $this->offerRepository->search($criteria, $event->getContext())->first();
$event->getResult()->addExtension('offer', $offer);
}
public function onNavigationPageLoaded(NavigationPageLoadedEvent $event): void
{
$navigationId = $event->getRequest()->attributes->get('navigationId');
if(!$navigationId) {
return;
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('categories.id', $navigationId));
$offer = $this->offerRepository->search($criteria, $event->getContext())->first();
$event->getPage()->addExtension('offer', $offer);
}
}