<?php declare(strict_types=1);
namespace EmcgnGewerbeschein\Resources\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\Account\CustomerGroupRegistration\CustomerGroupRegistrationPageLoadedEvent;
use Shopware\Storefront\Page\Account\Login\AccountLoginPageLoadedEvent;
use Shopware\Storefront\Page\Account\Overview\AccountOverviewPageLoadedEvent;
use Shopware\Storefront\Page\Account\Profile\AccountProfilePageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoadedEvent;
use Shopware\Storefront\Page\PageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class StorefrontData implements EventSubscriberInterface
{
private $systemConfigService;
private $mediaRepository;
private $gewerbescheinRepository;
public function __construct(
SystemConfigService $systemConfigService,
EntityRepositoryInterface $mediaRepository,
EntityRepositoryInterface $gewerbescheinRepository
)
{
$this->systemConfigService = $systemConfigService;
$this->mediaRepository = $mediaRepository;
$this->gewerbescheinRepository = $gewerbescheinRepository;
}
public static function getSubscribedEvents(): array
{
return [
CustomerGroupRegistrationPageLoadedEvent::class => 'registerEvent',
AccountLoginPageLoadedEvent::class => 'loginEvent',
CheckoutRegisterPageLoadedEvent::class => 'loginEvent',
AccountOverviewPageLoadedEvent::class => 'profileOverview',
AccountProfilePageLoadedEvent::class => 'profileEdit'
];
}
/**
* Show/Hide input field in profile edit
* @param AccountProfilePageLoadedEvent $event
*/
public function profileEdit(AccountProfilePageLoadedEvent $event){
/* GruppenId des Kunden auslesen */
$groupId = $event->getSalesChannelContext()->getCustomer()->getGroupId();
/* Prüft, ob Kundengruppe mit Kundengruppe(n) aus PluginConfig übereinstimmt */
$enableOutput = $this->checkCustomerGroup($groupId);
if($enableOutput == false){
/* Angefragte KundengruppenID des Kunden auslesen */
$groupId = $event->getSalesChannelContext()->getCustomer()->getRequestedGroupId();
if(!empty($groupId)){
$enableOutput = $this->checkCustomerGroup($groupId);
}
}
$emcgnTlInfo = new ArrayEntity();
$emcgnTlInfo->set('isEnabled', $enableOutput);
$event->getPage()->addExtension('emcgnTradeLicense', $emcgnTlInfo);
}
/**
* Show/Hide card in profile overview, handle trade license data
* @param AccountOverviewPageLoadedEvent $event
*/
public function profileOverview(AccountOverviewPageLoadedEvent $event){
/* GruppenId des Kunden auslesen */
$groupId = $event->getPage()->getCustomer()->getGroupId();
/* Prüft, ob Kundengruppe mit Kundengruppe(n) aus PluginConfig übereinstimmt */
$enableOutput = $this->checkCustomerGroup($groupId);
if($enableOutput == false){
/* Angefragte KundengruppenID des Kunden auslesen */
$groupId = $event->getPage()->getCustomer()->getRequestedGroupId();
if(!empty($groupId)){
$enableOutput = $this->checkCustomerGroup($groupId);
}
}
$emcgnTlInfo = new ArrayEntity();
if($enableOutput == true) {
$customerId = $event->getPage()->getCustomer()->getId();
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('customerId', $customerId));
$tl = $this->gewerbescheinRepository->search($criteria, $event->getContext());
$elements = $tl->getElements();
$tradeLicenses = [];
if(!empty($elements)){
foreach($elements as $element){
$mediaId = $element->getFileId();
if(!empty($mediaId)){
$media = $this->mediaRepository->search(new Criteria([$mediaId]), $event->getContext())->first();
$url = $media->getUrl();
$uploadDate = date('d.m.Y', $media->getUploadedAt()->getTimestamp());
$data = [
'url' => $url,
'uploadDate' => $uploadDate
];
array_push($tradeLicenses, $data);
}
}
}
$emcgnTlInfo->set('tradeLicenses', $tradeLicenses);
}
$emcgnTlInfo->set('isEnabled', $enableOutput);
$event->getPage()->addExtension('emcgnTradeLicense', $emcgnTlInfo);
}
/**
* Check plugin config, show/hide input field in customerGroup register form
* @param CustomerGroupRegistrationPageLoadedEvent $event
*/
public function registerEvent(CustomerGroupRegistrationPageLoadedEvent $event){
/* Plugin Config auslesen */
$isRequired = $this->systemConfigService->get('EmcgnGewerbeschein.config.required');
/* KundengruppenID des Registrierungsformulars auslesen */
$customerGroupId = $event->getPage()->getGroup()->getId();
/* Prüft, ob Kundengruppe mit Kundengruppe(n) aus PluginConfig übereinstimmt */
$enableFormField = $this->checkCustomerGroup($customerGroupId);
$emcgnTlInfo = new ArrayEntity();
$emcgnTlInfo->set('isEnabled', $enableFormField);
$emcgnTlInfo->set('isRequired', $isRequired);
$event->getPage()->addExtension('emcgnTradeLicense', $emcgnTlInfo);
}
/**
* Check plugin config, show/hide input field in standard register form
* @param PageLoadedEvent $event
*/
public function loginEvent(PageLoadedEvent $event){
/* Plugin Config auslesen */
$isRequired = $this->systemConfigService->get('EmcgnGewerbeschein.config.required');
/* KundengruppenID des Registrierungsformulars auslesen */
$customerGroupId = $event->getSalesChannelContext()->getCurrentCustomerGroup()->getId();
/* Prüft, ob Kundengruppe mit Kundengruppe(n) aus PluginConfig übereinstimmt */
$enableFormField = $this->checkCustomerGroup($customerGroupId);
$emcgnTlInfo = new ArrayEntity();
$emcgnTlInfo->set('isEnabled', $enableFormField);
$emcgnTlInfo->set('isRequired', $isRequired);
$event->getPage()->addExtension('emcgnTradeLicense', $emcgnTlInfo);
}
/**
* Check if plugin config contains given customer group
* @param string $customerGroupId
* @return boolean
*/
private function checkCustomerGroup(string $customerGroupId){
/* Plugin Config auslesen */
$selectedCustomerGroups = $this->systemConfigService->get('EmcgnGewerbeschein.config.customerGroups');
/* Wenn ausgewählte Kundengruppe(n) mit Kundengruppe aus Registrierungsformular übereinstimmt.. */
if(!empty($selectedCustomerGroups)) {
foreach ($selectedCustomerGroups as $group) {
if ($group == $customerGroupId) {
return true;
}
}
return false;
}
return false;
}
}