<?php declare(strict_types=1);
/**
* PremSoft
* Copyright © 2019 Premsoft - Sven Mittreiter
*
* @copyright Copyright (c) 2019, premsoft - Sven Mittreiter (http://www.premsoft.de)
* @author Sven Mittreiter <info@premsoft.de>
*/
namespace Prems\Plugin\PremsWishlist\Storefront\Page\Subscriber;
use Prems\Plugin\PremsWishlist\Core\Wishlist\Storefront\ConfigService;
use Prems\Plugin\PremsWishlist\Core\Wishlist\Storefront\WishlistService;
use Shopware\Core\Checkout\Customer\Event\CustomerBeforeLoginEvent;
use Shopware\Core\Checkout\Customer\Event\CustomerLoginEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Prems\Plugin\PremsWishlist\Storefront\Page\Listing\ListingPageLoader;
use Symfony\Component\HttpFoundation\Session\Session;
class PageSubscriber implements EventSubscriberInterface
{
/**
* @var ConfigService
*/
private $configService;
/**
* @var ListingPageLoader
*/
private $listingPageLoader;
/**
* @var WishlistService
*/
private $wishlistService;
/**
* @var Session
*/
private $sessionService;
public function __construct(
ConfigService $configService,
ListingPageLoader $listingPageLoader,
WishlistService $wishlistService
) {
$this->configService = $configService;
$this->listingPageLoader = $listingPageLoader;
$this->wishlistService = $wishlistService;
$this->sessionService = new Session();
}
public static function getSubscribedEvents(): array
{
return [
CheckoutCartPageLoadedEvent::class => 'onCheckoutCartPageLoadedEvent',
CheckoutConfirmPageLoadedEvent::class => 'onCheckoutConfirmPageLoadedEvent',
OffcanvasCartPageLoadedEvent::class => 'onOffcanvasPageLoadedEvent',
NavigationPageLoadedEvent::class => 'onNavigationPageLoadedEvent',
HeaderPageletLoadedEvent::class => 'onHeaderPageletLoadedEvent',
CustomerLoginEvent::class => 'onCustomerLoginEvent',
//CustomerBeforeLoginEvent::class => 'onCustomerBeforeLoginEvent'
];
}
/**
* Save wishlists and products of customer (if created before login)
* @param CustomerBeforeLoginEvent $event
*/
public function onCustomerBeforeLoginEvent($event): void
{
//$_SESSION['wishlistToken'] = $event->getSalesChannelContext()->getToken();
}
/**
* Save wishlists and products of customer (if created before login)
* @param CustomerLoginEvent $event
*/
public function onCustomerLoginEvent($event): void
{
$wishlistSettings = $this->configService->getConfig();
if ($wishlistSettings->isLoginRequired()) {
return;
}
$context = $event->getSalesChannelContext();
$customer = $event->getCustomer();
$token = $this->sessionService->get('wishlistToken');
$this->sessionService->remove('wishlistToken');
$this->wishlistService->saveTokenWishlistsInDatabase($context, $customer, $token);
}
/**
* Load Wishlist settings for wishlist icon in header
* @param HeaderPageletLoadedEvent $event
*
* @throws InconsistentCriteriaIdsException
*/
public function onHeaderPageletLoadedEvent($event): void
{
$wishlistSettings = null;
if ($event instanceof HeaderPageletLoadedEvent) {
$wishlistSettings = $this->configService->getConfig();
} else {
return;
}
if (!$wishlistSettings) {
return;
}
$context = $event->getSalesChannelContext();
$user = $context->getCustomer();
// Set Wishlist Token if not logged in
if (!$this->sessionService->get('wishlistToken') && !$user) {
$this->sessionService->set('wishlistToken', $event->getSalesChannelContext()->getToken());
}
$event->getPagelet()->addExtension('premsWishlist', $wishlistSettings);
}
/**
* Show wishlist button in article listing
* @param NavigationPageLoadedEvent $event
*
* @throws InconsistentCriteriaIdsException
*/
public function onNavigationPageLoadedEvent($event): void
{
$request = $event->getRequest();
$context = $event->getSalesChannelContext();
$wishlistSettings = null;
if ($event instanceof NavigationPageLoadedEvent) {
$wishlistSettings = $this->configService->getConfig();
} else {
return;
}
if (!$wishlistSettings) {
return;
}
$settingVars = $wishlistSettings->getVars();
if (!$settingVars['addToWishlistInListing']) {
return;
}
$event->getPage()->addExtension('premsWishlist', $wishlistSettings);
}
/**
* Show wishlist functionality in offcanvas cart
* @param OffcanvasCartPageLoadedEvent $event
*
* @throws InconsistentCriteriaIdsException
*/
public function onOffcanvasPageLoadedEvent($event): void
{
$request = $event->getRequest();
$context = $event->getSalesChannelContext();
$wishlistSettings = null;
if ($event instanceof OffcanvasCartPageLoadedEvent) {
$wishlistSettings = $this->configService->getConfig();
} else {
return;
}
if (!$wishlistSettings) {
return;
}
$settingVars = $wishlistSettings->getVars();
if (array_key_exists('showWishlistsInOffCanvas', $settingVars) && $settingVars['showWishlistsInOffCanvas']) {
return;
}
if (!$context->getCustomer() && $settingVars['loginRequired']) {
return;
}
$wishlists = $this->listingPageLoader->load($request, $context);
$maxNumberWishlistsPerUser = (int) $wishlistSettings->getMaxNumberWishlistsPerUser();
if ($maxNumberWishlistsPerUser == 0 || $wishlists->getListing()->count() < $maxNumberWishlistsPerUser) {
$maxWishlistNumberReached = false;
} else {
$maxWishlistNumberReached = true;
}
$event->getPage()->assign(['maxWishlistNumberReached' => $maxWishlistNumberReached, 'premsWishlistLoggedIn' => 1]);
$event->getPage()->addExtension('wishlists', $wishlists);
$event->getPage()->addExtension('premsWishlist', $wishlistSettings);
}
/**
* Show wishlist functionality in cart
* @param CheckoutCartPageLoadedEvent $event
*
* @throws InconsistentCriteriaIdsException
*/
public function onCheckoutCartPageLoadedEvent($event): void
{
$request = $event->getRequest();
$context = $event->getSalesChannelContext();
$wishlistSettings = null;
if ($event instanceof CheckoutCartPageLoadedEvent) {
$wishlistSettings = $this->configService->getConfig();
} else {
return;
}
if (!$wishlistSettings) {
return;
}
$settingVars = $wishlistSettings->getVars();
if (!$settingVars['showWishlistsInBasket']) {
return;
}
if (!$context->getCustomer() && $settingVars['loginRequired']) {
$event->getPage()->assign(['premsWishlistLoggedIn' => 0]);
$event->getPage()->addExtension('premsWishlist', $wishlistSettings);
return;
}
$wishlists = $this->listingPageLoader->load($request, $context);
$maxNumberWishlistsPerUser = (int) $wishlistSettings->getMaxNumberWishlistsPerUser();
if ($maxNumberWishlistsPerUser == 0 || $wishlists->getListing()->count() < $maxNumberWishlistsPerUser) {
$maxWishlistNumberReached = false;
} else {
$maxWishlistNumberReached = true;
}
$event->getPage()->assign(['maxWishlistNumberReached' => $maxWishlistNumberReached, 'premsWishlistLoggedIn' => 1]);
$event->getPage()->addExtension('wishlists', $wishlists);
$event->getPage()->addExtension('premsWishlist', $wishlistSettings);
}
/**
* Show wishlist functionality in checkout
* @param CheckoutCartPageLoadedEvent $event
*
* @throws InconsistentCriteriaIdsException
*/
public function onCheckoutConfirmPageLoadedEvent($event): void
{
$request = $event->getRequest();
$context = $event->getSalesChannelContext();
$wishlistSettings = null;
if ($event instanceof CheckoutConfirmPageLoadedEvent) {
$wishlistSettings = $this->configService->getConfig();
} else {
return;
}
if (!$wishlistSettings) {
return;
}
if (!$context->getCustomer() && $wishlistSettings->isLoginRequired()) {
return;
}
$settingVars = $wishlistSettings->getVars();
if (!$settingVars['showWishlistsInCheckout']) {
return;
}
$wishlists = $this->listingPageLoader->load($request, $context, true);
$maxNumberWishlistsPerUser = (int) $wishlistSettings->getMaxNumberWishlistsPerUser();
if ($maxNumberWishlistsPerUser == 0 || $wishlists->getListing()->count() < $maxNumberWishlistsPerUser) {
$maxWishlistNumberReached = false;
} else {
$maxWishlistNumberReached = true;
}
$event->getPage()->assign(['maxWishlistNumberReached' => $maxWishlistNumberReached, 'premsWishlistLoggedIn' => 1]);
$event->getPage()->addExtension('wishlists', $wishlists);
$event->getPage()->addExtension('premsWishlist', $wishlistSettings);
}
}