src/V4/EventSubscriber/CustomEventTrigger/CustomEventTriggerPostSetDataOnCreationSubscriber.php line 103

Open in your IDE?
  1. <?php
  2. namespace App\V4\EventSubscriber\CustomEventTrigger;
  3. use App\Form\Type\AbstractViewOrderAwareType;
  4. use App\Service\Serializer\NoNullObjectNormalizer;
  5. use App\V4\Builder\CustomEventTrigger\CustomEventTriggerBuilder;
  6. use App\V4\Entity\CustomEventTrigger;
  7. use App\V4\Model\ChildrenAwareInterface;
  8. use App\V4\Model\Prospect\Prospect;
  9. use App\V4\Model\Quote\Quote;
  10. use App\V4\Repository\CustomEventTriggerRepository;
  11. use App\V4\Transformer\FQCNToShortNameTransformer;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\Form\FormEvent;
  14. use Symfony\Component\Form\FormEvents;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\RequestStack;
  17. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  18. use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
  19. class CustomEventTriggerPostSetDataOnCreationSubscriber implements EventSubscriberInterface
  20. {
  21.     /**
  22.      * @var CustomEventTriggerRepository
  23.      */
  24.     private $customEventTriggerRepository;
  25.     /**
  26.      * @var CustomEventTriggerBuilder
  27.      */
  28.     private $customEventTriggerBuilder;
  29.     /**
  30.      * @var NormalizerInterface
  31.      */
  32.     private $normalizer;
  33.     /**
  34.      * @var RequestStack
  35.      */
  36.     private $requestStack;
  37.     /**
  38.      * @param CustomEventTriggerRepository $customEventTriggerRepository
  39.      * @param CustomEventTriggerBuilder    $customEventTriggerBuilder
  40.      * @param NormalizerInterface          $normalizer
  41.      * @param RequestStack                 $requestStack
  42.      */
  43.     public function __construct(
  44.         CustomEventTriggerRepository $customEventTriggerRepository,
  45.         CustomEventTriggerBuilder $customEventTriggerBuilder,
  46.         NormalizerInterface $normalizer,
  47.         RequestStack $requestStack
  48.     ) {
  49.         $this->customEventTriggerRepository $customEventTriggerRepository;
  50.         $this->customEventTriggerBuilder $customEventTriggerBuilder;
  51.         $this->normalizer $normalizer;
  52.         $this->requestStack $requestStack;
  53.     }
  54.     public static function getSubscribedEvents(): array
  55.     {
  56.         return [
  57.             FormEvents::POST_SET_DATA => 'onPostSetData',
  58.         ];
  59.     }
  60.     /**
  61.      * @param FormEvent $event
  62.      *
  63.      * @return bool
  64.      */
  65.     public function supports(FormEvent $event): bool
  66.     {
  67.         $entity $event->getData();
  68.         if (!$entity instanceof Quote && !$entity instanceof Prospect) {
  69.             return false;
  70.         }
  71.         if ($entity instanceof ChildrenAwareInterface && $entity->isSplit()) {
  72.             return false;
  73.         }
  74.         $request $this->requestStack->getCurrentRequest();
  75.         if ($request instanceof Request
  76.             && $request->query->get('context')
  77.             && AbstractViewOrderAwareType::CONTEXT_SHOW === $request->query->get('context')
  78.         ) {
  79.             return false;
  80.         }
  81.         return true;
  82.     }
  83.     /**
  84.      * @param FormEvent $event
  85.      *
  86.      * @return void
  87.      *
  88.      * @throws ExceptionInterface
  89.      */
  90.     public function onPostSetData(FormEvent $event): void
  91.     {
  92.         if (!$this->supports($event)) {
  93.             return;
  94.         }
  95.         $customEventTriggers $this
  96.             ->customEventTriggerRepository
  97.             ->searchByEntityAndWhenApply(
  98.                 (new FQCNToShortNameTransformer())->transform($event->getForm()->getConfig()->getDataClass()),
  99.                 CustomEventTrigger::WHEN_POST_SET_DATA
  100.             )
  101.         ;
  102.         if (empty($customEventTriggers)) {
  103.             return;
  104.         }
  105.         $initialNormalizedData $this
  106.             ->normalizer
  107.             ->normalize($event->getData(), null, [NoNullObjectNormalizer::CONTEXT_IS_DISABLED => true])
  108.         ;
  109.         $dataArrayModified $initialNormalizedData;
  110.         foreach ($customEventTriggers as $customEventTrigger) {
  111.             $dataArrayModified $this
  112.                 ->customEventTriggerBuilder
  113.                 ->getBuilder($dataArrayModified$customEventTrigger)
  114.                 ->apply($dataArrayModified$customEventTrigger)
  115.             ;
  116.         }
  117.         $diff $this->arrayRecursiveDiff($dataArrayModified$initialNormalizedData);
  118.         foreach ($diff as $fieldName => $value) {
  119.             if (!$event->getForm()->has($fieldName)) {
  120.                 continue;
  121.             }
  122.             $event
  123.                 ->getForm()
  124.                 ->get($fieldName)
  125.                 ->setData($value)
  126.             ;
  127.         }
  128.     }
  129.     /**
  130.      * @param $aArray1
  131.      * @param $aArray2
  132.      *
  133.      * @return array
  134.      */
  135.     private function arrayRecursiveDiff($aArray1$aArray2): array
  136.     {
  137.         $aReturn = [];
  138.         foreach ($aArray1 as $mKey => $mValue) {
  139.             if (array_key_exists($mKey$aArray2)) {
  140.                 if (is_array($mValue)) {
  141.                     $aRecursiveDiff $this->arrayRecursiveDiff($mValue$aArray2[$mKey]);
  142.                     if (count($aRecursiveDiff)) {
  143.                         $aReturn[$mKey] = $aRecursiveDiff;
  144.                     }
  145.                     continue;
  146.                 }
  147.                 if ($mValue !== $aArray2[$mKey]) {
  148.                     $aReturn[$mKey] = $mValue;
  149.                 }
  150.                 continue;
  151.             }
  152.             $aReturn[$mKey] = $mValue;
  153.         }
  154.         return $aReturn;
  155.     }
  156. }