← Back
Editing: PenaltyType.php
<?php namespace App\Form; use App\Entity\Penalty; use App\Entity\User; use App\Repository\PenaltyTemplateRepository; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ButtonType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Security\Core\Security; class PenaltyType extends AbstractType { private array $choices; private array $choicesAttr; public function __construct( PenaltyTemplateRepository $templateRepository, Security $security ) { $choices = $choicesAttr = []; /** @var User $user */ $user = $security->getUser(); foreach ($templateRepository->findBy(['agency' => $user->getAgency()]) as $tpl) { $key = $tpl->getReason().' ('.$tpl->getAmount().'€)'; $choices[$key] = $tpl->getReason(); $choicesAttr[$key] = [ 'data-amount' => $tpl->getAmount(), 'data-period' => $tpl->getPeriod(), ]; } $this->choices = $choices; $this->choicesAttr = $choicesAttr; } /** * @return void */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('reason', ChoiceType::class, [ 'choices' => $this->choices, 'choice_attr' => $this->choicesAttr, 'required' => false, 'attr' => [ 'class' => 'reason-select', ], ]) ->add('otherReason', TextType::class, ['mapped' => false, 'required' => false]) ->add('amount', TextType::class, ['attr' => ['class' => 'penalty-amount']]) ->add('startDate') ->add('endDate') ->add('nbDays') ->add( 'remove', ButtonType::class, [ 'label' => 'Supprimer', 'attr' => ['class' => 'penalty-delete btn-sm btn-danger'], 'row_attr' => ['class' => 'text-right'], ] ) ->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit']) ->addEventListener(FormEvents::POST_SET_DATA, [$this, 'onPostSetData']); } public function onPostSetData(FormEvent $event): void { /** @var Penalty $penalty */ $penalty = $event->getData(); $form = $event->getForm(); if ($penalty && !in_array($penalty->getReason(), array_values($this->choices))) { $form->remove('reason'); /** @var array-key $key */ $key = $penalty->getReason(); $form->add( 'reason', ChoiceType::class, [ 'priority' => 2, 'choices' => array_merge($this->choices, [$key => $penalty->getReason()]), ] ); } } public function onPreSubmit(FormEvent $event): void { /** @var array $penalty */ $data = $event->getData(); $form = $event->getForm(); if (!$data['reason'] && $data['otherReason']) { $form->remove('reason'); /** @var array-key $key */ $key = $data['otherReason']; $form->add( 'reason', ChoiceType::class, [ 'priority' => 2, 'choices' => array_merge($this->choices, [$key => $data['otherReason']]), ] ); $data['reason'] = $data['otherReason']; $data['otherReason'] = ''; } elseif (!$data['reason'] && !$data['otherReason']) { $form->addError(new FormError('Vous devez renseigner une raison')); } $event->setData($data); } /** * @return void */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => Penalty::class, ]); } }
Save File
Cancel