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

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