custom/plugins/NetiNextOrderFields/src/Subscriber/Checkout.php line 79

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace NetInventors\NetiNextOrderFields\Subscriber;
  4. use NetInventors\NetiNextOrderFields\Core\Content\OrderFields\OrderFieldsEntity;
  5. use NetInventors\NetiNextOrderFields\Service\OrderAttributes;
  6. use NetInventors\NetiNextOrderFields\Service\PluginConfig;
  7. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  8. use Shopware\Core\Checkout\Order\OrderEntity;
  9. use Shopware\Core\Content\MailTemplate\Service\Event\MailBeforeValidateEvent;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  15. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\HttpFoundation\RequestStack;
  18. class Checkout implements EventSubscriberInterface
  19. {
  20.     /**
  21.      * @var EntityRepositoryInterface
  22.      */
  23.     private $orderFieldRepository;
  24.     /**
  25.      * @var EntityRepositoryInterface
  26.      */
  27.     private $orderFieldsOrderRepository;
  28.     /**
  29.      * @var EntityRepositoryInterface
  30.      */
  31.     private $orderFieldsOrderValueRepository;
  32.     /**
  33.      * @var RequestStack
  34.      */
  35.     private $requestStack;
  36.     /**
  37.      * @var OrderAttributes
  38.      */
  39.     private $orderAttributeService;
  40.     /**
  41.      * @var PluginConfig
  42.      */
  43.     private $pluginConfig;
  44.     public function __construct(
  45.         EntityRepositoryInterface $orderFieldRepository,
  46.         EntityRepositoryInterface $orderFieldsOrderRepository,
  47.         EntityRepositoryInterface $orderFieldsOrderValueRepository,
  48.         RequestStack $requestStack,
  49.         OrderAttributes $orderAttributeService,
  50.         PluginConfig $pluginConfig
  51.     ) {
  52.         $this->orderFieldRepository            $orderFieldRepository;
  53.         $this->orderFieldsOrderRepository      $orderFieldsOrderRepository;
  54.         $this->orderFieldsOrderValueRepository $orderFieldsOrderValueRepository;
  55.         $this->requestStack                    $requestStack;
  56.         $this->orderAttributeService           $orderAttributeService;
  57.         $this->pluginConfig                    $pluginConfig;
  58.     }
  59.     public static function getSubscribedEvents(): array
  60.     {
  61.         return [
  62.             CheckoutConfirmPageLoadedEvent::class => 'onConfirmLoaded',
  63.             CheckoutOrderPlacedEvent::class       => 'onOrderPlaced',
  64.             MailBeforeValidateEvent::class        => 'beforeMailValidated',
  65.         ];
  66.     }
  67.     public function onConfirmLoaded(CheckoutConfirmPageLoadedEvent $event): void
  68.     {
  69.         if (!$this->pluginConfig->isActive()) {
  70.             return;
  71.         }
  72.         $salesChannelContext $event->getSalesChannelContext();
  73.         $salesChannelId      $salesChannelContext->getSalesChannel()->getId();
  74.         $criteria = (new Criteria())->addFilter(
  75.             new EqualsFilter('salesChannelId'$salesChannelId),
  76.             new EqualsFilter('active'1)
  77.         )
  78.             ->addAssociation('customerGroups')
  79.             ->addSorting(new FieldSorting('position'));
  80.         $orderFields $this->orderFieldRepository->search($criteria$event->getContext());
  81.         $event->getPage()->addExtension('neti_order_fields'$orderFields);
  82.     }
  83.     public function onOrderPlaced(CheckoutOrderPlacedEvent $event): void
  84.     {
  85.         if (!$this->pluginConfig->isActive()) {
  86.             return;
  87.         }
  88.         $request   $this->requestStack->getCurrentRequest();
  89.         $parameter $request->request->get('orderField') ?? [];
  90.         foreach ($parameter as $key => $value) {
  91.             if ($value === '') {
  92.                 unset($parameter[$key]);
  93.             }
  94.         }
  95.         if ([] === $parameter || !\is_array($parameter)) {
  96.             return;
  97.         }
  98.         $orderId            $event->getOrder()->getId();
  99.         $criteria           = new Criteria(array_keys($parameter));
  100.         $orderFieldEntities $this->orderFieldRepository->search($criteria$event->getContext())->getElements();
  101.         $orderFields        = [];
  102.         $orderFieldsValues  = [];
  103.         /** @var OrderFieldsEntity $entity */
  104.         foreach ($orderFieldEntities as $id => $entity) {
  105.             $orderFields[$id]['label']          = $entity->getTranslation('label');
  106.             $orderFields[$id]['name']           = $entity->getName();
  107.             $orderFields[$id]['type']           = $entity->getType();
  108.             $orderFields[$id]['orderId']        = $orderId;
  109.             $orderFields[$id]['orderVersionId'] = $event->getOrder()->getVersionId();
  110.             $orderFields[$id]['orderFieldId']   = $entity->getId();
  111.             $orderFields[$id]['versionId']      = $event->getOrder()->getVersionId();
  112.             $orderFieldsValues[$id]['value'] = substr($parameter[$id], 0512);
  113.             foreach ($entity->getExtension('netiOrderFieldsVal')->getElements() as $value) {
  114.                 if ($value->getValue() === $orderFieldsValues[$id]['value']) {
  115.                     $orderFieldsValues[$id]['valueLabel'] = $value->getTranslated()['label'];
  116.                     break;
  117.                 }
  118.             }
  119.         }
  120.         if ($orderFields === []) {
  121.             return;
  122.         }
  123.         $filterClosure = static function ($arr) {
  124.             return isset($arr['value']) && '' !== $arr['value'];
  125.         };
  126.         $orderFieldsValues array_filter($orderFieldsValues$filterClosure);
  127.         $orderFields       array_intersect_key($orderFields$orderFieldsValues);
  128.         $context           $event->getContext();
  129.         $result            $this->orderFieldsOrderRepository->create(array_values($orderFields), $context);
  130.         /** @var EntityWrittenEvent $event */
  131.         $entityEvent $result->getEvents()->first();
  132.         $entityIds = [];
  133.         foreach ($entityEvent->getIds() as $entry) {
  134.             $entityIds[] = $entry['id'];
  135.         }
  136.         $criteria             = new Criteria($entityIds);
  137.         $orderFieldAttributes $this->orderFieldsOrderRepository->search($criteria$context)->getElements();
  138.         foreach ($orderFieldAttributes as $attribute) {
  139.             $orderFieldsValues[$attribute->getOrderFieldId()]['orderAttributeId'] = $attribute->getId();
  140.             $orderFieldsValues[$attribute->getOrderFieldId()]['orderAttributeVersionId'] = $event->getOrder()->getVersionId();
  141.         }
  142.         $this->orderFieldsOrderValueRepository->create(array_values($orderFieldsValues), $context);
  143.     }
  144.     public function beforeMailValidated(MailBeforeValidateEvent $event)
  145.     {
  146.         if (!$this->pluginConfig->isActive()) {
  147.             return;
  148.         }
  149.         $templateData $event->getTemplateData();
  150.         if (!(isset($templateData['order']) && $templateData['order'] instanceof OrderEntity)) {
  151.             return;
  152.         }
  153.         $order   $templateData['order'];
  154.         $orderId $order->getId();
  155.         $criteria = (new Criteria())->addFilter(new EqualsFilter('orderId'$orderId));
  156.         $context  $event->getContext();
  157.         $orderFields $this->orderFieldsOrderRepository->search(
  158.             $criteria,
  159.             $context
  160.         )->getEntities();
  161.         if ([] === $orderFields->getElements()) {
  162.             return;
  163.         }
  164.         $order->addExtension('netiOrderFieldsOrderAttribute'$orderFields);
  165.         $this->orderAttributeService->getAttributeValues([ $order->getId() => $order ], $context);
  166.     }
  167. }