<?php
namespace App\V4\EventSubscriber\CustomEventTrigger;
use App\V4\Builder\CustomEventTrigger\CustomEventTriggerBuilder;
use App\V4\Entity\CustomEventTrigger;
use App\V4\Model\Tab\Tab;
use App\V4\Repository\CustomEventTriggerRepository;
use App\V4\Transformer\FQCNToShortNameTransformer;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class CustomEventTriggerPreSubmitSubscriber implements EventSubscriberInterface
{
/**
* @var CustomEventTriggerRepository
*/
private $customEventTriggerRepository;
/**
* @var CustomEventTriggerBuilder
*/
private $customEventTriggerBuilder;
/**
* @var RequestStack
*/
private $requestStack;
public function __construct(
CustomEventTriggerRepository $customEventTriggerRepository,
CustomEventTriggerBuilder $customEventTriggerBuilder,
RequestStack $requestStack
) {
$this->customEventTriggerRepository = $customEventTriggerRepository;
$this->customEventTriggerBuilder = $customEventTriggerBuilder;
$this->requestStack = $requestStack;
}
public static function getSubscribedEvents(): array
{
return [
FormEvents::PRE_SUBMIT => 'onPreSubmit',
];
}
/**
* @param FormEvent $event
*
* @return void
*/
public function onPreSubmit(FormEvent $event): void
{
$data = $event->getData();
$needToUnsetDataId = false;
if (!isset($data['id'])) {
$entity = $event->getForm()->getData();
if (method_exists($entity, 'getId')) {
$data['id'] = $entity->getId();
$needToUnsetDataId = true;
}
}
$customEventTriggers = $this
->customEventTriggerRepository
->searchByEntityAndWhenApply(
(new FQCNToShortNameTransformer())->transform($event->getForm()->getConfig()->getDataClass()),
CustomEventTrigger::WHEN_PRE_SUBMIT
)
;
$request = $this->requestStack->getCurrentRequest();
$currentTab = Tab::NATIVE;
if ($request instanceof Request && $request->query->get('tabId')) {
$currentTab = $request->query->get('tabId');
}
foreach ($customEventTriggers as $customEventTrigger) {
if (empty($customEventTrigger->getTabs()) || in_array($currentTab, $customEventTrigger->getTabs(), true)) {
$data = $this
->customEventTriggerBuilder
->getBuilder($data, $customEventTrigger)
->apply($data, $customEventTrigger);
}
}
if ($needToUnsetDataId) {
unset($data['id']);
}
$event->setData($data);
}
}