<?php
namespace Onedot\Asus\Subscriber;
use Shopware\Core\Checkout\Customer\Event\CustomerRegisterEvent;
use NewsletterSendinblue\Service\Customer\CustomerProducer;
use Shopware\Core\Framework\Context;
use Symfony\Component\HttpFoundation\RequestStack;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Psr\Log\LoggerInterface;
class NewsletterSubscriptionSubscriber implements EventSubscriberInterface
{
private $logger;
private $requestStack;
/**
* @var CustomerProducer
*/
private $customerProducer;
private EntityRepository $newsletterRecipientRepository;
public function __construct(EntityRepository $newsletterRecipientRepository, RequestStack $requestStack, CustomerProducer $customerProducer, LoggerInterface $logger)
{
$this->newsletterRecipientRepository = $newsletterRecipientRepository;
$this->customerProducer = $customerProducer;
$this->requestStack = $requestStack;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return [
CustomerRegisterEvent::class => 'onCustomerRegister',
];
}
public function onCustomerRegister(CustomerRegisterEvent $event): void
{
$customer = $event->getCustomer();
$customFields = $customer->getCustomFields() ?? [];
// $this->logger->error("Custom fields", $this->requestStack->getCurrentRequest()->request->all());
// Check if the newsletter checkbox is selected
if (!empty($this->requestStack->getCurrentRequest()->request->all()["newsletter_subscribed"] ?? "")) {
$email = $customer->getEmail();
$salesChannelId = $customer->getSalesChannelId();
$hash = bin2hex(random_bytes(16));
// Prepare the data for the newsletter recipient
$newsletterData = [
'email' => $email,
'salutationId' => $customer->getSalutationId(),
'firstName' => $customer->getFirstName(),
'lastName' => $customer->getLastName(),
'salesChannelId' => $salesChannelId,
'status' => "optIn",
'hash' => $hash,
];
// Save the newsletter subscription
$this->newsletterRecipientRepository->upsert([$newsletterData], Context::createDefaultContext());
$this->customerProducer->confirmContact($customer, $event->getContext(), $event->getSalesChannelId());
}
}
}