<?php
/**
* NOTICE OF LICENSE
*
* @copyright Copyright (c) 11.01.2021 brainstation GbR
* @author Mike Becker<mike@brainstation.de>
*/
declare(strict_types=1);
namespace BstRegisterType6\Storefront\Subscriber;
use Psr\Log\LoggerInterface;
use Shopware\Core\Content\Media\MediaService;
use Shopware\Core\Framework\Validation\BuildValidationEvent;
use Shopware\Core\PlatformRequest;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\Address\Listing\AddressListingPageLoadedEvent;
use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use BstRegisterType6\Settings\Service\SettingsService;
use BstRegisterType6\Settings\Struct\SettingsStruct;
use Symfony\Component\Validator\Constraints\Optional;
class Frontend implements EventSubscriberInterface
{
/** @var SettingsService */
private $settingsService;
/** @var LoggerInterface */
private $logger;
/** @var SettingsStruct */
private $settings;
/** @var RequestStack */
private $requestStack;
/**
* @param SettingsService $settingsService
* @param RequestStack $requestStack
* @param LoggerInterface $logger
*/
public function __construct(
SettingsService $settingsService,
RequestStack $requestStack,
LoggerInterface $logger
)
{
$this->settingsService = $settingsService;
$this->requestStack = $requestStack;
$this->logger = $logger;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
HeaderPageletLoadedEvent::class => 'onPageLoaded',
AddressListingPageLoadedEvent::class => 'onAddressLoaded',
'framework.validation.customer.profile.update' => 'onValidationEvent',
'framework.validation.address.create' => 'onValidationEvent',
];
}
/**
* @param HeaderPageletLoadedEvent $event
*/
public function onPageLoaded(HeaderPageletLoadedEvent $event): void
{
$this->settings = $this->settingsService->getSettings($event->getSalesChannelContext()->getSalesChannel()->getId());
$event->getPagelet()->addExtension('BstRegisterType6', $this->settings);
}
/**
* @param AddressListingPageLoadedEvent $event
*/
public function onAddressLoaded(AddressListingPageLoadedEvent $event): void
{
$this->settings = $this->settingsService->getSettings($event->getSalesChannelContext()->getSalesChannel()->getId());
$event->getPage()->addExtension('BstRegisterType6', $this->settings);
}
/**
* @param BuildValidationEvent $event
*/
public function onValidationEvent(BuildValidationEvent $event): void
{
try {
// get current saleschannel context
/** @var SalesChannelContext $context */
if (!$context = $this->requestStack->getCurrentRequest()->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT, false)) {
return;
}
$salesChannelId = null;
if ($context->getSalesChannel()) {
$salesChannelId = $context->getSalesChannel()->getId();
}
$this->settings = $this->settingsService->getSettings($salesChannelId);
if (!$context->getCustomer()) {
if (!$this->settings->isCompanyOptional()) {
return;
}
} else {
if (!$this->settings->isCompanyOptional() && !$this->settings->isCompanyOptionalInAccount()) {
return;
}
}
$event->getDefinition()->set('company', new Optional());
} catch (\Exception $e) {}
}
}