<?php declare(strict_types=1);
namespace KmPitchPrint\Subscribers;
use Shopware\Core\Checkout\Cart\Event\AfterLineItemAddedEvent;
use Shopware\Core\Checkout\Cart\Event\AfterLineItemRemovedEvent;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
use Shopware\Core\Content\Product\Events\ProductGatewayCriteriaEvent;
use Shopware\Core\Defaults;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use KmPitchPrint\Services\ProductPitchPrintService;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Core\Checkout\Cart\LineItem\LineItem;
use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
class LineItemSubscriber implements EventSubscriberInterface
{
/**
* @var $requestStrack RequestStack
*/
private $requestStrack;
/**
* @var $pitchPrintRepository SalesChannelRepositoryInterface
*/
private $pitchPrintRepository;
/**
* @var $productPitchPrintService ProductPitchPrintService
*/
private $productPitchPrintService;
/**
* @var CartPersisterInterface
*/
private $cartPersister;
/**
* @var $productRepository EntityRepositoryInterface
*/
private $productRepository;
public function __construct(
EntityRepositoryInterface $pitchPrintRepository,
ProductPitchPrintService $productPitchPrintService,
EntityRepositoryInterface $productRepository
# CartPersisterInterface $cartPersister,
# RequestStack $requestStack
)
{
$this->pitchPrintRepository = $pitchPrintRepository;
$this->productPitchPrintService = $productPitchPrintService;
$this->productRepository = $productRepository;
# $this->requestStrack = $requestStack;
# $this->cartPersister = $cartPersister;
}
public static function getSubscribedEvents(): array
{
return [
//AfterLineItemAddedEvent::class => 'afterLineItemAdded',
BeforeLineItemAddedEvent::class => 'beforeLineItemAdded',
ProductGatewayCriteriaEvent::class => 'productGatewayCriteria',
CheckoutConfirmPageLoadedEvent::class => 'cartAddProducts',
CheckoutCartPageLoadedEvent::class => 'cartAddProducts',
CheckoutFinishPageLoadedEvent::class => [['loadPitchPrintMedia'], ['cartAddProducts']],
OffcanvasCartPageLoadedEvent::class => 'cartAddProducts',
//CheckoutRegisterPageLoadedEvent::class=>'cartAddProducts'
//AfterLineItemRemovedEvent::class=>'afterLineItemRemoved'
];
}
/**
* @param CheckoutFinishPageLoadedEvent $event
* @return void
*/
public function loadPitchPrintMedia(CheckoutFinishPageLoadedEvent $event): void
{
/**/
$lineItems = $event->getPage()->getOrder()->getLineItems();
foreach ($lineItems as $lineItem) {
if (isset($lineItem->getPayload()['features']['pitch_print'])) {
$lineItem->getCover()->setUrl(
$lineItem->getPayload()['features']['pitch_print']['previews'][0]
);
}
}
}
/**
* @param AfterLineItemRemovedEvent $event
* @return void
*/
public function afterLineItemRemoved(AfterLineItemRemovedEvent $event)
{
//TODO
$lineItems = $event->getLineItems();
$projectIds = [];
foreach ($lineItems as $lineItem) {
$projectIds[]['id'] = $lineItem->getId();
}
$this->pitchPrintRepository->delete([
$projectIds
], $event->getContext());
}
/**
* @param mixed $event
* @return void asd
*/
public function cartAddProducts($event)
{
#return;
$page = $event->getPage();
/*if($event instanceof CheckoutConfirmPageLoadedEvent){
$page->getPaymentMethods()->sort(
function (PaymentMethodEntity $a, PaymentMethodEntity $b){
return $a->getPosition() > $b->getPosition();
}
);
}*/
if ($event instanceof CheckoutFinishPageLoadedEvent) {
$object = $page->getOrder();
$object->getLineItems()->sort(function (OrderLineItemEntity $a, OrderLineItemEntity $b) {
if (isset($a->getPayload()['lineItemCreatedAt']) && isset($b->getPayload()['lineItemCreatedAt']))
return $a->getPayload()['lineItemCreatedAt'] > $b->getPayload()['lineItemCreatedAt'];
});
} else {
$object = $page->getCart();
$object->getLineItems()->sort(function (LineItem $a, LineItem $b) {
if (isset($a->getPayload()['lineItemCreatedAt']) && isset($b->getPayload()['lineItemCreatedAt']))
return $a->getPayload()['lineItemCreatedAt'] > $b->getPayload()['lineItemCreatedAt'];
});
}
$productIds = [];
foreach ($object->getLineItems() as $lineItem) {
if ($lineItem->getType() == LineItem::PROMOTION_LINE_ITEM_TYPE)
continue;
$productId = $lineItem->getReferencedId();
$sWoptions = $this->productPitchPrintService->getProductOptions($productId, $event->getSalesChannelContext());
if (count($sWoptions) > 0) {
if ($event instanceof CheckoutFinishPageLoadedEvent) {
$payload = $lineItem->getPayload();
$payload['swp_options'] = $sWoptions;
$lineItem->setPayload($payload);
} else {
$lineItem->setPayloadValue('swp_options', $sWoptions);
}
}
$productIds[] = $productId;
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsAnyFilter('id', $productIds));
$criteria->addAssociation('media');
$criteria->getAssociation('media')->addSorting(new FieldSorting('position'));
$criteria->addAssociation('options.productConfiguratorSettings.media');
$productCollection = $this->productRepository->search($criteria, $event->getContext());
$products = [];
foreach ($productCollection as $product) {
$products[$product->getId()] = $product;
if ($event instanceof CheckoutFinishPageLoadedEvent) {
foreach ($object->getLineItems() as $lineItem) {
if ($lineItem->getReferencedId() == $product->getId()) {
$payload = $lineItem->getPayload();
$payload['productTranslated'] = $product->getTranslated();
$lineItem->setPayload($payload);
}
}
} else {
$object->getLineItems()->filter(function (LineItem $lineItem) use ($product) {
if ($lineItem->getReferencedId() == $product->getId()) {
$lineItem->setPayloadValue('productTranslated', $product->getTranslated());
}
});
}
$products[$product->getId()] = $product;
}
$page->assign(['products' => $products]);
}
/**
* @param ProductGatewayCriteriaEvent $event
* @return mixed
*/
public function productGatewayCriteria(ProductGatewayCriteriaEvent $event)
{
$event->getCriteria()->addAssociation('options.media');
}
/**
* @param BeforeLineItemAddedEvent $event
* @return mixed
*/
public function beforeLineItemAdded(BeforeLineItemAddedEvent $event)
{
$event->getLineItem()->setPayloadValue('lineItemCreatedAt', (new \DateTimeImmutable())->format(Defaults::STORAGE_DATE_TIME_FORMAT));
if ($event->getLineItem()->getType() == LineItem::PROMOTION_LINE_ITEM_TYPE) return;
$lineItem = $event->getLineItem();
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $lineItem->getReferencedId()));
$criteria->addAssociation('media');
$productResult = $this->productRepository->search($criteria, $event->getContext());
$product = $productResult->first();
if ($product) {
if ($product->getCover()) {
//replace the PitchPrint-Preview with $product - Media
if (isset($lineItem->getPayload()['features']['pitch_print'])) {
$previews = $lineItem->getPayload()['features']['pitch_print']['previews'];
if (!is_array($product->getCover()->getMedia())) {
$mediaCollection = [$product->getCover()->getMedia()];
} else {
$mediaCollection = $product->getCover()->getMedia();
}
$i = 0;
foreach ($mediaCollection as $mediaEntity) {
//replace only previews, if the mediaItems are > 1, skip the rest
if (isset($previews[$i])) {
$samplePreview = $previews[$i];
} else {
break;
}
foreach ($mediaEntity->getThumbnails() as $thumbnail) {
$thumbnail->setUrl($samplePreview);
}
$mediaEntity->setUrl($samplePreview);
$i++;
}
}
$lineItem->setCover($product->getCover()->getMedia());
}
}
}
/**
* @param AfterLineItemAddedEvent $event
* @return mixed
*/
public function afterLineItemAdded(afterLineItemAdded $event)
{
/*
$event->getCart()->getLineItems()->first()->setLabel('Super Trooper');
/*
$cart = $event->getCart();
foreach($cart->getLineItems() as $lineItem){
$lineItem->setLabel('Super Trooper');
}
$this->cartPersister->save($event->getCart(), $event->getContext());
*/
}
}