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

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\Model\Tab\Tab;
  11. use App\V4\Model\Task\Task;
  12. use App\V4\Repository\CustomEventTriggerRepository;
  13. use App\V4\Transformer\FQCNToShortNameTransformer;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\Form\FormEvent;
  16. use Symfony\Component\Form\FormEvents;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\RequestStack;
  19. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  20. use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
  21. class CustomEventTriggerPostSetDataOnCreationSubscriber implements EventSubscriberInterface
  22. {
  23.     /**
  24.      * @var CustomEventTriggerRepository
  25.      */
  26.     private $customEventTriggerRepository;
  27.     /**
  28.      * @var CustomEventTriggerBuilder
  29.      */
  30.     private $customEventTriggerBuilder;
  31.     /**
  32.      * @var NormalizerInterface
  33.      */
  34.     private $normalizer;
  35.     /**
  36.      * @var RequestStack
  37.      */
  38.     private $requestStack;
  39.     /**
  40.      * @param CustomEventTriggerRepository $customEventTriggerRepository
  41.      * @param CustomEventTriggerBuilder    $customEventTriggerBuilder
  42.      * @param NormalizerInterface          $normalizer
  43.      * @param RequestStack                 $requestStack
  44.      */
  45.     public function __construct(
  46.         CustomEventTriggerRepository $customEventTriggerRepository,
  47.         CustomEventTriggerBuilder $customEventTriggerBuilder,
  48.         NormalizerInterface $normalizer,
  49.         RequestStack $requestStack
  50.     ) {
  51.         $this->customEventTriggerRepository $customEventTriggerRepository;
  52.         $this->customEventTriggerBuilder $customEventTriggerBuilder;
  53.         $this->normalizer $normalizer;
  54.         $this->requestStack $requestStack;
  55.     }
  56.     public static function getSubscribedEvents(): array
  57.     {
  58.         return [
  59.             FormEvents::POST_SET_DATA => 'onPostSetData',
  60.         ];
  61.     }
  62.     /**
  63.      * @param FormEvent $event
  64.      *
  65.      * @return bool
  66.      */
  67.     public function supports(FormEvent $event): bool
  68.     {
  69.         $entity $event->getData();
  70.         if (!$entity instanceof Quote && !$entity instanceof Prospect && !$entity instanceof Task) {
  71.             return false;
  72.         }
  73.         if ($entity instanceof ChildrenAwareInterface && $entity->isSplit()) {
  74.             return false;
  75.         }
  76.         $request $this->requestStack->getCurrentRequest();
  77.         if ($request instanceof Request
  78.             && $request->query->get('context')
  79.             && AbstractViewOrderAwareType::CONTEXT_SHOW === $request->query->get('context')
  80.         ) {
  81.             return false;
  82.         }
  83.         return true;
  84.     }
  85.     /**
  86.      * @param FormEvent $event
  87.      *
  88.      * @return void
  89.      *
  90.      * @throws ExceptionInterface
  91.      */
  92.     public function onPostSetData(FormEvent $event): void
  93.     {
  94.         if (!$this->supports($event)) {
  95.             return;
  96.         }
  97.         $customEventTriggers $this
  98.             ->customEventTriggerRepository
  99.             ->searchByEntityAndWhenApply(
  100.                 (new FQCNToShortNameTransformer())->transform($event->getForm()->getConfig()->getDataClass()),
  101.                 CustomEventTrigger::WHEN_POST_SET_DATA
  102.             )
  103.         ;
  104.         if (empty($customEventTriggers)) {
  105.             return;
  106.         }
  107.         $initialNormalizedData $this
  108.             ->normalizer
  109.             ->normalize($event->getData(), null, [NoNullObjectNormalizer::CONTEXT_IS_DISABLED => true])
  110.         ;
  111.         $request $this->requestStack->getCurrentRequest();
  112.         $currentTab Tab::NATIVE;
  113.         if ($request instanceof Request && $request->query->get('tabId')) {
  114.             $currentTab $request->query->get('tabId');
  115.         }
  116.         $dataArrayModified $initialNormalizedData;
  117.         foreach ($customEventTriggers as $customEventTrigger) {
  118.             if (empty($customEventTrigger->getTabs()) || in_array($currentTab$customEventTrigger->getTabs(), true)) {
  119.                 $dataArrayModified $this
  120.                     ->customEventTriggerBuilder
  121.                     ->getBuilder($dataArrayModified$customEventTrigger)
  122.                     ->apply($dataArrayModified$customEventTrigger)
  123.                 ;
  124.             }
  125.         }
  126.         $diff $this->arrayRecursiveDiff($dataArrayModified$initialNormalizedData);
  127.         foreach ($diff as $fieldName => $value) {
  128.             if ('specificFields' === $fieldName) {
  129.                 foreach ($value as $specificField) {
  130.                     $realFieldName 'sf_'.$specificField['fieldId'];
  131.                     if ($event->getForm()->has($realFieldName)) {
  132.                         $sfForm $event->getForm()->get($realFieldName);
  133.                         $options $sfForm->getConfig()->getOptions();
  134.                         $options['data'] = $specificField['value'];
  135.                         $event->getForm()->remove($realFieldName);
  136.                         $event->getForm()->add(
  137.                             $realFieldName,
  138.                             get_class($sfForm->getConfig()->getType()->getInnerType()),
  139.                             $options
  140.                         );
  141.                     }
  142.                 }
  143.                 continue;
  144.             }
  145.             if ($event->getForm()->has($fieldName)) {
  146.                 $event->getForm()->get($fieldName)->setData($value);
  147.             }
  148.         }
  149.     }
  150.     private function arrayRecursiveDiff($aArray1$aArray2): array
  151.     {
  152.         $aReturn = [];
  153.         foreach ($aArray1 as $mKey => $mValue) {
  154.             if (array_key_exists($mKey$aArray2)) {
  155.                 if (is_array($mValue) && 'value' !== $mKey) {
  156.                     $aRecursiveDiff $this->arrayRecursiveDiff($mValue$aArray2[$mKey]);
  157.                     if (!empty($aRecursiveDiff)) {
  158.                         $aReturn[$mKey] = $aRecursiveDiff;
  159.                     }
  160.                     continue;
  161.                 }
  162.                 if ($mValue !== $aArray2[$mKey]) {
  163.                     //Traitement particulier pour les specificFields
  164.                     if (isset($aArray1['fieldId']) && isset($aArray2['fieldId']) && $aArray1['fieldId'] === $aArray2['fieldId']) {
  165.                         $aReturn['sf_'.$aArray1['fieldId']] = $mValue;
  166.                         continue;
  167.                     }
  168.                     $aReturn[$mKey] = $mValue;
  169.                 }
  170.                 continue;
  171.             }
  172.             $aReturn[$mKey] = $mValue;
  173.         }
  174.         return $aReturn;
  175.     }
  176. }