custom/plugins/AppflixStudygood/src/Storefront/Subscriber/ProductCriteriaSubscriber.php line 79

Open in your IDE?
  1. <?php
  2. namespace Appflix\Studygood\Storefront\Subscriber;
  3. use Appflix\Studygood\Core\Content\Tutor\TutorDefinition;
  4. use Appflix\Studygood\Core\Service\VideoCourseService;
  5. use Shopware\Core\Content\Product\Events\ProductListingCollectFilterEvent;
  6. use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
  7. use Shopware\Core\Content\Product\SalesChannel\Listing\Filter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntitySearchedEvent;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Aggregation\Metric\EntityAggregation;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  13. use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
  14. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. class ProductCriteriaSubscriber implements EventSubscriberInterface
  17. {
  18.     private VideoCourseService $videoCourseService;
  19.     public function __construct(
  20.         VideoCourseService $videoCourseService
  21.     )
  22.     {
  23.         $this->videoCourseService $videoCourseService;
  24.     }
  25.     public static function getSubscribedEvents(): array
  26.     {
  27.         return [
  28.             ProductListingCriteriaEvent::class => 'addProductPageCriteria',
  29.             ProductPageCriteriaEvent::class => 'addProductPageCriteria',
  30.             ProductPageLoadedEvent::class => 'onProductPageLoaded',
  31.             EntitySearchedEvent::class => 'onSearch',
  32.             ProductListingCollectFilterEvent::class => 'onProductListingCollectFilter'
  33.         ];
  34.     }
  35.     public function onProductListingCollectFilter(ProductListingCollectFilterEvent $event): void
  36.     {
  37.         $filters $event->getFilters();
  38.         $request $event->getRequest();
  39.         $ids array_filter(explode('|'$request->query->get('tutor''')));
  40.         $filter = new Filter(
  41.             'tutor',
  42.             !empty($ids),
  43.             [$this->getTutorEntityAggregation()],
  44.             new EqualsAnyFilter('product.studygoodCourses.tutor.id'$ids),
  45.             $ids
  46.         );
  47.         $filters->add($filter);
  48.     }
  49.     private function getTutorEntityAggregation(): EntityAggregation
  50.     {
  51.         return new EntityAggregation('tutor''product.studygoodCourses.tutor.id'TutorDefinition::ENTITY_NAME);
  52.     }
  53.     public function onSearch(EntitySearchedEvent $event): void
  54.     {
  55.         /*$entityDefinition = $event->getDefinition();
  56.         if ($entityDefinition->getEntityName() === 'product') {
  57.             $criteria = $event->getCriteria();
  58.             $criteria->addAssociation('studygoodProductMeta');
  59.             $criteria->addAssociation('studygoodCourses');
  60.         }*/
  61.     }
  62.     public function onProductPageLoaded(ProductPageLoadedEvent $event): void
  63.     {
  64.     }
  65.     public function addProductPageCriteria($event): void
  66.     {
  67.         $criteria $event->getCriteria();
  68.         //$criteria->addAssociation('studygoodProductMeta');
  69.         $criteria->addAssociation('studygoodEsd');
  70.         $criteria->addAssociation('studygoodCourses.chapters.lessons.sgMedia');
  71.         $criteria->addAssociation('studygoodCourses.tutor.media');
  72.         $criteria->addAssociation('studygoodCourses.ratings');
  73.         $esdCriteria $criteria->getAssociation('studygoodEsd');
  74.         $esdCriteria->addFilter(new EqualsFilter('active'true));
  75.         $courseCriteria $criteria->getAssociation('studygoodCourses');
  76.         $courseCriteria->addFilter(new EqualsFilter('active'true));
  77.         $courseCriteria->addSorting(new FieldSorting('name'FieldSorting::ASCENDING));
  78.         $chapterCriteria $courseCriteria->getAssociation('chapters');
  79.         $chapterCriteria->addSorting(new FieldSorting('position'FieldSorting::ASCENDING));
  80.         $chapterCriteria->addSorting(new FieldSorting('name'FieldSorting::ASCENDING));
  81.         $lessonCriteria $chapterCriteria->getAssociation('lessons');
  82.         $lessonCriteria->addSorting(new FieldSorting('position'FieldSorting::ASCENDING));
  83.         $lessonCriteria->addSorting(new FieldSorting('name'FieldSorting::ASCENDING));
  84.     }
  85.     public function addVideoCourseCriteria(ProductListingCriteriaEvent $event): void
  86.     {
  87.     }
  88. }