<?php
namespace App\Form;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Positive;
use Symfony\Component\Validator\Constraints\Range;
class BaremaItemType extends AbstractType implements EventSubscriberInterface
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('ordem', HiddenType::class, [
'attr' => [
'class' => 'posicao'
]
])
->add('chave', HiddenType::class)
->add('descricao', TextType::class, [
'label' => 'Descrição do item',
'required' => true,
'disabled' => $options['bloqueado']
])
->add('unidade', TextType::class, [
'label' => "Unidade de Avaliação",
'required' => true,
'disabled' => $options['bloqueado']
]);
if ($options['decimais'] > 0) {
$builder
->add('pontos', NumberType::class, [
'required' => true,
'label' => 'Pontos por Unidade',
'constraints' => [
new Range(['max' => 100]),
new Positive()
],
'scale' => $options['decimais'],
'disabled' => $options['bloqueado']
])
->add('maximo', NumberType::class, [
'required' => true,
'label' => 'Pontuação Máxima',
'constraints' => [
new Range(['max' => 100]),
new Positive(),
],
'scale' => $options['decimais'],
'disabled' => $options['bloqueado']
]);
}
else {
$builder
->add('pontos', IntegerType::class, [
'required' => true,
'label' => 'Pontos por Unidade',
'constraints' => [
new Range(['min' => 1, 'max' => 100]),
],
'disabled' => $options['bloqueado']
])
->add('maximo', IntegerType::class, [
'required' => true,
'label' => 'Pontuação Máxima',
'constraints' => [
new Range(['min' => 1, 'max' => 100]),
],
'disabled' => $options['bloqueado']
]);
}
$builder->addEventSubscriber($this);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'bloqueado' => false,
'decimais' => 0,
]);
}
public function getBlockPrefix(): string
{
return 'BaremaItemType';
}
public static function getSubscribedEvents(): array
{
return [
FormEvents::SUBMIT => 'pontuacaoPermitida',
];
}
public function pontuacaoPermitida(FormEvent $event)
{
$submittedData = $event->getData();
$dec = $event->getForm()->getConfig()->getOption('decimais');
if (!empty($submittedData['pontos']) && !empty($submittedData['maximo'])) {
if (floatval($submittedData['pontos']) > floatval($submittedData['maximo'])) {
$message = "Pontuação máxima não pode ser inferior à de uma unidade! (em {$submittedData['descricao']})";
throw new TransformationFailedException(
$message,
0, // code
null, // previous
$message // user message
);
}
if ($dec == 0 && intval($submittedData['maximo']) % intval($submittedData['pontos']) != 0) {
$message = "Pontuação máxima deve ser um múltiplo inteiro do valor da unidade! (em {$submittedData['descricao']})";
throw new TransformationFailedException(
$message,
0, // code
null, // previous
$message // user message
);
}
}
}
}