custom/plugins/System4Configurator/src/Subscriber/ProductSubscriber.php line 53

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace System4Configurator\Subscriber;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  6. use Shopware\Core\Content\Product\ProductEvents;
  7. use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
  8. use Shopware\Core\Content\Product\Events\ProductSearchCriteriaEvent;
  9. use Shopware\Core\Content\Product\Events\ProductSuggestCriteriaEvent;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  11. use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
  12. use Shopware\Core\Content\Product\Events\ProductCrossSellingIdsCriteriaEvent;
  13. use Shopware\Core\Content\Product\Events\ProductCrossSellingStreamCriteriaEvent;
  14. use Symfony\Component\HttpFoundation\Session\Session;
  15. class ProductSubscriber implements EventSubscriberInterface
  16. {
  17.     private $session;
  18.     private $sessionId;
  19.     public function __construct(
  20.         Session $session
  21.     ) {
  22.         $this->session $session;
  23.         $this->sessionId $this->session->get("productAddSessionId");
  24.     }
  25.     public static function getSubscribedEvents(): array
  26.     {
  27.         return [
  28.             ProductListingCriteriaEvent::class => 'onProductListingCriteria',
  29.             ProductSearchCriteriaEvent::class => 'onProductListingCriteria',
  30.             ProductPageCriteriaEvent::class => 'onProductCriteriaLoaded',
  31.             ProductEvents::PRODUCT_SUGGEST_CRITERIA => 'productSuggestCriteria',
  32.             ProductCrossSellingStreamCriteriaEvent::class => 'crossSellingProductStreamCriteria',
  33.             ProductCrossSellingIdsCriteriaEvent::class => 'crossSellingProductListCriteria'
  34.         ];
  35.     }
  36.     public function onProductListingCriteria(ProductListingCriteriaEvent $event)
  37.     {
  38.         $this->criteria($event);
  39.     }
  40.     public function onProductCriteriaLoaded(ProductPageCriteriaEvent $event): void
  41.     {
  42.         $this->criteria($event);
  43.     }
  44.     public function crossSellingProductListCriteria(ProductCrossSellingIdsCriteriaEvent $event)
  45.     {
  46.         $this->criteria($event);
  47.     }
  48.     public function crossSellingProductStreamCriteria(ProductCrossSellingStreamCriteriaEvent $event)
  49.     {
  50.         $this->criteria($event);
  51.     }
  52.     public function productSuggestCriteria(ProductSuggestCriteriaEvent $event)
  53.     {
  54.         $this->criteria($event);
  55.     }
  56.     public function getCustomerNumber($event)
  57.     {
  58.         $customer $event->getSalesChannelContext()->getCustomer();
  59.         $customerNumber $customer $customer->customerNumber "";
  60.         $customerNumber trim($customerNumber);
  61.         return $customerNumber;
  62.     }
  63.     public function criteria($event): void
  64.     {
  65.         $customerNumber $this->getCustomerNumber($event);
  66.         if(!$customerNumber && !$this->sessionId) {
  67.             $event->getCriteria()->addFilter(
  68.                 new MultiFilter(
  69.                     MultiFilter::CONNECTION_AND,
  70.                     [
  71.                         new EqualsFilter('customFields.system4_configurator_customer_number'null),
  72.                         new EqualsFilter('customFields.system4_configurator_session_id'null)
  73.                     ]
  74.                 )
  75.             );
  76.         }
  77.         if($customerNumber && !$this->sessionId) {
  78.             $event->getCriteria()->addFilter(
  79.                 new MultiFilter(
  80.                     MultiFilter::CONNECTION_OR,
  81.                     [
  82.                         new MultiFilter(
  83.                             MultiFilter::CONNECTION_AND,
  84.                             [
  85.                             new EqualsFilter('customFields.system4_configurator_session_id'null),
  86.                             new EqualsFilter('customFields.system4_configurator_customer_number'null)
  87.                         ]
  88.                         ),
  89.                         new EqualsFilter('customFields.system4_configurator_customer_number'$customerNumber)
  90.                     ]
  91.                 )
  92.             );
  93.         }
  94.         if(!$customerNumber && $this->sessionId) {
  95.             $event->getCriteria()->addFilter(
  96.                 new MultiFilter(
  97.                     MultiFilter::CONNECTION_OR,
  98.                     [
  99.                         new MultiFilter(
  100.                             MultiFilter::CONNECTION_AND,
  101.                             [
  102.                                 new EqualsFilter('customFields.system4_configurator_customer_number'null),
  103.                                 new EqualsFilter('customFields.system4_configurator_session_id'null)
  104.                         ]
  105.                         ),
  106.                         new MultiFilter(
  107.                             MultiFilter::CONNECTION_AND,
  108.                             [
  109.                                 new EqualsFilter('customFields.system4_configurator_customer_number'null),
  110.                                 new EqualsFilter('customFields.system4_configurator_session_id'$this->sessionId)
  111.                         ]
  112.                         ),
  113.                     ]
  114.                 )
  115.             );
  116.         }
  117.     }
  118. }