<?php declare(strict_types=1);
namespace Wexo\TopBanner\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Wexo\TopBanner\Core\Content\TopBanner\TopBannerEntity;
/**
* Class TopBannerSubscriber
* @package Wexo\TopBanner\Subscriber
*/
class TopBannerSubscriber implements EventSubscriberInterface
{
protected EntityRepositoryInterface $topBannerRepository;
/**
* TopBannerSubscriber constructor.
* @param EntityRepositoryInterface $topBannerRepository
*/
public function __construct(
EntityRepositoryInterface $topBannerRepository
) {
$this->topBannerRepository = $topBannerRepository;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
HeaderPageletLoadedEvent::class => "onHeaderPageletLoaded",
];
}
/**
* @param HeaderPageletLoadedEvent $event
*/
public function onHeaderPageletLoaded(HeaderPageletLoadedEvent $event): void
{
$salesChannel = $event->getSalesChannelContext()->getSalesChannel()->getId();
$today = date('Y-m-d');
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('active', true));
$criteria->addFilter(new ContainsFilter('salesChannelIds', $salesChannel));
$criteria->addFilter(
new MultiFilter(
MultiFilter::CONNECTION_AND,
[
new MultiFilter(
MultiFilter::CONNECTION_OR,
[
new RangeFilter('bannerStartDate', ['lte' => $today]),
new EqualsFilter('bannerStartDate', null),
]
),
new MultiFilter(
MultiFilter::CONNECTION_OR,
[
new RangeFilter('bannerEndDate', ['gte' => $today]),
new EqualsFilter('bannerEndDate', null),
]
)
]
)
);
$bannerList = $this->topBannerRepository->search($criteria, $event->getContext())->getElements();
$placements = ['top', 'mid', 'bot'];
$bannerArray = [];
$shuffleArray = [];
/** @var TopBannerEntity $banner */
foreach ($placements as $placement) {
foreach ($bannerList as $banner) {
if ($banner->getBannerPosition() === $placement) {
$shuffleArray[$placement][] = $banner;
}
}
}
foreach ($shuffleArray as $key => $banner) {
$selectedNumber = rand(0, (count($banner) - 1));
$bannerArray[$key] = $banner[$selectedNumber];
}
$event->getPagelet()->banner = $bannerArray;
}
}