src/Form/JsonType.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Service\JsonFormManager;
  4. use App\Service\ProcessFormService;
  5. use Exception;
  6. use Symfony\Component\Form\AbstractType;
  7. use Symfony\Component\Form\Exception\InvalidConfigurationException;
  8. use Symfony\Component\Form\Form;
  9. use Symfony\Component\Form\FormBuilderInterface;
  10. use Symfony\Component\Form\FormEvent;
  11. use Symfony\Component\Form\FormEvents;
  12. use Symfony\Component\OptionsResolver\OptionsResolver;
  13. use Symfony\Component\Validator\Constraints as Assert;
  14. class JsonType extends AbstractType
  15. {
  16.     /** @var ProcessFormService $processFormService */
  17.     private $processFormService;
  18.     /**
  19.      * @param ProcessFormService $processFormService
  20.      */
  21.     public function __construct(ProcessFormService $processFormService)
  22.     {
  23.         $this->processFormService $processFormService;
  24.     }
  25.     /**
  26.      * @param FormBuilderInterface $builder
  27.      * @param array $options
  28.      * @return void
  29.      * @throws Exception
  30.      */
  31.     public function buildForm(FormBuilderInterface $builder, array $options): void
  32.     {
  33.         $manager $options['manager'];
  34.         $formLead $options['form_lead'];
  35.         if (!$manager instanceof JsonFormManager) {
  36.             throw new InvalidConfigurationException;
  37.         }
  38.         foreach ($manager->getFormDefinition() as $formGroup) {
  39.             $formGroup['options']['attr'] = $formGroup['attr'];
  40.             $groupItem $builder->create(
  41.                 $formGroup['name'],
  42.                 $formGroup['class'],
  43.                 $formGroup['options']
  44.             );
  45.             foreach ($formGroup['fields'] as $field) {
  46.                 $groupItem->add(
  47.                     $field['name'],
  48.                     $field['class'],
  49.                     $this->processFormService->buildOptions($field$formLead)
  50.                 );
  51.             }
  52.             $builder->add($groupItem);
  53.         }
  54.         $builder->addEventListener(FormEvents::PRE_SUBMIT, [$this'onPreSubmit']);
  55.     }
  56.     /**
  57.      * @param OptionsResolver $resolver
  58.      * @return void
  59.      */
  60.     public function configureOptions(OptionsResolver $resolver): void
  61.     {
  62.         $resolver->setDefaults([
  63.             'manager' => null,
  64.             'form_lead' => null,
  65.             'csrf_protection' => false
  66.         ]);
  67.     }
  68.     /**
  69.      * @param FormEvent $event
  70.      * @return void
  71.      */
  72.     public function onPreSubmit(FormEvent $event): void
  73.     {
  74.         /** @var Form $form */
  75.         $form $event->getForm();
  76.         $data $event->getData();
  77.         foreach ($form->all() as $group) {
  78.             /** @var Form $child */
  79.             foreach ($group as $child) {
  80.                 $childName $child->getName();
  81.                 $type get_class($child->getConfig()->getType()->getInnerType());
  82.                 $options $child->getConfig()->getOptions();
  83.                 foreach ($options['attr'] as $key => $attr) {
  84.                     if (strpos($key'incompatible-with') === false) {
  85.                         continue;
  86.                     }
  87.                     $incompatibleName $this->processFormService->getExplodedIncompatibleField($attr);
  88.                     $groupName $incompatibleName[0];
  89.                     $incompatibleFieldName JsonFormManager::buildFieldName($incompatibleName[1], $incompatibleName[2]);
  90.                     $incompatibleField $form->get($groupName)->get($incompatibleFieldName);
  91.                     $incompatibleGroupLabel $form->get($groupName)->getConfig()->getOption('label');
  92.                     $incompatibleFieldLabel $incompatibleField->getConfig()->getOption('label');
  93.                     $notEqualOptions = [
  94.                         'value' => $data[$groupName][$incompatibleFieldName]
  95.                     ];
  96.                     $message 'Este valor debe ser distinto al de ';
  97.                     if ($incompatibleFieldLabel) {
  98.                         $message .= $incompatibleFieldLabel;
  99.                         $notEqualOptions['message'] = $message;
  100.                     }
  101.                     if ($incompatibleGroupLabel) {
  102.                         $message .= " (Grupo: $incompatibleGroupLabel)";
  103.                         $notEqualOptions['message'] = $message;
  104.                     }
  105.                     $options['constraints'] = new Assert\NotEqualTo($notEqualOptions);
  106.                     $group->add($childName$type$options);
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }