custom/static-plugins/top-banner/src/Subscriber/TopBannerSubscriber.php line 47

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Wexo\TopBanner\Subscriber;
  3. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  4. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  10. use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Wexo\TopBanner\Core\Content\TopBanner\TopBannerEntity;
  13. /**
  14.  * Class TopBannerSubscriber
  15.  * @package Wexo\TopBanner\Subscriber
  16.  */
  17. class TopBannerSubscriber implements EventSubscriberInterface
  18. {
  19.     protected EntityRepositoryInterface $topBannerRepository;
  20.     /**
  21.      * TopBannerSubscriber constructor.
  22.      * @param EntityRepositoryInterface $topBannerRepository
  23.      */
  24.     public function __construct(
  25.         EntityRepositoryInterface $topBannerRepository
  26.     ) {
  27.         $this->topBannerRepository $topBannerRepository;
  28.     }
  29.     /**
  30.      * @return string[]
  31.      */
  32.     public static function getSubscribedEvents(): array
  33.     {
  34.         return [
  35.             HeaderPageletLoadedEvent::class => "onHeaderPageletLoaded",
  36.         ];
  37.     }
  38.     /**
  39.      * @param HeaderPageletLoadedEvent $event
  40.      */
  41.     public function onHeaderPageletLoaded(HeaderPageletLoadedEvent $event): void
  42.     {
  43.         $salesChannel $event->getSalesChannelContext()->getSalesChannel()->getId();
  44.         $today date('Y-m-d');
  45.         $criteria = new Criteria();
  46.         $criteria->addFilter(new EqualsFilter('active'true));
  47.         $criteria->addFilter(new ContainsFilter('salesChannelIds'$salesChannel));
  48.         $criteria->addFilter(
  49.             new MultiFilter(
  50.                 MultiFilter::CONNECTION_AND,
  51.                 [
  52.                     new MultiFilter(
  53.                         MultiFilter::CONNECTION_OR,
  54.                         [
  55.                             new RangeFilter('bannerStartDate', ['lte' => $today]),
  56.                             new EqualsFilter('bannerStartDate'null),
  57.                         ]
  58.                     ),
  59.                     new MultiFilter(
  60.                         MultiFilter::CONNECTION_OR,
  61.                         [
  62.                             new RangeFilter('bannerEndDate', ['gte' => $today]),
  63.                             new EqualsFilter('bannerEndDate'null),
  64.                         ]
  65.                     )
  66.                 ]
  67.             )
  68.         );
  69.         $bannerList $this->topBannerRepository->search($criteria$event->getContext())->getElements();
  70.         $placements = ['top''mid''bot'];
  71.         $bannerArray = [];
  72.         $shuffleArray = [];
  73.         /** @var TopBannerEntity $banner */
  74.         foreach ($placements as $placement) {
  75.             foreach ($bannerList as $banner) {
  76.                 if ($banner->getBannerPosition() === $placement) {
  77.                     $shuffleArray[$placement][] = $banner;
  78.                 }
  79.             }
  80.         }
  81.         foreach ($shuffleArray as $key => $banner) {
  82.             $selectedNumber rand(0, (count($banner) - 1));
  83.             $bannerArray[$key] = $banner[$selectedNumber];
  84.         }
  85.         $event->getPagelet()->banner $bannerArray;
  86.     }
  87. }