custom/plugins/KmPitchPrint/src/Subscribers/LineItemSubscriber.php line 238

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace KmPitchPrint\Subscribers;
  3. use Shopware\Core\Checkout\Cart\Event\AfterLineItemAddedEvent;
  4. use Shopware\Core\Checkout\Cart\Event\AfterLineItemRemovedEvent;
  5. use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
  6. use Shopware\Core\Content\Product\Events\ProductGatewayCriteriaEvent;
  7. use Shopware\Core\Defaults;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  9. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  10. use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
  11. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  12. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  13. use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
  14. use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoadedEvent;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  17. use Symfony\Component\HttpFoundation\RequestStack;
  18. use KmPitchPrint\Services\ProductPitchPrintService;
  19. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  20. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  21. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  22. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  23. use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
  24. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  25. class LineItemSubscriber implements EventSubscriberInterface
  26. {
  27.     /**
  28.      * @var $requestStrack RequestStack
  29.      */
  30.     private $requestStrack;
  31.     /**
  32.      * @var $pitchPrintRepository SalesChannelRepositoryInterface
  33.      */
  34.     private $pitchPrintRepository;
  35.     /**
  36.      * @var $productPitchPrintService ProductPitchPrintService
  37.      */
  38.     private $productPitchPrintService;
  39.     /**
  40.      * @var CartPersisterInterface
  41.      */
  42.     private $cartPersister;
  43.     /**
  44.      * @var $productRepository EntityRepositoryInterface
  45.      */
  46.     private $productRepository;
  47.     public function __construct(
  48.         EntityRepositoryInterface $pitchPrintRepository,
  49.         ProductPitchPrintService  $productPitchPrintService,
  50.         EntityRepositoryInterface $productRepository
  51. #        CartPersisterInterface    $cartPersister,
  52. #        RequestStack              $requestStack
  53.     )
  54.     {
  55.         $this->pitchPrintRepository $pitchPrintRepository;
  56.         $this->productPitchPrintService $productPitchPrintService;
  57.         $this->productRepository $productRepository;
  58. #        $this->requestStrack = $requestStack;
  59. #        $this->cartPersister = $cartPersister;
  60.     }
  61.     public static function getSubscribedEvents(): array
  62.     {
  63.         return [
  64.             //AfterLineItemAddedEvent::class => 'afterLineItemAdded',
  65.             BeforeLineItemAddedEvent::class => 'beforeLineItemAdded',
  66.             ProductGatewayCriteriaEvent::class => 'productGatewayCriteria',
  67.             CheckoutConfirmPageLoadedEvent::class => 'cartAddProducts',
  68.             CheckoutCartPageLoadedEvent::class => 'cartAddProducts',
  69.             CheckoutFinishPageLoadedEvent::class => [['loadPitchPrintMedia'], ['cartAddProducts']],
  70.             OffcanvasCartPageLoadedEvent::class => 'cartAddProducts',
  71.             //CheckoutRegisterPageLoadedEvent::class=>'cartAddProducts'
  72.             //AfterLineItemRemovedEvent::class=>'afterLineItemRemoved'
  73.         ];
  74.     }
  75.     /**
  76.      * @param CheckoutFinishPageLoadedEvent $event
  77.      * @return void
  78.      */
  79.     public function loadPitchPrintMedia(CheckoutFinishPageLoadedEvent $event): void
  80.     {
  81.         /**/
  82.         $lineItems $event->getPage()->getOrder()->getLineItems();
  83.         foreach ($lineItems as $lineItem) {
  84.             if (isset($lineItem->getPayload()['features']['pitch_print'])) {
  85.                 $lineItem->getCover()->setUrl(
  86.                     $lineItem->getPayload()['features']['pitch_print']['previews'][0]
  87.                 );
  88.             }
  89.         }
  90.     }
  91.     /**
  92.      * @param AfterLineItemRemovedEvent $event
  93.      * @return void
  94.      */
  95.     public function afterLineItemRemoved(AfterLineItemRemovedEvent $event)
  96.     {
  97.         //TODO
  98.         $lineItems $event->getLineItems();
  99.         $projectIds = [];
  100.         foreach ($lineItems as $lineItem) {
  101.             $projectIds[]['id'] = $lineItem->getId();
  102.         }
  103.         $this->pitchPrintRepository->delete([
  104.             $projectIds
  105.         ], $event->getContext());
  106.     }
  107.     /**
  108.      * @param mixed $event
  109.      * @return void asd
  110.      */
  111.     public function cartAddProducts($event)
  112.     {
  113.         #return;
  114.         $page $event->getPage();
  115.         /*if($event instanceof CheckoutConfirmPageLoadedEvent){
  116.             $page->getPaymentMethods()->sort(
  117.                 function (PaymentMethodEntity $a, PaymentMethodEntity $b){
  118.                     return $a->getPosition() > $b->getPosition();
  119.                 }
  120.             );
  121.         }*/
  122.         if ($event instanceof CheckoutFinishPageLoadedEvent) {
  123.             $object $page->getOrder();
  124.             $object->getLineItems()->sort(function (OrderLineItemEntity $aOrderLineItemEntity $b) {
  125.                 if (isset($a->getPayload()['lineItemCreatedAt']) && isset($b->getPayload()['lineItemCreatedAt']))
  126.                     return $a->getPayload()['lineItemCreatedAt'] > $b->getPayload()['lineItemCreatedAt'];
  127.             });
  128.         } else {
  129.             $object $page->getCart();
  130.             $object->getLineItems()->sort(function (LineItem $aLineItem $b) {
  131.                 if (isset($a->getPayload()['lineItemCreatedAt']) && isset($b->getPayload()['lineItemCreatedAt']))
  132.                     return $a->getPayload()['lineItemCreatedAt'] > $b->getPayload()['lineItemCreatedAt'];
  133.             });
  134.         }
  135.         $productIds = [];
  136.         foreach ($object->getLineItems() as $lineItem) {
  137.             if ($lineItem->getType() == LineItem::PROMOTION_LINE_ITEM_TYPE)
  138.                 continue;
  139.             $productId $lineItem->getReferencedId();
  140.             $sWoptions $this->productPitchPrintService->getProductOptions($productId$event->getSalesChannelContext());
  141.             if (count($sWoptions) > 0) {
  142.                 if ($event instanceof CheckoutFinishPageLoadedEvent) {
  143.                     $payload $lineItem->getPayload();
  144.                     $payload['swp_options'] = $sWoptions;
  145.                     $lineItem->setPayload($payload);
  146.                 } else {
  147.                     $lineItem->setPayloadValue('swp_options'$sWoptions);
  148.                 }
  149.             }
  150.             $productIds[] = $productId;
  151.         }
  152.         $criteria = new Criteria();
  153.         $criteria->addFilter(new EqualsAnyFilter('id'$productIds));
  154.         $criteria->addAssociation('media');
  155.         $criteria->getAssociation('media')->addSorting(new FieldSorting('position'));
  156.         $criteria->addAssociation('options.productConfiguratorSettings.media');
  157.         $productCollection $this->productRepository->search($criteria$event->getContext());
  158.         $products = [];
  159.         foreach ($productCollection as $product) {
  160.             $products[$product->getId()] = $product;
  161.             if ($event instanceof CheckoutFinishPageLoadedEvent) {
  162.                 foreach ($object->getLineItems() as $lineItem) {
  163.                     if ($lineItem->getReferencedId() == $product->getId()) {
  164.                         $payload $lineItem->getPayload();
  165.                         $payload['productTranslated'] = $product->getTranslated();
  166.                         $lineItem->setPayload($payload);
  167.                     }
  168.                 }
  169.             } else {
  170.                 $object->getLineItems()->filter(function (LineItem $lineItem) use ($product) {
  171.                     if ($lineItem->getReferencedId() == $product->getId()) {
  172.                         $lineItem->setPayloadValue('productTranslated'$product->getTranslated());
  173.                     }
  174.                 });
  175.             }
  176.             $products[$product->getId()] = $product;
  177.         }
  178.         $page->assign(['products' => $products]);
  179.     }
  180.     /**
  181.      * @param ProductGatewayCriteriaEvent $event
  182.      * @return mixed
  183.      */
  184.     public function productGatewayCriteria(ProductGatewayCriteriaEvent $event)
  185.     {
  186.         $event->getCriteria()->addAssociation('options.media');
  187.     }
  188.     /**
  189.      * @param BeforeLineItemAddedEvent $event
  190.      * @return mixed
  191.      */
  192.     public function beforeLineItemAdded(BeforeLineItemAddedEvent $event)
  193.     {
  194.         $event->getLineItem()->setPayloadValue('lineItemCreatedAt', (new \DateTimeImmutable())->format(Defaults::STORAGE_DATE_TIME_FORMAT));
  195.         if ($event->getLineItem()->getType() == LineItem::PROMOTION_LINE_ITEM_TYPE) return;
  196.         $lineItem $event->getLineItem();
  197.         $criteria = new Criteria();
  198.         $criteria->addFilter(new EqualsFilter('id'$lineItem->getReferencedId()));
  199.         $criteria->addAssociation('media');
  200.         $productResult $this->productRepository->search($criteria$event->getContext());
  201.         $product $productResult->first();
  202.         if ($product) {
  203.             if ($product->getCover()) {
  204.                 //replace the PitchPrint-Preview with $product - Media
  205.                 if (isset($lineItem->getPayload()['features']['pitch_print'])) {
  206.                     $previews $lineItem->getPayload()['features']['pitch_print']['previews'];
  207.                     if (!is_array($product->getCover()->getMedia())) {
  208.                         $mediaCollection = [$product->getCover()->getMedia()];
  209.                     } else {
  210.                         $mediaCollection $product->getCover()->getMedia();
  211.                     }
  212.                     $i 0;
  213.                     foreach ($mediaCollection as $mediaEntity) {
  214.                         //replace only previews, if the mediaItems are > 1, skip the rest
  215.                         if (isset($previews[$i])) {
  216.                             $samplePreview $previews[$i];
  217.                         } else {
  218.                             break;
  219.                         }
  220.                         foreach ($mediaEntity->getThumbnails() as $thumbnail) {
  221.                             $thumbnail->setUrl($samplePreview);
  222.                         }
  223.                         $mediaEntity->setUrl($samplePreview);
  224.                         $i++;
  225.                     }
  226.                 }
  227.                 $lineItem->setCover($product->getCover()->getMedia());
  228.             }
  229.         }
  230.     }
  231.     /**
  232.      * @param AfterLineItemAddedEvent $event
  233.      * @return mixed
  234.      */
  235.     public function afterLineItemAdded(afterLineItemAdded $event)
  236.     {
  237.         /*
  238.                $event->getCart()->getLineItems()->first()->setLabel('Super Trooper');
  239.             /*
  240.                $cart = $event->getCart();
  241.                foreach($cart->getLineItems() as $lineItem){
  242.                    $lineItem->setLabel('Super Trooper');
  243.                }
  244.                $this->cartPersister->save($event->getCart(), $event->getContext());
  245.                */
  246.     }
  247. }