src/Form/ModelType/Customer/Create/Subscriber/CustomerVehicleSubscriber.php line 32

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Form\ModelType\Customer\Create\Subscriber;
  4. use App\Autowire\EntityManagerTrait;
  5. use App\Entity\Company;
  6. use App\Entity\Enum\CustomerTypeEnum;
  7. use App\Entity\Vehicle;
  8. use App\Repository\CompanyRepository;
  9. use App\Repository\VehicleRepository;
  10. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\Form\Event\PostSetDataEvent;
  13. use Symfony\Component\Form\Event\PreSubmitEvent;
  14. use Symfony\Component\Form\FormEvents;
  15. use Symfony\Component\Form\FormInterface;
  16. class CustomerVehicleSubscriber implements EventSubscriberInterface
  17. {
  18.     use EntityManagerTrait;
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return [
  22.             FormEvents::PRE_SUBMIT => 'addFormTypeOnPreSubmit',
  23.             FormEvents::POST_SET_DATA => 'addFormTypeOnPostSetData',
  24.         ];
  25.     }
  26.     public function addFormTypeOnPreSubmit(PreSubmitEvent $preSubmitEvent): void
  27.     {
  28.         $type array_key_exists('customerType'$preSubmitEvent->getData())
  29.             ? $preSubmitEvent->getData()['customerType']
  30.             : null;
  31.         $this->addVehicleField(
  32.             form$preSubmitEvent->getForm(),
  33.             vehicles:  function (VehicleRepository $repository) {
  34.                 return $repository->getQbAvailableVehicles();
  35.             }
  36.         );
  37.         if ($type === CustomerTypeEnum::ENTERPRISE->name) {
  38.             $this->addCompanyField(
  39.                 form$preSubmitEvent->getForm(),
  40.                 companies: function (CompanyRepository $repository) {
  41.                     return $repository->getQbAllSocialReason();
  42.                 }
  43.             );
  44.         }
  45.     }
  46.     public function addFormTypeOnPostSetData(PostSetDataEvent $postSetDataEvent): void
  47.     {
  48.         $this->addVehicleField($postSetDataEvent->getForm());
  49.         $this->addCompanyField($postSetDataEvent->getForm());
  50.     }
  51.     private function addVehicleField(FormInterface $form, callable $vehicles null): void
  52.     {
  53.         $opts = [
  54.             'class' => Vehicle::class,
  55.             'required' => false,
  56.             'label' => 'VĂ©hicule',
  57.             'placeholder' => 'Selectionner un vĂ©hicule...',
  58.             'choice_label' => 'matriculation',
  59.             'attr' => [
  60.                 'data-customer-target' => 'vehicle'
  61.             ],
  62.             'autocomplete' => true
  63.         ];
  64.         if ($vehicles !== null) {
  65.             $opts['query_builder'] = $vehicles;
  66.         } else {
  67.             $opts['choices'] = [];
  68.         }
  69.         $form->add('vehicle'EntityType::class, $opts);
  70.     }
  71.     private function addCompanyField(FormInterface $form, callable $companies null): void
  72.     {
  73.         $opts = [
  74.             'class' => Company::class,
  75.             'label' => 'Entreprise',
  76.             'required' => true,
  77.             'placeholder' => 'Selectionner une entreprise...',
  78.             'choice_label' => 'socialReason',
  79.             'row_attr' => [
  80.                 'class' => 'd-none',
  81.             ],
  82.             'label_attr' => [
  83.                 'class' => 'required'
  84.             ],
  85.             'attr' => [
  86.                 'data-customer-target' => 'company'
  87.             ],
  88.             'autocomplete' => true,
  89.         ];
  90.         if ($companies !== null) {
  91.             $opts['query_builder'] = $companies;
  92.         } else {
  93.             $opts['choices'] = [];
  94.         }
  95.         $form->add('company'EntityType::class, $opts);
  96.     }
  97. }