<?php
declare(strict_types=1);
namespace App\Module\Cms\Subscriber;
use App\Module\Cms\Provider\CmsContentProvider;
use App\Store\StoreContext;
use App\Module\ShortSimpleCheckout\Event\View\BaseViewEvent;
use App\Module\ShortSimpleCheckout\Events;
use App\Module\ShortSimpleCheckout\Exception\VariableAlreadyDefinedException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Class CheckoutSlotSubscriber
*
* @author André Varelmann <andre.varelmann@bestit-online.de>
* @package App\Module\Cms\Subscriber
*/
class CheckoutSlotSubscriber implements EventSubscriberInterface
{
private CmsContentProvider $provider;
private StoreContext $storeContext;
/**
* @param CmsContentProvider $provider
* @param StoreContext $storeContext
*/
public function __construct(CmsContentProvider $provider, StoreContext $storeContext)
{
$this->provider = $provider;
$this->storeContext = $storeContext;
}
/**
* @return array|string[]
*/
public static function getSubscribedEvents(): array
{
return [
Events::CART_INDEX_DISPATCH => 'addCheckoutSlots',
Events::SHIPPING_PAYMENT_INDEX_DISPATCH => 'addCheckoutSlots',
Events::FINISH_INDEX_DISPATCH => 'addFinishSlot',
];
}
/**
* @param BaseViewEvent $event
*
* @throws VariableAlreadyDefinedException
*
* @return void
*/
public function addCheckoutSlots(BaseViewEvent $event): void
{
$cms = $this->provider->getContentBySlugForCurrentPage('checkout');
if ($cms !== null) {
$event->addVariable('slots', $cms->content);
}
}
/**
* Add cms slots for finish page. Remove order id from url first
*
* @param BaseViewEvent $event
* @throws VariableAlreadyDefinedException
*
* @return void
*/
public function addFinishSlot(BaseViewEvent $event): void
{
$localeInfo = $this->storeContext->getLocaleInfo();
// remove order id from finish url (/checkout/finish/{orderId}
$url = explode('/', $localeInfo->getPath());
array_pop($url);
$cms = $this->provider->getContentBySlug(
$this->storeContext->getAlias(),
$localeInfo->getCurrentLocale(),
implode('/', $url),
'checkout'
);
if ($cms !== null) {
$event->addVariable('slots', $cms->content);
}
}
}