<?php declare(strict_types=1);
namespace ShopStudio\PixelYourShop\EventSubscriber;
use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
use Shopware\Core\Content\Product\Events\ProductSearchCriteriaEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* @since 2.0.0
*/
class ProductCriteriaEventSubscriber implements EventSubscriberInterface
{
/**
* @since 2.0.0
*
* @inheritDoc
*/
public static function getSubscribedEvents(): array
{
return [
ProductListingCriteriaEvent::class => 'onProductListingCriteria',
ProductSearchCriteriaEvent::class => 'onProductSearchCriteria',
ProductPageCriteriaEvent::class => 'onProductPageCriteria',
];
}
/**
* @since 2.0.0
*
* @throws InconsistentCriteriaIdsException
*/
public function onProductListingCriteria(ProductListingCriteriaEvent $event): void
{
$criteria = $event->getCriteria();
$this->extendCriteria($criteria);
}
/**
* @since 2.0.0
*
* @throws InconsistentCriteriaIdsException
*/
public function onProductSearchCriteria(ProductSearchCriteriaEvent $event): void
{
$criteria = $event->getCriteria();
$this->extendCriteria($criteria);
}
/**
* @since 2.0.0
*
* @throws InconsistentCriteriaIdsException
*/
public function onProductPageCriteria(ProductPageCriteriaEvent $event): void
{
$criteria = $event->getCriteria();
$this->extendCriteria($criteria);
}
/**
* @since 2.0.0
*/
private function extendCriteria(Criteria $criteria): void
{
if (!$criteria->hasAssociation('options')) {
$criteria->addAssociation('options');
}
if (!$criteria->hasAssociation('categories')) {
$criteria->addAssociation('categories');
}
if (!$criteria->hasAssociation('mainCategories')) {
$criteria->addAssociation('mainCategories');
}
if (!$criteria->hasAssociation('mainCategories.category')) {
$criteria->addAssociation('mainCategories.category');
}
if (!$criteria->hasAssociation('manufacturer')) {
$criteria->addAssociation('manufacturer');
}
}
}