<?php declare(strict_types=1);
namespace NrbnPrivateshop\Storefront\Controller;
use Shopware\Core\Checkout\Customer\Event\CustomerLogoutEvent;
use Shopware\Core\Checkout\Customer\Event\CustomerRegisterEvent;
use Shopware\Core\Content\Mail\Service\MailService;
use Shopware\Core\Content\MailTemplate\MailTemplateEntity;
use Shopware\Core\Content\MailTemplate\MailTemplateTypes;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Validation\DataBag\DataBag;
use Shopware\Core\System\SalesChannel\ContextTokenResponse;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\Account\Overview\AccountOverviewPageLoadedEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use \Symfony\Component\HttpKernel\KernelEvents;
use Shopware\Storefront\Framework\Twig\TemplateConfigAccessor;
class FrontendController implements EventSubscriberInterface
{
/**
* @var ContainerInterface;
*/
protected $container;
/**
* @var TemplateConfigAccessor;
*/
protected $config;
/**
* @var SystemConfigService
*/
protected $systemConfig;
/**
* @var MailService
*/
protected $mailService;
public function __construct(
ContainerInterface $container,
TemplateConfigAccessor $config,
SystemConfigService $systemConfig,
MailService $mailService
){
$this->container = $container;
$this->config = $config;
$this->systemConfig = $systemConfig;
$this->mailService = $mailService;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => 'onRequest',
CustomerRegisterEvent::class => 'onRequestRegister',
AccountOverviewPageLoadedEvent::class => 'onAccountLoginRequest'
];
}
public function onAccountLoginRequest(AccountOverviewPageLoadedEvent $event){
$customer = $event->getSalesChannelContext()->getCustomer();
$reqAttr = $event->getRequest()->attributes->all();
if($customer->getActive() == false){
$sessionService = $this->container->get("session");
$sessionService->set('deactivateUser', 1);
$logOutEvent = new CustomerLogoutEvent($event->getSalesChannelContext(), $customer);
$eventDispatcher = $this->container->get("event_dispatcher");
$eventDispatcher->dispatch($logOutEvent);
new ContextTokenResponse($event->getSalesChannelContext()->getToken());
header('Location: /account/login');
die();
}
return true;
}
public function onRequestRegister(CustomerRegisterEvent $event){
$customerId = $event->getCustomer()->getId();
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter("id", $customerId));
$customerService = $this->container->get("customer.repository");
$customerService->update([
[
"id" => $customerId,
"active" => false
]
], $event->getContext());
#$this->sendMail($event->getSalesChannelContext(), $event->getCustomer());
}
public function onRequest(ResponseEvent $event)
{
$context = $event->getRequest()->attributes->get("sw-sales-channel-context");
$user = false;
if($context){
$user = $context->getCustomer();
}
$sessionService = $this->container->get("session");
$sessionService->remove("deactivateUser");
$reqAttr = $event->getRequest()->attributes->all();
$isRegisterAllowed = $this->systemConfig->get("NrbnPrivateshop.config.userRegistration");
$event->getRequest()->attributes->set("isRegisterAllowed", $isRegisterAllowed);
if(
!key_exists("resolved-uri", $reqAttr) ||
!key_exists("sw-original-request-uri", $reqAttr) ||
$user
)
{
return true;
};
$allowedUrls = [
"frontend.account.login.page",
"frontend.account.home.page",
"frontend.account.register.page",
"frontend.account.recover.page",
"frontend.checkout.info",
"frontend.cart.offcanvas",
"frontend.cookie.offcanvas",
"frontend.cookie.permission",
"frontend.search.suggest",
"/account/recover",
"/account/recover/password",
"/form/contact",
"/contact/",
"/AGB/",
"/AGB/",
"/Impressum/",
"/Datenschutzerklaerung/",
"/Kontaktformular/",
];
foreach ($allowedUrls as $allowedUrl){
try{
$url = $this->container->get('router')->generate($allowedUrl);
} catch (\Exception $e){
$url = $allowedUrl;
}
if(
$reqAttr["resolved-uri"] == $url ||
$reqAttr["sw-original-request-uri"] == $url
){
return true;
}
}
$salesChannelId = $event->getRequest()->attributes->get("sw-sales-channel-id");
$allowedCMSPages = [
"core.basicInformation.privacyPage",
"core.basicInformation.imprintPage",
"core.basicInformation.contactPage",
"core.basicInformation.shippingPaymentInfoPage",
"NrbnSenertec.config.SignUp"
];
foreach ($allowedCMSPages as $allowedCMSPage){
$pageId = $this->config->config($allowedCMSPage, $salesChannelId);
$pageUrl = $this->container->get('router')->generate('frontend.cms.page', ['id'=>$pageId]);
if(
$reqAttr["resolved-uri"] == $pageUrl
)
{
return true;
}
}
$loginUrl = $this->container->get('router')->generate('frontend.account.login.page');
if($reqAttr["resolved-uri"] != $loginUrl){
$event->setResponse(new RedirectResponse($loginUrl));
}
return true;
}
private function sendMail(SalesChannelContext $salesChannelContext, $customer): void
{
$data = new DataBag();
$data->set(
'recipients',
[
"ghanei@netzreform.de" => $salesChannelContext->getSalesChannel()->getName(),
$customer->getEmail() => $customer->getFirstName() . " " . $customer->getLastName()
]
);
$mailTemplate = $this->getMailTemplate($salesChannelContext);
$template = "<div style='font-family:arial; font-size:12px;'>
<p>" .
$customer->getFirstName() . " " . $customer->getLastName() .",<br/>
<br/>
vielen Dank für Ihre Anmeldung in unserem Shop.<br/>
Sie erhalten Zugriff über Ihre E-Mail-Adresse <strong> " . $customer->getEmail() . "</strong> und dem von Ihnen gewählten Kennwort.<br/>
Sie können Ihr Kennwort jederzeit nachträglich ändern.
</p>
</div>";
$data->set('senderName', $salesChannelContext->getSalesChannel()->getName());
//$data->set('templateId', $mailTemplate->getId());
$data->set('salesChannelId', $salesChannelContext->getSalesChannel()->getId());
$data->set('contentHtml', $template);
$data->set('contentPlain', "test");
$data->set('subject', $mailTemplate->getSubject());
$data->set('salesChannelId', $salesChannelContext->getSalesChannelId());
$this->mailService->send(
$data->all(),
$salesChannelContext->getContext()
);
}
private function getMailTemplate(SalesChannelContext $salesChannelContext): ?MailTemplateEntity
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('mailTemplateType.technicalName', MailTemplateTypes::MAILTYPE_CUSTOMER_REGISTER));
$criteria->setLimit(1);
$mailTemplateRepository = $this->container->get("mail_template.repository");
return $mailTemplateRepository->search($criteria, $salesChannelContext->getContext())->first();
}
}