src/Form/ModelType/Appointment/Subscriber/AppointmentCustomerSubscriber.php line 29

  1. <?php
  2. namespace App\Form\ModelType\Appointment\Subscriber;
  3. use App\Autowire\EntityManagerTrait;
  4. use App\Entity\Customer;
  5. use App\Entity\Vehicle;
  6. use App\Form\ModelType\Appointment\Model\AppointmentModel;
  7. use App\Repository\CustomerRepository;
  8. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\Form\Event\PostSetDataEvent;
  11. use Symfony\Component\Form\Event\PreSubmitEvent;
  12. use Symfony\Component\Form\FormEvents;
  13. use Symfony\Component\Form\FormInterface;
  14. class AppointmentCustomerSubscriber implements EventSubscriberInterface
  15. {
  16.     use EntityManagerTrait;
  17.     public static function getSubscribedEvents(): array
  18.     {
  19.         return [
  20.             FormEvents::PRE_SUBMIT => 'addFormTypeOnPreSubmit',
  21.             FormEvents::POST_SET_DATA => 'addFormTypeOnPostSetData',
  22.         ];
  23.     }
  24.     public function addFormTypeOnPreSubmit(PreSubmitEvent $preSubmitEvent): void
  25.     {
  26.         $vehicle array_key_exists('vehicle'$preSubmitEvent->getData())
  27.             ? $this->getRepository(Vehicle::class)->find($preSubmitEvent->getData()['vehicle'])
  28.             : null;
  29.         $customer array_key_exists('customer'$preSubmitEvent->getData())
  30.             ? $this->getRepository(Customer::class)->find($preSubmitEvent->getData()['customer'])
  31.             : null;
  32.         $this->addManagerField($preSubmitEvent->getForm(), $vehicle$customer);
  33.     }
  34.     public function addFormTypeOnPostSetData(PostSetDataEvent $postSetDataEvent): void
  35.     {
  36.         /**
  37.          * @var AppointmentModel $appointmentModel
  38.          */
  39.         $appointmentModel $postSetDataEvent->getData();
  40.         $this->addManagerField($postSetDataEvent->getForm(), $appointmentModel->getVehicle(), $appointmentModel->getCustomer());
  41.     }
  42.     private function addManagerField(FormInterface $form, ?Vehicle $vehicle, ?Customer $customer)
  43.     {
  44.         $form
  45.             ->add('customer'EntityType::class, [
  46.                 'class' => Customer::class,
  47.                 'label' => 'Responsable',
  48.                 'query_builder' => function (CustomerRepository $repository) use ($vehicle) {
  49.                     return $repository->getQbCustomersByVehicle($vehicle);
  50.                 },
  51.                 'row_attr' => [
  52.                     'class' => 'col-md-12 d-none'
  53.                 ],
  54.                 'attr' => [
  55.                     'data-dashboard-target' => 'customer',
  56.                     'data-action' => 'change->dashboard#customerChanged'
  57.                 ],
  58.                 'label_attr' => [
  59.                     'class' => 'form-label'
  60.                 ],
  61.                 'choice_value' => function (?Customer $customer) {
  62.                     return $customer?->getId();
  63.                 },
  64.                 'choice_label' => function (?Customer $customer) {
  65.                     return $customer?->getFullName();
  66.                 },
  67.                 'placeholder' => 'Selectionner un responsable...',
  68.                 'autocomplete' => true,
  69.                 'required' => true,
  70.                 'no_results_found_text' => 'Pas de responsable trouvĂ© : <button type="button" class="btn btn-success">Ajouter un responsable</button>',
  71.                 'no_more_results_text' => 'Pas de responsable trouvĂ© : <button type="button" class="btn btn-success">Ajouter un responsable</button>',
  72.             ]);
  73.     }
  74. }