<?php declare(strict_types = 1);
namespace GrimmTheme\Storefront\Subscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Core\Checkout\Payment\PaymentMethodCollection;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoadedEvent;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextPersister;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
// SD-4986
class CheckoutPagesLoadedSubscriber implements EventSubscriberInterface
{
private SystemConfigService $systemConfigService;
private SalesChannelContextPersister $contextPersister;
public function __construct(
SystemConfigService $systemConfigService,
SalesChannelContextPersister $contextPersister
){
$this->systemConfigService = $systemConfigService;
$this->contextPersister = $contextPersister;
}
public static function getSubscribedEvents(): array
{
return [
CheckoutRegisterPageLoadedEvent::class => 'onCheckoutRegisterPageLoaded',
CheckoutConfirmPageLoadedEvent::class => 'onConfirmPageLoaded',
CheckoutCartPageLoadedEvent::class => 'onCartPageLoaded',
OffcanvasCartPageLoadedEvent::class => 'onOffcanvasLoaded',
CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinishPageLoaded'
];
}
public function onCheckoutRegisterPageLoaded(CheckoutRegisterPageLoadedEvent $event)
{
$page = $event->getPage();
$this->addRequestOnlyPageExtension($page);
}
public function onConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event)
{
$page = $event->getPage();
$containsRequestOnlyProducts = $this->addRequestOnlyPageExtension($page);
$requestOnlyPaymentMethodId = $this->systemConfigService->get('GrimmTheme.config.requestPaymentMethodId');
if(!$requestOnlyPaymentMethodId){
return;
}
// we have at least one product with request only in cart -> remove all payment methods besides "Angebotsanfrage"
if($containsRequestOnlyProducts){
$paymentMethods = $page->getPaymentMethods();
$paymentMethodsElements = $paymentMethods->getElements();
// remove all payment methods besides requestOnlyPaymentMethod
if(!isset($paymentMethodsElements) || !isset($paymentMethodsElements[$requestOnlyPaymentMethodId])){
return;
}
$requestOnlyPaymentMethod = $paymentMethodsElements[$requestOnlyPaymentMethodId];
$filteredPaymentMethods = new PaymentMethodCollection([$requestOnlyPaymentMethod]);
$page->setPaymentMethods($filteredPaymentMethods);
// switch context paymentMethodId to Angebotsanfrage, mimics logic of /checkout/configure Route that gets called when payment manually switched
// necessary because selecting preselecting payment method in twig not enough
$context = $event->getSalesChannelContext();
$parameters = ["paymentMethodId" => $requestOnlyPaymentMethodId];
$customer = $context->getCustomer();
$this->contextPersister->save(
$context->getToken(),
$parameters,
$context->getSalesChannel()->getId(),
$customer && empty($context->getPermissions()) ? $customer->getId() : null
);
}
}
public function onCartPageLoaded(CheckoutCartPageLoadedEvent $event)
{
$page = $event->getPage();
$this->addRequestOnlyPageExtension($page);
}
public function onOffcanvasLoaded(OffcanvasCartPageLoadedEvent $event)
{
$page = $event->getPage();
$this->addRequestOnlyPageExtension($page);
}
// needed in order to hide trusted shops on finish page
public function onCheckoutFinishPageLoaded(CheckoutFinishPageLoadedEvent $event)
{
$page = $event->getPage();
$order = $page->getOrder();
$transactions = $order->getTransactions();
// account for unsuccessful order
if(!$transactions){
return;
}
$requestOnlyPaymentMethodId = $this->systemConfigService->get('GrimmTheme.config.requestPaymentMethodId');
if(!$requestOnlyPaymentMethodId){
return;
}
if($transactions->first()){
$paymentId = $transactions->first()->getPaymentMethodId();
if($paymentId == $requestOnlyPaymentMethodId){
$page->addExtension("productsRequestOnly", new ArrayStruct([]));
}
}
}
private function addRequestOnlyPageExtension($page): bool
{
$cart = $page->getCart();
$lineItems = $cart->getLineItems()->getPayload();
if(!$lineItems){
return false;
}
$productsRequestOnly = [];
foreach($lineItems as $lineItem){
if(isset($lineItem["customFields"]["grimm_customfields_productRequest_only"]) && $lineItem["customFields"]["grimm_customfields_productRequest_only"] == "true"){
array_push($productsRequestOnly, $lineItem["productNumber"]);
}
}
if(!empty($productsRequestOnly)){
// add productNumber as page extension
$pageExtension = new ArrayStruct($productsRequestOnly);
$page->addExtension("productsRequestOnly", $pageExtension);
return true;
}
return false;
}
}