custom/static-plugins/Shopware-6-Blog-Plugin/src/Content/Blog/Subscriber/BlogSubscriber.php line 28

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Sas\BlogModule\Content\Blog\Subscriber;
  3. use Sas\BlogModule\Content\Blog\BlogEntriesDefinition;
  4. use Sas\BlogModule\Content\Blog\BlogListingFilterBuildEvent;
  5. use Sas\BlogModule\Content\Blog\Events\BlogMainFilterEvent;
  6. use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;
  7. use Shopware\Core\Content\Product\SalesChannel\Listing\Filter;
  8. use Shopware\Core\Content\Product\SalesChannel\Listing\FilterCollection;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Aggregation\Bucket\FilterAggregation;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Aggregation\Metric\EntityAggregation;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\Request;
  16. class BlogSubscriber implements EventSubscriberInterface
  17. {
  18.     public static function getSubscribedEvents(): array
  19.     {
  20.         return [
  21.             BlogListingFilterBuildEvent::BLOG_MAIIN_FILTER_EVENT => 'loaded',
  22.         ];
  23.     }
  24.     public function loaded(BlogMainFilterEvent $event): void
  25.     {
  26.         $dateTime = new \DateTime();
  27.         $criteria $event->getCriteria();
  28.         $criteria->addFilter(
  29.             new EqualsFilter('active'true)
  30.         );
  31.         if(!$event->getRequest()->attributes->get("eventList")){
  32.             $criteria->addFilter(
  33.                 new RangeFilter('publishedAt', [RangeFilter::LTE => $dateTime->format(\DATE_ATOM)])
  34.             );
  35.         }
  36.         $criteriaCollection = new CriteriaCollection();
  37.         $criteriaCollection->add(
  38.             'sas_blog',
  39.             BlogEntriesDefinition::class,
  40.             $criteria
  41.         );
  42.         $request $event->getRequest();
  43.         $filters $this->getFilters($request);
  44.         $aggregations $this->getAggregations($request$filters);
  45.         foreach ($aggregations as $aggregation) {
  46.             $criteria->addAggregation($aggregation);
  47.         }
  48.         foreach ($filters as $filter) {
  49.             if ($filter->isFiltered()) {
  50.                 $criteria->addPostFilter($filter->getFilter());
  51.             }
  52.         }
  53.         $criteria->addExtension('filters'$filters);
  54.     }
  55.     private function getAggregations(Request $requestFilterCollection $filters): array
  56.     {
  57.         $aggregations = [];
  58.         if ($request->get('reduce-aggregations'null) === null) {
  59.             foreach ($filters as $filter) {
  60.                 $aggregations array_merge($aggregations$filter->getAggregations());
  61.             }
  62.             return $aggregations;
  63.         }
  64.         foreach ($filters as $filter) {
  65.             $excluded $filters->filtered();
  66.             if ($filter->exclude()) {
  67.                 $excluded $excluded->blacklist($filter->getName());
  68.             }
  69.             foreach ($filter->getAggregations() as $aggregation) {
  70.                 if ($aggregation instanceof FilterAggregation) {
  71.                     $aggregation->addFilters($excluded->getFilters());
  72.                     $aggregations[] = $aggregation;
  73.                     continue;
  74.                 }
  75.                 $aggregation = new FilterAggregation(
  76.                     $aggregation->getName() . '-filtered',
  77.                     $aggregation,
  78.                     $excluded->getFilters()
  79.                 );
  80.                 $aggregations[] = $aggregation;
  81.             }
  82.         }
  83.         return $aggregations;
  84.     }
  85.     private function getFilters(Request $request): FilterCollection
  86.     {
  87.         $filters = new FilterCollection();
  88.         $filters->add($this->getCategoriesFilter($request));
  89.         $filters->add($this->getAuthorsFilter($request));
  90.         return $filters;
  91.     }
  92.     private function getCategoriesFilter(Request $request): Filter
  93.     {
  94.         $ids $this->getFilterByCustomIds('categories'$request);
  95.         return new Filter(
  96.             'categories',
  97.             !empty($ids),
  98.             [
  99.                 new EntityAggregation('blogCategories''blogCategories.id''sas_blog_category'),
  100.             ],
  101.             new EqualsAnyFilter('blogCategories.id'$ids),
  102.             $ids
  103.         );
  104.     }
  105.     private function getAuthorsFilter(Request $request): Filter
  106.     {
  107.         $ids $this->getFilterByCustomIds('authors'$request);
  108.         return new Filter(
  109.             'authors',
  110.             !empty($ids),
  111.             [
  112.                 new EntityAggregation('authors''authorId''sas_blog_author'),
  113.             ],
  114.             new EqualsAnyFilter('authorId'$ids),
  115.             $ids
  116.         );
  117.     }
  118.     private function getFilterByCustomIds(string $inputRequest $request): array
  119.     {
  120.         $ids $request->query->get($input'');
  121.         if ($request->isMethod(Request::METHOD_POST)) {
  122.             $ids $request->request->get($input'');
  123.         }
  124.         $ids explode('|'$ids);
  125.         return array_filter($ids);
  126.     }
  127. }