<?php declare(strict_types=1);
namespace Wexo\CytexRelewise\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Wexo\CytexRelewise\WexoCytexRelewise;
use Wexo\Relewise\Core\Content\Relewise\SalesChannel\Recommend\Product\AbstractRelewiseProductRecommendRoute;
use Wexo\Relewise\Service\Model\Recommendation\CurrentCart;
use Wexo\Relewise\Service\Registry\RelewiseModelRegistry;
class PageSubscriber implements EventSubscriberInterface
{
public const RELEWISE_OFFCANVAS_RECOMMENDATIONS = 'relewiseOffCanvasRecommendations';
/**
* @var RelewiseModelRegistry
*/
protected $modelRegistry;
/**
* @var AbstractRelewiseProductRecommendRoute
*/
protected $recommendRoute;
/**
* @var SystemConfigService
*/
protected $configService;
/**
* PageSubscriber constructor.
* @param RelewiseModelRegistry $modelRegistry
* @param AbstractRelewiseProductRecommendRoute $recommendRoute
* @param SystemConfigService $configService
*/
public function __construct(
RelewiseModelRegistry $modelRegistry,
AbstractRelewiseProductRecommendRoute $recommendRoute,
SystemConfigService $configService
) {
$this->modelRegistry = $modelRegistry;
$this->recommendRoute = $recommendRoute;
$this->configService = $configService;
}
public static function getSubscribedEvents()
{
return [
OffcanvasCartPageLoadedEvent::class => 'onOffCanvasCartLoaded'
];
}
/**
* @param OffcanvasCartPageLoadedEvent $event
*/
public function onOffCanvasCartLoaded(OffcanvasCartPageLoadedEvent $event)
{
$request = $event->getRequest();
// Make sure request is from offcanvas controller
// Since the info request to load the mini cart widget does not use the products from relewise
if ($request->attributes->get('_route') !== 'frontend.cart.offcanvas') {
return;
}
$salesChannelContext = $event->getSalesChannelContext();
/** @var CurrentCart $recommendationType */
$recommendationType = $this->modelRegistry->createRecommendation(
CurrentCart::KEY,
$salesChannelContext,
$request
);
if ($settings = $this->configService->get(
WexoCytexRelewise::OFFCANVAS_CART_RECOMMEND_SETTINGS,
$salesChannelContext->getSalesChannelId()
)) {
$recommendationType->setSettings($settings);
}
$recommendations = $this->recommendRoute->load(
$recommendationType,
$request,
$salesChannelContext,
new Criteria()
)->getProducts();
if ($recommendations->count()) {
$event->getPage()->addExtension(self::RELEWISE_OFFCANVAS_RECOMMENDATIONS, $recommendations);
}
}
}