<?php declare(strict_types=1);
namespace Ew\CustomRegister\Subscriber;
use Shopware\Core\Checkout\Customer\CustomerEvents;
use Shopware\Core\Checkout\Customer\Event\CustomerRegisterEvent;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class RegisterSubscriber implements EventSubscriberInterface
{
private RequestStack $requestStack;
private EntityRepository $customerRepository;
private EntityRepository $customerAddressRepository;
public function __construct(
RequestStack $requestStack,
EntityRepository $customerRepository,
EntityRepository $customerAddressRepository
) {
$this->requestStack = $requestStack;
$this->customerRepository = $customerRepository;
$this->customerAddressRepository = $customerAddressRepository;
}
public static function getSubscribedEvents(): array
{
return [
CustomerRegisterEvent::class => 'onCustomerRegistration',
CustomerEvents::CUSTOMER_WRITTEN_EVENT => 'onChangeProfile',
CustomerEvents::CUSTOMER_ADDRESS_WRITTEN_EVENT => 'onChangeAddress',
];
}
public function onCustomerRegistration(CustomerRegisterEvent $event)
{
$request = $this->requestStack->getCurrentRequest();
$medicalData = $request->get('medicalData');
$data[] = [
'id' => $event->getCustomer()->getId(),
'customFields' => $medicalData
];
$this->customerRepository->upsert($data, $event->getContext());
}
public function onChangeProfile(EntityWrittenEvent $event)
{
$currentRequest = $this->requestStack->getCurrentRequest();
$updatedOnce = $event->getContext()->getExtension('updatedOnce');
if (!$updatedOnce) {
$requests = $currentRequest->request;
$data = [];
foreach ($requests as $key => $request) {
if ($request != "" && strpos($key, 'medical_info_') !== false) {
$data[$key] = $request;
}
}
if (count($data) > 0) {
$payloads = $event->getPayloads()[0];
$customerId = $payloads['id'];
$bodyHeight = $data['medical_info_bodyHeight'] ?? "";
$bodyWeight = $data['medical_info_bodyWeight'] ?? "";
$bodyDesiredWeight = $data['medical_info_bodyDesiredWeight'] ?? "";
$event->getContext()->setExtensions(['updatedOnce' => new ArrayStruct(['isUpdated' => true])]);
$this->customerRepository->upsert([[
'id' => $customerId,
'customFields' => [
"bodyHeight" => $bodyHeight,
"bodyWeight" => $bodyWeight,
"bodyDesiredWeight" => $bodyDesiredWeight,
]
]], $event->getContext());
}
}
}
public function onChangeAddress(EntityWrittenEvent $event)
{
$currentRequest = $this->requestStack->getCurrentRequest();
$updatedOnce = $event->getContext()->getExtension('updatedOnce');
if (!$updatedOnce) {
$requests = $currentRequest->request;
$data = [];
foreach ($requests as $key => $request) {
if ($request != "" && $key == 'customFields') {
foreach ($request as $customFieldName => $customField) {
$data[$customFieldName] = $customField;
}
}
}
if (count($data) > 0) {
$payloads = $event->getPayloads()[0];
$addressId = $payloads['id'];
$houseNumber = $data['house_number'] ?? "";
$event->getContext()->setExtensions(['updatedOnce' => new ArrayStruct(['isUpdated' => true])]);
$this->customerAddressRepository->upsert([[
'id' => $addressId,
'customFields' => [
"house_number" => $houseNumber,
]
]], $event->getContext());
}
}
}
}