<?php declare(strict_types=1);
namespace Okeonline\CustomizedProductsCombinationDisabler\Storefront\Page\Product;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\Product\ProductLoaderCriteriaEvent;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductLoaderCriteriaEventSubscriber implements EventSubscriberInterface
{
/**
* @var ProductPageLoadedEvent
*/
private $event;
/**
* @var EntityRepository
*/
private $productRepository;
/**
* @var EntityRepository
*/
private $propertyGroupRepository;
/**
* @var EntityRepository
*/
private $propertyGroupOptionRepository;
/**
* @var SystemConfigService
*/
private $systemConfigService;
public function __construct(
EntityRepository $productRepository,
EntityRepository $propertyGroupRepository,
EntityRepository $propertyGroupOptionRepository,
SystemConfigService $systemConfigService
)
{
$this->productRepository = $productRepository;
$this->propertyGroupRepository = $propertyGroupRepository;
$this->propertyGroupOptionRepository = $propertyGroupOptionRepository;
$this->systemConfigService = $systemConfigService;
}
public static function getSubscribedEvents(): array
{
return [
'Shopware\Storefront\Page\Product\ProductPageLoadedEvent' => ['addExcludedCustomizedProductsCombinationsToPage', 0]
];
}
public function addExcludedCustomizedProductsCombinationsToPage(ProductPageLoadedEvent $event): void
{
$page = $event->getPage();
$context = $event->getContext();
$productId = $page->getProduct()->getId();
$context->setConsiderInheritance(true);
$context->setConsiderInheritance(true);
$criteria = new Criteria([$productId]);
$criteria->addAssociation('swagCustomizedProductsTemplate.exclusions.translated');
$criteria->addAssociation('swagCustomizedProductsTemplate.exclusions.conditions.templateOption.translated');
$criteria->addAssociation('swagCustomizedProductsTemplate.exclusions.conditions.templateExclusionOperator.translated');
$criteria->setLimit(1);
$product = $this->productRepository->search($criteria, $context)->first();
$swagProductTemplate = $product->getExtensions()['swagCustomizedProductsTemplate'];
if(!$swagProductTemplate) return;
$productExclusions = $swagProductTemplate->getExclusions();
$page->addExtension('customizedProductExclusions', $productExclusions);
}
}