<?php
namespace Appflix\Studygood\Storefront\Subscriber;
use Appflix\Studygood\Core\Content\Tutor\TutorDefinition;
use Appflix\Studygood\Core\Service\VideoCourseService;
use Shopware\Core\Content\Product\Events\ProductListingCollectFilterEvent;
use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
use Shopware\Core\Content\Product\SalesChannel\Listing\Filter;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntitySearchedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Aggregation\Metric\EntityAggregation;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductCriteriaSubscriber implements EventSubscriberInterface
{
private VideoCourseService $videoCourseService;
public function __construct(
VideoCourseService $videoCourseService
)
{
$this->videoCourseService = $videoCourseService;
}
public static function getSubscribedEvents(): array
{
return [
ProductListingCriteriaEvent::class => 'addProductPageCriteria',
ProductPageCriteriaEvent::class => 'addProductPageCriteria',
ProductPageLoadedEvent::class => 'onProductPageLoaded',
EntitySearchedEvent::class => 'onSearch',
ProductListingCollectFilterEvent::class => 'onProductListingCollectFilter'
];
}
public function onProductListingCollectFilter(ProductListingCollectFilterEvent $event): void
{
$filters = $event->getFilters();
$request = $event->getRequest();
$ids = array_filter(explode('|', $request->query->get('tutor', '')));
$filter = new Filter(
'tutor',
!empty($ids),
[$this->getTutorEntityAggregation()],
new EqualsAnyFilter('product.studygoodCourses.tutor.id', $ids),
$ids
);
$filters->add($filter);
}
private function getTutorEntityAggregation(): EntityAggregation
{
return new EntityAggregation('tutor', 'product.studygoodCourses.tutor.id', TutorDefinition::ENTITY_NAME);
}
public function onSearch(EntitySearchedEvent $event): void
{
/*$entityDefinition = $event->getDefinition();
if ($entityDefinition->getEntityName() === 'product') {
$criteria = $event->getCriteria();
$criteria->addAssociation('studygoodProductMeta');
$criteria->addAssociation('studygoodCourses');
}*/
}
public function onProductPageLoaded(ProductPageLoadedEvent $event): void
{
}
public function addProductPageCriteria($event): void
{
$criteria = $event->getCriteria();
//$criteria->addAssociation('studygoodProductMeta');
$criteria->addAssociation('studygoodEsd');
$criteria->addAssociation('studygoodCourses.chapters.lessons.sgMedia');
$criteria->addAssociation('studygoodCourses.tutor.media');
$criteria->addAssociation('studygoodCourses.ratings');
$esdCriteria = $criteria->getAssociation('studygoodEsd');
$esdCriteria->addFilter(new EqualsFilter('active', true));
$courseCriteria = $criteria->getAssociation('studygoodCourses');
$courseCriteria->addFilter(new EqualsFilter('active', true));
$courseCriteria->addSorting(new FieldSorting('name', FieldSorting::ASCENDING));
$chapterCriteria = $courseCriteria->getAssociation('chapters');
$chapterCriteria->addSorting(new FieldSorting('position', FieldSorting::ASCENDING));
$chapterCriteria->addSorting(new FieldSorting('name', FieldSorting::ASCENDING));
$lessonCriteria = $chapterCriteria->getAssociation('lessons');
$lessonCriteria->addSorting(new FieldSorting('position', FieldSorting::ASCENDING));
$lessonCriteria->addSorting(new FieldSorting('name', FieldSorting::ASCENDING));
}
public function addVideoCourseCriteria(ProductListingCriteriaEvent $event): void
{
}
}