<?php declare(strict_types=1);
namespace EsmComputer\Storefront\Subscriber;
use Shopware\Core\Checkout\Cart\Order\CartConvertedEvent;
use Shopware\Core\Content\Newsletter\SalesChannel\AbstractNewsletterSubscribeRoute;
use Shopware\Core\Content\Newsletter\SalesChannel\NewsletterSubscribeRoute;
use Shopware\Core\Framework\Validation\DataBag\DataBag;
use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
use Shopware\Storefront\Framework\Routing\RequestTransformer;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class OrderSubscriber implements EventSubscriberInterface
{
private RequestStack $requestStack;
private AbstractNewsletterSubscribeRoute $subscribeRoute;
public function __construct(RequestStack $requestStack, AbstractNewsletterSubscribeRoute $subscribeRoute)
{
$this->requestStack = $requestStack;
$this->subscribeRoute = $subscribeRoute;
}
public static function getSubscribedEvents(): array
{
return [
CartConvertedEvent::class => 'addCustomFieldsToOrder'
];
}
public function addCustomFieldsToOrder(CartConvertedEvent $event): void
{
$orderData = $event->getConvertedCart();
$orderCustomFields = $orderData['customFields'] ?? [];
$customNewsletter = $this->requestStack->getCurrentRequest()->request->get('custom_order_newsletter');
$hasNewsletter = $customNewsletter === 'on';
if ($customNewsletter) {
$orderCustomFields['custom_order_newsletter'] = $hasNewsletter;
}
if ($hasNewsletter) {
$data = new RequestDataBag();
$data->set('storefrontUrl', $this->requestStack->getCurrentRequest()->attributes->get(RequestTransformer::STOREFRONT_URL));
$data->set('email', $event->getSalesChannelContext()->getCustomer()->getEmail());
$data->set('firstName', $event->getSalesChannelContext()->getCustomer()->getFirstName());
$data->set('lastName', $event->getSalesChannelContext()->getCustomer()->getLastName());
$data->set('salutationId', $event->getSalesChannelContext()->getCustomer()->getSalutationId());
$data->set('option', NewsletterSubscribeRoute::OPTION_SUBSCRIBE);
$this->subscribeRoute->subscribe($data, $event->getSalesChannelContext(), false);
}
$orderData['customFields'] = $orderCustomFields;
$event->setConvertedCart($orderData);
}
}