src/EventSubscriber/ViewOrdersAwareFormTypeEventSubscriber.php line 84

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Form\CustomerConstraints\CustomerConstraintBuilder;
  4. use App\Form\CustomerConstraints\ValueTypeCustomerConstraintBuilder;
  5. use App\Form\Type\AbstractViewOrderAwareType;
  6. use App\Listing\Transformer\ListingResponseTransformer;
  7. use App\Model\ViewOrderInfo\ViewOrderInfo;
  8. use App\Service\ViewOrders\ViewOrdersManager;
  9. use App\V4\Model\Prospect\Prospect;
  10. use Doctrine\Common\Annotations\AnnotationException;
  11. use LogicException;
  12. use ReflectionClass;
  13. use ReflectionException;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\Form\Event\PreSetDataEvent;
  16. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  17. use Symfony\Component\Form\FormEvents;
  18. use Symfony\Component\Form\FormInterface;
  19. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  20. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  21. use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
  22. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  23. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  24. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  25. class ViewOrdersAwareFormTypeEventSubscriber implements EventSubscriberInterface
  26. {
  27.     /**
  28.      * @var ViewOrdersManager
  29.      */
  30.     private $viewOrdersManager;
  31.     /**
  32.      * @var CustomerConstraintBuilder
  33.      */
  34.     private $customerConstraintBuilder;
  35.     /**
  36.      * @param ViewOrdersManager         $viewOrdersManager
  37.      * @param CustomerConstraintBuilder $customerConstraintBuilder
  38.      */
  39.     public function __construct(ViewOrdersManager $viewOrdersManagerCustomerConstraintBuilder $customerConstraintBuilder)
  40.     {
  41.         $this->viewOrdersManager $viewOrdersManager;
  42.         $this->customerConstraintBuilder $customerConstraintBuilder;
  43.     }
  44.     /**
  45.      * @return array
  46.      */
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             FormEvents::PRE_SET_DATA => 'onPreSetData',
  51.         ];
  52.     }
  53.     /**
  54.      * @param PreSetDataEvent $event
  55.      *
  56.      * @return bool
  57.      */
  58.     public function supports(PreSetDataEvent $event): bool
  59.     {
  60.         return $event->getForm()->getConfig()->getType()->getInnerType() instanceof AbstractViewOrderAwareType;
  61.     }
  62.     /**
  63.      * @param PreSetDataEvent $event
  64.      *
  65.      * @return void
  66.      *
  67.      * @throws ClientExceptionInterface
  68.      * @throws DecodingExceptionInterface
  69.      * @throws RedirectionExceptionInterface
  70.      * @throws ReflectionException
  71.      * @throws ServerExceptionInterface
  72.      * @throws TransportExceptionInterface
  73.      * @throws AnnotationException
  74.      * @throws ExceptionInterface
  75.      */
  76.     public function onPreSetData(PreSetDataEvent $event): void
  77.     {
  78.         if (!$this->supports($event)) {
  79.             throw new LogicException(sprintf('%s should not be used with %s as it does not extends %s'__CLASS__get_class($event->getForm()->getConfig()->getType()->getInnerType()), AbstractViewOrderAwareType::class));
  80.         }
  81.         $entity $event->getForm()->getConfig()->getOption(AbstractViewOrderAwareType::FORM_CONFIG_VIEW_ORDER_ENTITY);
  82.         $type $event->getForm()->getConfig()->getOption(AbstractViewOrderAwareType::FORM_CONFIG_VIEW_ORDER_TYPE);
  83.         $subType $event->getForm()->getConfig()->getOption(AbstractViewOrderAwareType::FORM_CONFIG_VIEW_ORDER_ENTITY_TYPE);
  84.         $rc = new ReflectionClass($entity);
  85.         $vo $this->viewOrdersManager->getViewOrders($rc->getShortName(), $type$subType);
  86.         foreach ($vo as $voGroups) {
  87.             foreach ($voGroups->getViewOrderInfos() as $voItem) {
  88.                 $fieldKey $voItem->getFieldKey();
  89.                 if (Prospect::class === $entity) {
  90.                     if (str_starts_with($fieldKey'unmappedAddress_')) {
  91.                         $fieldKey str_replace('unmappedAddress_''contact_mainAddress_'$fieldKey);
  92.                     } elseif (str_starts_with($fieldKey'deliveryAddress_')) {
  93.                         $fieldKey str_replace('deliveryAddress_''contact_deliveryAddress_'$fieldKey);
  94.                     }
  95.                 }
  96.                 $form $this->getFormByFieldKey($event->getForm(), $fieldKey$voItem);
  97.                 if (!$form->has($fieldKey)) {
  98.                     $fieldKeyExploded explode('_'$fieldKey);
  99.                     if ($voItem->isSpecificField() && $form->has('sf_'.$fieldKey)) {
  100.                         $fieldKey 'sf_'.$fieldKey;
  101.                     } elseif ($form->has(end($fieldKeyExploded))) {
  102.                         $fieldKey end($fieldKeyExploded);
  103.                     }
  104.                 }
  105.                 if (!$form->has($fieldKey)) {
  106.                     continue;
  107.                 }
  108.                 foreach ($this->customerConstraintBuilder->getCustomerConstraints() as $customerConstraint) {
  109.                     if ($customerConstraint->supports($form$voItem$fieldKey$event->getData())) {
  110.                         $customerConstraint->build($form$voItem$fieldKey);
  111.                     }
  112.                 }
  113.                 $formItem $form->get($fieldKey);
  114.                 $type get_class($formItem->getConfig()->getType()->getInnerType());
  115.                 $options array_merge(
  116.                     $formItem->getConfig()->getOptions(),
  117.                     [
  118.                         'label' => $formItem->getConfig()->getOption('label') ?? $voItem->getDisplayLabel(),
  119.                     ]
  120.                 );
  121.                 if (ViewOrderInfo::VALUE_TYPE_RICH_TEXT === $voItem->getValueType()) {
  122.                     $type TextareaType::class;
  123.                     $options array_merge($options, [
  124.                         'attr' => [
  125.                             ValueTypeCustomerConstraintBuilder::DATA_SUB_TYPE => ListingResponseTransformer::TYPE_HTML,
  126.                             'rich-text-editor' => 'rich-rich-editor',
  127.                         ],
  128.                     ]);
  129.                 }
  130.                 $form
  131.                     ->remove($fieldKey)
  132.                     ->add(
  133.                         $fieldKey,
  134.                         $type,
  135.                         $options
  136.                     )
  137.                 ;
  138.             }
  139.         }
  140.     }
  141.     /**
  142.      * @param FormInterface $form
  143.      * @param string|null   $fieldKey
  144.      * @param ViewOrderInfo $voItem
  145.      *
  146.      * @return FormInterface
  147.      */
  148.     private function getFormByFieldKey(FormInterface $form, ?string $fieldKeyViewOrderInfo $voItem): FormInterface
  149.     {
  150.         if ($form->has($fieldKey) || ($voItem->isSpecificField() && $form->has('sf_'.$fieldKey))) {
  151.             return $form;
  152.         }
  153.         $fieldKeyExploded explode('_'$fieldKey);
  154.         foreach ($fieldKeyExploded as $fieldPart) {
  155.             if ($form->has($fieldPart) && $fieldPart !== end($fieldKeyExploded)) {
  156.                 $form $form->get($fieldPart);
  157.             }
  158.         }
  159.         return $form;
  160.     }
  161. }