<?php
namespace CioFormBuilder\Subscriber;
use CioFormBuilder\Definition\CioForm\CioFormEntity;
use CioFormBuilder\Model\CioFormBuilder;
use CioProductCustomerInputs\CioProductCustomerInputs;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Shopware\Core\Checkout\Customer\CustomerEntity;
use Shopware\Core\Content\Product\Aggregate\ProductManufacturer\ProductManufacturerDefinition;
use Shopware\Core\Content\Product\ProductEntity;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Storefront\Event\StorefrontRenderEvent;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPage;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use function PHPUnit\Framework\isInstanceOf;
class CheckoutConfirmSubscriber implements EventSubscriberInterface
{
private EntityRepository $productRepository;
private EntityRepository $cioFormRepository;
private ?Request $request;
private EntityRepository $orderRepository;
private EntityRepository $productManufacturerRepository;
public function __construct(RequestStack $requestStack, EntityRepository $productRepository, EntityRepository $cioFormRepository, EntityRepository $orderRepository, EntityRepository $productManufacturerRepository)
{
$this->request = $requestStack->getCurrentRequest();
$this->productRepository = $productRepository;
$this->cioFormRepository = $cioFormRepository;
$this->orderRepository = $orderRepository;
$this->productManufacturerRepository = $productManufacturerRepository;
}
public static function getSubscribedEvents(): array
{
return [
StorefrontRenderEvent::class => 'onStorefrontRenderEvent',
CheckoutOrderPlacedEvent::class => 'onCheckoutOrderPlacedEvent',
CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinishPageLoadedEvent'
];
}
public function onStorefrontRenderEvent(StorefrontRenderEvent $event): void
{
$formToManufacturer = [];
$manufacturerForms = [];
$customer = $event->getSalesChannelContext()->getCustomer();
if ($customer instanceof CustomerEntity) {
if (is_array($event->getParameters()) && key_exists('page', $event->getParameters())) {
$page = $event->getParameters()['page'];
if ($page instanceof CheckoutConfirmPage) {
$items = $page->getCart()->getLineItems();
foreach ($items as $item) {
$productNumber = $item->getPayload()['productNumber'];
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('productNumber', $productNumber));
$criteria->addAssociation('manufacturer');
$criteria->addAssociation('formData');
$criteria->addAssociation('fields');
/** @var ?ProductEntity $productEntity */
$productEntity = $this->productRepository->search($criteria, $event->getContext())->first();
if ($productEntity && $productEntity->getManufacturer()) {
$manufacturerEntity = $productEntity->getManufacturer();
if (!is_null($manufacturerEntity->getExtension('formData'))) {
/** @var CioFormEntity $formBuilderEntity */
$formBuilderEntity = $manufacturerEntity->getExtension('formData');
if (!isset($manufacturerForms[$manufacturerEntity->getId()])) {
$formCriteria = new Criteria();
$formCriteria->addFilter(new EqualsFilter('id', $formBuilderEntity->getId()));
$formCriteria->addAssociation('fields');
$formCriteria->addAssociation('mailTemplate');
$formEntity = $this->cioFormRepository->search($formCriteria, $event->getContext())->first();
$formBuilder = new CioFormBuilder($formEntity);
if (!isset($manufacturerForms[$manufacturerEntity->getId()])) {
$manufacturerForms[$manufacturerEntity->getId()] = $formBuilder;
}
if (!isset($formToManufacturer[$formEntity->getId()]) || !in_array($formEntity->getId() . '_' . $manufacturerEntity->getId(), $formToManufacturer)) {
$formToManufacturer[$formEntity->getId()][] = $formEntity->getId() . '_' . $manufacturerEntity->getId();
}
}
}
}
}
}
}
}
$event->setParameter('manufacturerForms', $manufacturerForms);
$event->setParameter('formToManufacturer', $formToManufacturer);
}
public function onCheckoutOrderPlacedEvent(CheckoutOrderPlacedEvent $event): void
{
$request = $this->request->request;
if ($this->request && $request->get('cioFormManufactorerIds')) {
$cioFormManufactorerIds = (array)$request->get('cioFormManufactorerIds');
$manufacturerForm = [];
$i = 0;
foreach ($cioFormManufactorerIds as $formManIds) {
$tmp = explode('_', $formManIds);
if (count($tmp) == 2) {
$formEntity = $this->getCioFormById($tmp[0], $event->getContext());
if (!is_null($formEntity)) {
$fields = $formEntity->getFields();
$manufacturerForm[$i] = [
'form' => [
'id' => $tmp[0],
'name' => $formEntity->getName(),
'description' => $formEntity->getDescription()
],
'manufacturer' => [
'id' => $tmp[1],
'name' => $this->getManufacturerNameById($tmp[1], $event->getContext())
]
];
foreach ($fields as $key => $field) {
$manufacturerForm[$i]['fields'][] = [
'id' => $key,
'name' => $field->getLabel(),
'value' => $request->get($key),
'required' => $field->getRequired(),
'type' => $field->getType(),
'position' => $field->getPosition()
];
}
}
$i++;
}
}
$order = $event->getOrder();
$customFields = $order->getCustomFields();
$customFields['dynamicForms'] = $manufacturerForm;
$event->getOrder()->setCustomFields($customFields);
try {
$this->orderRepository->update([
[
'id' => $event->getOrder()->getId(),
'customFields' => $customFields
]
], $event->getContext());
} catch (\Throwable $e) {
}
}
}
public function getCioFormById(string $formId, $context): ?CioFormEntity
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $formId));
$criteria->addAssociation('fields');
$criteria->addAssociation('mailTemplate');
$formEntity = $this->cioFormRepository->search($criteria, $context)->first();
if ($formEntity instanceof CioFormEntity) {
return $formEntity;
}
return null;
}
public function onCheckoutFinishPageLoadedEvent(CheckoutFinishPageLoadedEvent $event)
{
$orderEntity = $event->getPage()->getOrder();
$customFields = $orderEntity->getCustomFields();
$manufacturerForms = [];
if (isset($customFields['formulare'])) {
$formData = [];
foreach ($customFields['formulare'] as $manufacturerId => $form) {
$formEntity = $this->getCioFormById($form['formId'], $event->getContext());
$formBuilder = new CioFormBuilder($formEntity);
$manufacturerForms[$manufacturerId] = $formBuilder->buildEmailDataFromArray($form);
$formData[$formEntity->getId()] = $form;
}
$event->getPage()->assign([
'formData' => $formData,
'manufacturerForms' => $manufacturerForms
]);
}
}
private function getManufacturerNameById(string $manufacturerId, Context $context)
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $manufacturerId));
$formEntity = $this->productManufacturerRepository->search($criteria, $context)->first();
if ($formEntity instanceof CioFormEntity) {
return $formEntity->getTranslation('name');
}
return null;
}
}