<?php declare(strict_types=1);
namespace Wexo\MarketingTools\Subscriber;
use Shopware\Core\Content\Product\Events\ProductListingResultEvent;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Wexo\MarketingTools\Helper\MarketingToolsHelper;
/**
* Class ProductListingResultEventSubscriber
* @package Wexo\MarketingTools\Subscriber
*/
class ProductListingResultEventSubscriber implements EventSubscriberInterface
{
/** @var EntityRepositoryInterface */
protected $categoryBannerRepository;
/** @var MarketingToolsHelper */
protected $helper;
/**
* ProductListingResultEventSubscriber constructor.
* @param EntityRepositoryInterface $entityRepository
* @param MarketingToolsHelper $helper
*/
public function __construct(EntityRepositoryInterface $entityRepository, MarketingToolsHelper $helper)
{
$this->categoryBannerRepository = $entityRepository;
$this->helper = $helper;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
ProductListingResultEvent::class => 'onProductListing'
];
}
/**
* @param ProductListingResultEvent $event
*/
public function onProductListing(ProductListingResultEvent $event): void
{
$navigationId = $event->getResult()->getCurrentFilter('navigationId');
$criteria = $this->helper->getValidationCriteria($event->getSalesChannelContext());
$criteria->addFilter(new EqualsFilter('categories.categoryId', $navigationId));
$criteria->addAssociation('categories.category');
$banners = $this->categoryBannerRepository->search($criteria, $event->getContext());
$currentPage = $event->getResult()->getPage();
$banners = $banners->filter(function ($item) use ($currentPage, $navigationId) {
$pages = $item->getPages();
$pageCondition = in_array($currentPage, $pages);
if ($item->getExclusionMode()) {
$pageCondition = !in_array($currentPage, $pages);
}
return $pageCondition;
});
$banners_end = $banners->filter(function ($item) use ($banners) {
$condition = $item->getStartFromEnd();
if ($condition) {
$banners->getEntities()->remove($item->getId());
}
return $condition;
});
$event->getResult()->addExtension('banners', $banners->getEntities());
$event->getResult()->addExtension('banners_end', $banners_end->getEntities());
}
}