custom/static-plugins/CioFormBuilder/src/Subscriber/CheckoutConfirmSubscriber.php line 201

Open in your IDE?
  1. <?php
  2. namespace CioFormBuilder\Subscriber;
  3. use CioFormBuilder\Definition\CioForm\CioFormEntity;
  4. use CioFormBuilder\Model\CioFormBuilder;
  5. use CioProductCustomerInputs\CioProductCustomerInputs;
  6. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  7. use Shopware\Core\Checkout\Customer\CustomerEntity;
  8. use Shopware\Core\Content\Product\Aggregate\ProductManufacturer\ProductManufacturerDefinition;
  9. use Shopware\Core\Content\Product\ProductEntity;
  10. use Shopware\Core\Framework\Context;
  11. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  16. use Shopware\Storefront\Event\StorefrontRenderEvent;
  17. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPage;
  18. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\RequestStack;
  22. use function PHPUnit\Framework\isInstanceOf;
  23. class CheckoutConfirmSubscriber implements EventSubscriberInterface
  24. {
  25.     private EntityRepository $productRepository;
  26.     private EntityRepository $cioFormRepository;
  27.     private ?Request $request;
  28.     private EntityRepository $orderRepository;
  29.     private EntityRepository $productManufacturerRepository;
  30.     public function __construct(RequestStack $requestStackEntityRepository $productRepositoryEntityRepository $cioFormRepositoryEntityRepository $orderRepositoryEntityRepository $productManufacturerRepository)
  31.     {
  32.         $this->request $requestStack->getCurrentRequest();
  33.         $this->productRepository $productRepository;
  34.         $this->cioFormRepository $cioFormRepository;
  35.         $this->orderRepository $orderRepository;
  36.         $this->productManufacturerRepository $productManufacturerRepository;
  37.     }
  38.     public static function getSubscribedEvents(): array
  39.     {
  40.         return [
  41.             StorefrontRenderEvent::class => 'onStorefrontRenderEvent',
  42.             CheckoutOrderPlacedEvent::class => 'onCheckoutOrderPlacedEvent',
  43.             CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinishPageLoadedEvent'
  44.         ];
  45.     }
  46.     public function onStorefrontRenderEvent(StorefrontRenderEvent $event): void
  47.     {
  48.         $formToManufacturer = [];
  49.         $manufacturerForms = [];
  50.         $customer $event->getSalesChannelContext()->getCustomer();
  51.         if ($customer instanceof CustomerEntity) {
  52.             if (is_array($event->getParameters()) && key_exists('page'$event->getParameters())) {
  53.                 $page $event->getParameters()['page'];
  54.                 if ($page instanceof CheckoutConfirmPage) {
  55.                     $items $page->getCart()->getLineItems();
  56.                     foreach ($items as $item) {
  57.                         $productNumber $item->getPayload()['productNumber'];
  58.                         $criteria = new Criteria();
  59.                         $criteria->addFilter(new EqualsFilter('productNumber'$productNumber));
  60.                         $criteria->addAssociation('manufacturer');
  61.                         $criteria->addAssociation('formData');
  62.                         $criteria->addAssociation('fields');
  63.                         /** @var ?ProductEntity $productEntity */
  64.                         $productEntity $this->productRepository->search($criteria$event->getContext())->first();
  65.                         if ($productEntity && $productEntity->getManufacturer()) {
  66.                             $manufacturerEntity $productEntity->getManufacturer();
  67.                             if (!is_null($manufacturerEntity->getExtension('formData'))) {
  68.                                 /** @var CioFormEntity $formBuilderEntity */
  69.                                 $formBuilderEntity $manufacturerEntity->getExtension('formData');
  70.                                 if (!isset($manufacturerForms[$manufacturerEntity->getId()])) {
  71.                                     $formCriteria = new Criteria();
  72.                                     $formCriteria->addFilter(new EqualsFilter('id'$formBuilderEntity->getId()));
  73.                                     $formCriteria->addAssociation('fields');
  74.                                     $formCriteria->addAssociation('mailTemplate');
  75.                                     $formEntity $this->cioFormRepository->search($formCriteria$event->getContext())->first();
  76.                                     $formBuilder = new CioFormBuilder($formEntity);
  77.                                     if (!isset($manufacturerForms[$manufacturerEntity->getId()])) {
  78.                                         $manufacturerForms[$manufacturerEntity->getId()] = $formBuilder;
  79.                                     }
  80.                                     if (!isset($formToManufacturer[$formEntity->getId()]) || !in_array($formEntity->getId() . '_' $manufacturerEntity->getId(), $formToManufacturer)) {
  81.                                         $formToManufacturer[$formEntity->getId()][] = $formEntity->getId() . '_' $manufacturerEntity->getId();
  82.                                     }
  83.                                 }
  84.                             }
  85.                         }
  86.                     }
  87.                 }
  88.             }
  89.         }
  90.         $event->setParameter('manufacturerForms'$manufacturerForms);
  91.         $event->setParameter('formToManufacturer'$formToManufacturer);
  92.     }
  93.     public function onCheckoutOrderPlacedEvent(CheckoutOrderPlacedEvent $event): void
  94.     {
  95.         $request $this->request->request;
  96.         if ($this->request && $request->get('cioFormManufactorerIds')) {
  97.             $cioFormManufactorerIds = (array)$request->get('cioFormManufactorerIds');
  98.             $manufacturerForm = [];
  99.             $i 0;
  100.             foreach ($cioFormManufactorerIds as $formManIds) {
  101.                 $tmp explode('_'$formManIds);
  102.                 if (count($tmp) == 2) {
  103.                     $formEntity $this->getCioFormById($tmp[0], $event->getContext());
  104.                     if (!is_null($formEntity)) {
  105.                         $fields $formEntity->getFields();
  106.                         $manufacturerForm[$i] = [
  107.                             'form' => [
  108.                                 'id' => $tmp[0],
  109.                                 'name' => $formEntity->getName(),
  110.                                 'description' => $formEntity->getDescription()
  111.                             ],
  112.                             'manufacturer' => [
  113.                                 'id' => $tmp[1],
  114.                                 'name' => $this->getManufacturerNameById($tmp[1], $event->getContext())
  115.                             ]
  116.                         ];
  117.                         foreach ($fields as $key => $field) {
  118.                             $manufacturerForm[$i]['fields'][] = [
  119.                                 'id' => $key,
  120.                                 'name' => $field->getLabel(),
  121.                                 'value' => $request->get($key),
  122.                                 'required' => $field->getRequired(),
  123.                                 'type' => $field->getType(),
  124.                                 'position' => $field->getPosition()
  125.                             ];
  126.                         }
  127.                     }
  128.                     $i++;
  129.                 }
  130.             }
  131.             $order $event->getOrder();
  132.             $customFields $order->getCustomFields();
  133.             $customFields['dynamicForms'] = $manufacturerForm;
  134.             $event->getOrder()->setCustomFields($customFields);
  135.             try {
  136.                 $this->orderRepository->update([
  137.                     [
  138.                         'id' => $event->getOrder()->getId(),
  139.                         'customFields' => $customFields
  140.                     ]
  141.                 ], $event->getContext());
  142.             } catch (\Throwable $e) {
  143.             }
  144.         }
  145.     }
  146.     public function getCioFormById(string $formId$context): ?CioFormEntity
  147.     {
  148.         $criteria = new Criteria();
  149.         $criteria->addFilter(new EqualsFilter('id'$formId));
  150.         $criteria->addAssociation('fields');
  151.         $criteria->addAssociation('mailTemplate');
  152.         $formEntity $this->cioFormRepository->search($criteria$context)->first();
  153.         if ($formEntity instanceof CioFormEntity) {
  154.             return $formEntity;
  155.         }
  156.         return null;
  157.     }
  158.     public function onCheckoutFinishPageLoadedEvent(CheckoutFinishPageLoadedEvent $event)
  159.     {
  160.         $orderEntity $event->getPage()->getOrder();
  161.         $customFields $orderEntity->getCustomFields();
  162.         $manufacturerForms = [];
  163.         if (isset($customFields['formulare'])) {
  164.             $formData = [];
  165.             foreach ($customFields['formulare'] as $manufacturerId => $form) {
  166.                 $formEntity $this->getCioFormById($form['formId'], $event->getContext());
  167.                 $formBuilder = new CioFormBuilder($formEntity);
  168.                 $manufacturerForms[$manufacturerId] = $formBuilder->buildEmailDataFromArray($form);
  169.                 $formData[$formEntity->getId()] = $form;
  170.             }
  171.             $event->getPage()->assign([
  172.                 'formData' => $formData,
  173.                 'manufacturerForms' => $manufacturerForms
  174.             ]);
  175.         }
  176.     }
  177.     private function getManufacturerNameById(string $manufacturerIdContext $context)
  178.     {
  179.         $criteria = new Criteria();
  180.         $criteria->addFilter(new EqualsFilter('id'$manufacturerId));
  181.         $formEntity $this->productManufacturerRepository->search($criteria$context)->first();
  182.         if ($formEntity instanceof CioFormEntity) {
  183.             return $formEntity->getTranslation('name');
  184.         }
  185.         return null;
  186.     }
  187. }