src/Form/BaremaItemType.php line 105

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\Form\AbstractType;
  5. use Symfony\Component\Form\Exception\TransformationFailedException;
  6. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  7. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  8. use Symfony\Component\Form\Extension\Core\Type\TextType;
  9. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  10. use Symfony\Component\Form\FormBuilderInterface;
  11. use Symfony\Component\Form\FormEvent;
  12. use Symfony\Component\Form\FormEvents;
  13. use Symfony\Component\OptionsResolver\OptionsResolver;
  14. use Symfony\Component\Validator\Constraints\Positive;
  15. use Symfony\Component\Validator\Constraints\Range;
  16. class BaremaItemType extends AbstractType implements EventSubscriberInterface
  17. {
  18.     public function buildForm(FormBuilderInterface $builder, array $options)
  19.     {
  20.         $builder
  21.             ->add('ordem'HiddenType::class, [
  22.                 'attr' => [
  23.                     'class' => 'posicao'
  24.                 ]
  25.             ])
  26.             ->add('chave'HiddenType::class)
  27.             ->add('descricao'TextType::class, [
  28.                 'label' => 'Descrição do item',
  29.                 'required' => true,
  30.                 'disabled' => $options['bloqueado']
  31.             ])
  32.             ->add('unidade'TextType::class, [
  33.                 'label' => "Unidade de Avaliação",
  34.                 'required' => true,
  35.                 'disabled' => $options['bloqueado']
  36.             ]);
  37.         if ($options['decimais'] > 0) {
  38.             $builder
  39.                 ->add('pontos'NumberType::class, [
  40.                     'required' => true,
  41.                     'label' => 'Pontos por Unidade',
  42.                     'constraints' => [
  43.                         new Range(['max' => 100]),
  44.                         new Positive()
  45.                     ],
  46.                     'scale' => $options['decimais'],
  47.                     'disabled' => $options['bloqueado']
  48.                 ])
  49.                 ->add('maximo'NumberType::class, [
  50.                     'required' => true,
  51.                     'label' => 'Pontuação Máxima',
  52.                     'constraints' => [
  53.                         new Range(['max' => 100]),
  54.                         new Positive(),
  55.                     ],
  56.                     'scale' => $options['decimais'],
  57.                     'disabled' => $options['bloqueado']
  58.                 ]);
  59.         }
  60.         else {
  61.             $builder
  62.                 ->add('pontos'IntegerType::class, [
  63.                     'required' => true,
  64.                     'label' => 'Pontos por Unidade',
  65.                     'constraints' => [
  66.                         new Range(['min' => 1'max' => 100]),
  67.                     ],
  68.                     'disabled' => $options['bloqueado']
  69.                 ])
  70.                 ->add('maximo'IntegerType::class, [
  71.                     'required' => true,
  72.                     'label' => 'Pontuação Máxima',
  73.                     'constraints' => [
  74.                         new Range(['min' => 1'max' => 100]),
  75.                     ],
  76.                     'disabled' => $options['bloqueado']
  77.                 ]);
  78.         }
  79.         $builder->addEventSubscriber($this);
  80.     }
  81.     public function configureOptions(OptionsResolver $resolver)
  82.     {
  83.         $resolver->setDefaults([
  84.             'bloqueado' => false,
  85.             'decimais' => 0,
  86.         ]);
  87.     }
  88.     public function getBlockPrefix(): string
  89.     {
  90.         return 'BaremaItemType';
  91.     }
  92.     public static function getSubscribedEvents(): array
  93.     {
  94.         return [
  95.             FormEvents::SUBMIT => 'pontuacaoPermitida',
  96.         ];
  97.     }
  98.     public function pontuacaoPermitida(FormEvent $event)
  99.     {
  100.         $submittedData $event->getData();
  101.         $dec $event->getForm()->getConfig()->getOption('decimais');
  102.         if (!empty($submittedData['pontos']) && !empty($submittedData['maximo'])) {
  103.             if (floatval($submittedData['pontos']) > floatval($submittedData['maximo'])) {
  104.                 $message "Pontuação máxima não pode ser inferior à de uma unidade! (em {$submittedData['descricao']})";
  105.                 throw new TransformationFailedException(
  106.                     $message,
  107.                     0// code
  108.                     null// previous
  109.                     $message // user message
  110.                 );
  111.             }
  112.             if ($dec == && intval($submittedData['maximo']) % intval($submittedData['pontos']) != 0) {
  113.                 $message "Pontuação máxima deve ser um múltiplo inteiro do valor da unidade! (em {$submittedData['descricao']})";
  114.                 throw new TransformationFailedException(
  115.                     $message,
  116.                     0// code
  117.                     null// previous
  118.                     $message // user message
  119.                 );
  120.             }
  121.         }
  122.     }
  123. }