custom/plugins/AcrisDiscountGroupCS/src/Storefront/Subscriber/DiscountGroupSubscriber.php line 53

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\DiscountGroup\Storefront\Subscriber;
  3. use Acris\DiscountGroup\Custom\DiscountGroupDefinition;
  4. use Acris\DiscountGroup\Custom\DiscountGroupEntity;
  5. use Shopware\Core\Content\Product\Aggregate\ProductPrice\ProductPriceEntity;
  6. use Shopware\Core\Content\Product\ProductEntity;
  7. use Shopware\Core\Content\Product\ProductEvents;
  8. use Shopware\Core\Content\Product\SalesChannel\Detail\CachedProductDetailRoute;
  9. use Shopware\Core\Framework\Adapter\Cache\CacheInvalidator;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntitySearchResultLoadedEvent;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Pricing\Price;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  16. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  17. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  18. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. class DiscountGroupSubscriber implements EventSubscriberInterface
  21. {
  22.     const DISCOUNT_GROUP_WRITTEN_EVENT 'acris_discount_group.written';
  23.     private EntityRepositoryInterface $discountGroupRepository;
  24.     private EntityRepositoryInterface $productRepository;
  25.     private EntityRepositoryInterface $productStreamMappingRepository;
  26.     private CacheInvalidator $logger;
  27.     public function __construct(
  28.         EntityRepositoryInterface $discountGroupRepositoryEntityRepositoryInterface $productRepositoryEntityRepositoryInterface $productStreamMappingRepositoryCacheInvalidator $logger
  29.     ) {
  30.         $this->discountGroupRepository $discountGroupRepository;
  31.         $this->productRepository $productRepository;
  32.         $this->productStreamMappingRepository $productStreamMappingRepository;
  33.         $this->logger $logger;
  34.     }
  35.     public static function getSubscribedEvents(): array
  36.     {
  37.         return [
  38.             self::DISCOUNT_GROUP_WRITTEN_EVENT => 'onDiscountGroupWritten',
  39.             ProductEvents::PRODUCT_LOADED_EVENT => 'onProductLoaded'
  40.         ];
  41.     }
  42.     public function onProductLoaded(EntityLoadedEvent $event): void
  43.     {
  44.     }
  45.     public function onDiscountGroupWritten(EntityWrittenEvent $event)
  46.     {
  47.         $results $event->getWriteResults();
  48.         foreach ($results as $result) {
  49.             $payload $result->getPayload();
  50.             $productIds = [];
  51.             if (!empty($payload) && array_key_exists('id'$payload) && !empty($payload['id'])) {
  52.                 $discountGroupId $payload['id'];
  53.                 /** @var DiscountGroupEntity $discountGroup */
  54.                 $discountGroup $this->discountGroupRepository->search((new Criteria([$discountGroupId]))->addAssociation('productStreams'), $event->getContext())->first();
  55.                 if (empty($discountGroup)) continue;
  56.                 switch ($discountGroup->getProductAssignmentType()) {
  57.                     case DiscountGroupDefinition::PRODUCT_ASSIGNMENT_TYPE_MATERIAL_GROUP:
  58.                         if (!empty($discountGroup->getMaterialGroup())) {
  59.                             $productResults $this->productRepository->searchIds((new Criteria())->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  60.                                 new EqualsFilter('customFields.acris_discount_group_value'$discountGroup->getMaterialGroup()),
  61.                                 new EqualsFilter('customFields.acris_discount_group_product_value'$discountGroup->getMaterialGroup())
  62.                             ])), $event->getContext());
  63.                             if ($productResults->getTotal() > && $productResults->firstId()) $productIds array_unique(array_merge($productIds$productResults->getIds()));
  64.                         }
  65.                         break;
  66.                     case DiscountGroupDefinition::PRODUCT_ASSIGNMENT_TYPE_PRODUCT:
  67.                         if (!empty($discountGroup->getProductId())) {
  68.                             $productResults $this->productRepository->searchIds((new Criteria([$discountGroup->getProductId()])), $event->getContext());
  69.                             if ($productResults->getTotal() > && $productResults->firstId()) $productIds[] = $productResults->firstId();
  70.                         }
  71.                         break;
  72.                     default:
  73.                         if (!empty($discountGroup->getProductStreams()) && $discountGroup->getProductStreams()->count() > 0) {
  74.                             $productCustomIds = [];
  75.                             foreach ($discountGroup->getProductStreams()->getElements() as $productStream) {
  76.                                 $productStreamResults $this->productStreamMappingRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('productStreamId'$productStream->getId())), $event->getContext());
  77.                                 if ($productStreamResults->getTotal() > && $productStreamResults->getIds()) {
  78.                                     foreach ($productStreamResults->getIds() as $productStreamSearch) {
  79.                                         if (array_key_exists('productId'$productStreamSearch) && !empty($productStreamSearch['productId']) && !in_array($productStreamSearch['productId'], $productCustomIds)) {
  80.                                             $productCustomIds[] = $productStreamSearch['productId'];
  81.                                         }
  82.                                     }
  83.                                     if (!empty($productCustomIds)) {
  84.                                         $productResults $this->productRepository->searchIds((new Criteria())->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  85.                                             new EqualsAnyFilter('id'$productCustomIds),
  86.                                             new EqualsAnyFilter('parentId'$productCustomIds)
  87.                                         ])), $event->getContext());
  88.                                         if ($productResults->getTotal() > && $productResults->firstId()) {
  89.                                             $productIds array_unique(array_merge($productIds$productResults->getIds()));
  90.                                         }
  91.                                     }
  92.                                 }
  93.                             }
  94.                         }
  95.                 }
  96.                 if (!empty($productIds)) {
  97.                     $this->logger->invalidate(
  98.                         array_map([CachedProductDetailRoute::class, 'buildName'], $productIds)
  99.                     );
  100.                 }
  101.             }
  102.         }
  103.     }
  104. }