vendor/store.shopware.com/dreiscset/src/Subscriber/Events/BeforeLineItemAddedEventSubscriber.php line 48

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace DreiscSet\Subscriber\Events;
  3. use DreiscSet\Core\Content\DreiscSetProductExtension\DreiscSetProductExtensionEntity;
  4. use DreiscSet\Core\Content\Product\SalesChannelProductRepository;
  5. use DreiscSet\Core\Set\AbstractSetLoaderService;
  6. use DreiscSet\Core\Set\SetLoaderService;
  7. use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
  8. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  9. use Shopware\Core\Content\Product\Cart\ProductNotFoundError;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. class BeforeLineItemAddedEventSubscriber implements EventSubscriberInterface
  13. {
  14.     /**
  15.      * @var SalesChannelProductRepository
  16.      */
  17.     protected $salesChannelProductRepository;
  18.     /**
  19.      * @var AbstractSetLoaderService
  20.      */
  21.     protected $setLoaderService;
  22.     /**
  23.      * @param SalesChannelProductRepository $salesChannelProductRepository
  24.      * @param AbstractSetLoaderService $setLoaderService
  25.      */
  26.     public function __construct(SalesChannelProductRepository $salesChannelProductRepositoryAbstractSetLoaderService $setLoaderService)
  27.     {
  28.         $this->salesChannelProductRepository $salesChannelProductRepository;
  29.         $this->setLoaderService $setLoaderService;
  30.     }
  31.     public static function getSubscribedEvents(): array
  32.     {
  33.         return [
  34.             BeforeLineItemAddedEvent::class => 'onBeforeLineItemAddedEvent'
  35.         ];
  36.     }
  37.     /**
  38.      * @param BeforeLineItemAddedEvent $beforeLineItemAddedEvent
  39.      * @return void
  40.      */
  41.     public function onBeforeLineItemAddedEvent(BeforeLineItemAddedEvent $beforeLineItemAddedEvent): void
  42.     {
  43.         $lineItem $beforeLineItemAddedEvent->getLineItem();
  44.         /** Abort, if it's not type product */
  45.         if (LineItem::PRODUCT_LINE_ITEM_TYPE !== $lineItem->getType()) {
  46.             return;
  47.         }
  48.         /** Load extended product data to check whether it is a set item that can only be purchased as a set. */
  49.         $productId $lineItem->getReferencedId();
  50.         $salesChannelContext $beforeLineItemAddedEvent->getSalesChannelContext();
  51.         $criteria = new Criteria();
  52.         $salesChannelProductEntity $this->salesChannelProductRepository->get(
  53.             $productId,
  54.             $criteria,
  55.             $salesChannelContext
  56.         );
  57.         /** Abort, if the entity is null */
  58.         if (null === $salesChannelProductEntity) {
  59.             return;
  60.         }
  61.         /** Fetch the product extension dreiscSetProductExtension */
  62.         /** @var DreiscSetProductExtensionEntity $dreiscSetProductExtension */
  63.         $dreiscSetProductExtension $salesChannelProductEntity->getExtension('dreiscSetProductExtension');
  64.         /** Abort, if no dreisc set id is set for this product */
  65.         if (null === $dreiscSetProductExtension || null === $dreiscSetProductExtension->getDreiscSetId()) {
  66.             return;
  67.         }
  68.         $dreiscSetEntity $this->setLoaderService->getDreiscSetEntity($dreiscSetProductExtension->getDreiscSetId(), $salesChannelContext);
  69.         if ($dreiscSetEntity->getProductSetOnly()) {
  70.             /** This product can only be purchased as a set, so we stop the adding process at this point */
  71.             $beforeLineItemAddedEvent->getCart()->remove($lineItem->getId());
  72.             $beforeLineItemAddedEvent->getCart()->getErrors()->add(new ProductNotFoundError($productId));
  73.         }
  74.     }
  75. }