<?php
declare(strict_types=1);
namespace System4Configurator\Subscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Content\Product\ProductEvents;
use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
use Shopware\Core\Content\Product\Events\ProductSearchCriteriaEvent;
use Shopware\Core\Content\Product\Events\ProductSuggestCriteriaEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
use Shopware\Core\Content\Product\Events\ProductCrossSellingIdsCriteriaEvent;
use Shopware\Core\Content\Product\Events\ProductCrossSellingStreamCriteriaEvent;
use Symfony\Component\HttpFoundation\Session\Session;
class ProductSubscriber implements EventSubscriberInterface
{
private $session;
private $sessionId;
public function __construct(
Session $session
) {
$this->session = $session;
$this->sessionId = $this->session->get("productAddSessionId");
}
public static function getSubscribedEvents(): array
{
return [
ProductListingCriteriaEvent::class => 'onProductListingCriteria',
ProductSearchCriteriaEvent::class => 'onProductListingCriteria',
ProductPageCriteriaEvent::class => 'onProductCriteriaLoaded',
ProductEvents::PRODUCT_SUGGEST_CRITERIA => 'productSuggestCriteria',
ProductCrossSellingStreamCriteriaEvent::class => 'crossSellingProductStreamCriteria',
ProductCrossSellingIdsCriteriaEvent::class => 'crossSellingProductListCriteria'
];
}
public function onProductListingCriteria(ProductListingCriteriaEvent $event)
{
$this->criteria($event);
}
public function onProductCriteriaLoaded(ProductPageCriteriaEvent $event): void
{
$this->criteria($event);
}
public function crossSellingProductListCriteria(ProductCrossSellingIdsCriteriaEvent $event)
{
$this->criteria($event);
}
public function crossSellingProductStreamCriteria(ProductCrossSellingStreamCriteriaEvent $event)
{
$this->criteria($event);
}
public function productSuggestCriteria(ProductSuggestCriteriaEvent $event)
{
$this->criteria($event);
}
public function getCustomerNumber($event)
{
$customer = $event->getSalesChannelContext()->getCustomer();
$customerNumber = $customer ? $customer->customerNumber : "";
$customerNumber = trim($customerNumber);
return $customerNumber;
}
public function criteria($event): void
{
$customerNumber = $this->getCustomerNumber($event);
if(!$customerNumber && !$this->sessionId) {
$event->getCriteria()->addFilter(
new MultiFilter(
MultiFilter::CONNECTION_AND,
[
new EqualsFilter('customFields.system4_configurator_customer_number', null),
new EqualsFilter('customFields.system4_configurator_session_id', null)
]
)
);
}
if($customerNumber && !$this->sessionId) {
$event->getCriteria()->addFilter(
new MultiFilter(
MultiFilter::CONNECTION_OR,
[
new MultiFilter(
MultiFilter::CONNECTION_AND,
[
new EqualsFilter('customFields.system4_configurator_session_id', null),
new EqualsFilter('customFields.system4_configurator_customer_number', null)
]
),
new EqualsFilter('customFields.system4_configurator_customer_number', $customerNumber)
]
)
);
}
if(!$customerNumber && $this->sessionId) {
$event->getCriteria()->addFilter(
new MultiFilter(
MultiFilter::CONNECTION_OR,
[
new MultiFilter(
MultiFilter::CONNECTION_AND,
[
new EqualsFilter('customFields.system4_configurator_customer_number', null),
new EqualsFilter('customFields.system4_configurator_session_id', null)
]
),
new MultiFilter(
MultiFilter::CONNECTION_AND,
[
new EqualsFilter('customFields.system4_configurator_customer_number', null),
new EqualsFilter('customFields.system4_configurator_session_id', $this->sessionId)
]
),
]
)
);
}
}
}