<?php declare(strict_types=1);
namespace Bss\CheckoutCustomField\Subscriber;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Content\MailTemplate\Service\Event\MailBeforeValidateEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
class OrderPlacedEventSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private $orderRepository;
/**
* @var RequestStack
*/
private $request;
/**
* @var SystemConfigService
*/
protected $systemConfig;
public function __construct(
SystemConfigService $systemConfig,
RequestStack $request,
EntityRepositoryInterface $orderRepository
)
{
$this->systemConfig = $systemConfig;
$this->request = $request;
$this->orderRepository = $orderRepository;
}
public static function getSubscribedEvents()
{
return [
CheckoutOrderPlacedEvent::class => 'orderPlaced',
MailBeforeValidateEvent::class => 'sendMail'
];
}
public function sendMail(MailBeforeValidateEvent $event): void
{
if ($this->systemConfig->get('BssCheckoutCustomField.config.active')) {
$templateData = $event->getTemplateData();
$orderNumber = 0;
if (isset($templateData['order'])) {
if (is_object($templateData['order'])) {
$orderNumber = $templateData['order']->getOrderNumber();
} else {
if (isset($templateData['order']['orderNumber'])) {
$orderNumber = $templateData['order']['orderNumber'];
}
}
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('orderNumber', $orderNumber));
$order = $this->orderRepository->search($criteria, $event->getContext())->first();
if (!$order) {
return;
}
$customFields = $order->getCustomFields();
if (isset($customFields['bssCustomFields']) && $customFields['bssCustomFields']) {
$templateData['bssCustomFields'] = $customFields['bssCustomFields'];
}
$event->setTemplateData($templateData);
}
}
public function orderPlaced(CheckoutOrderPlacedEvent $event): void
{
if ($this->systemConfig->get('BssCheckoutCustomField.config.active')) {
$currentRequest = $this->request->getCurrentRequest();
$requests = $currentRequest->request;
$data = [];
$index = 0;
foreach ($requests as $key => $request) {
if ($request != "" && strpos($key, '_bsscf_') !== false) {
$newKeys = explode("_bsscf_", $key);
$label = $this->getKeyLevel($newKeys, 1);
$title = $this->getKeyLevel($newKeys, 2);
$type = $this->getKeyLevel($newKeys, 3);
!isset($data[$label]) ? $data[$label] = [] : null;
!isset($data[$label][$index]) ? $data[$label][$index] = [] : null;
$data[$label][$index]['data'] = $request;
$data[$label][$index]['type'] = $type;
$data[$label][$index]['title'] = $title;
$index++;
}
}
if (!empty($data)) {
$this->orderRepository->update([
[
'id' => $event->getOrder()->getId(),
'customFields' => [
'bssCustomFields' => $data,
]
]
], $event->getContext());
}
}
}
public function getKeyLevel($newKeys, $level)
{
$keyLevel = '';
foreach ($newKeys as $newKey) {
if (strpos($newKey, 'bsscflabel_') !== false && $level == 1) {
$keyLevel = str_replace('bsscflabel_', '', $newKey);
}
if (strpos($newKey, 'bsscflobalf_') !== false && $level == 2) {
$keyLevel = str_replace('bsscflobalf_', '', $newKey);
}
if (strpos($newKey, 'bsscfname_') !== false && $level == 3) {
$keyLevel = str_replace('bsscfname_', '', $newKey);
}
}
return $keyLevel;
}
}