src/Services/ActivityService.php line 143

Open in your IDE?
  1. <?php
  2. namespace App\Services;
  3. use App\Entity\Activity;
  4. use App\Entity\SectorArea;
  5. use App\Repository\ActivityRepository;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7. use Doctrine\ORM\EntityManager;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  10. use Symfony\Component\Form\FormBuilderInterface;
  11. use Symfony\Component\Form\FormEvent;
  12. use Symfony\Component\Form\FormEvents;
  13. use Symfony\Component\Form\FormInterface;
  14. use Doctrine\ORM\EntityRepository;
  15. class ActivityService {
  16.     private EntityManager $entityManager;
  17.     private ActivityRepository $activityRepository;
  18.     public function __construct(
  19.         EntityManagerInterface $entityManager,
  20.         ActivityRepository $activityRepository
  21.     ) {
  22.         $this->entityManager $entityManager;
  23.         $this->activityRepository $activityRepository;
  24.     }
  25.     /**
  26.      * Permet d'ajouter sur le formualaire un champs facultatif de type sectorArea qu'il faut d'abord selectionner pour
  27.      * pouvoir selectionner le champs activity
  28.      *
  29.      * @param FormBuilderInterface $builder
  30.      * @param string $activityName : Nom du champs activities sur le formulaire
  31.      * @param string $sectorAreaName : Nom du champs sectorArea sur le formulaire
  32.      * @param bool $multiple
  33.      */
  34.     public function addActivity(
  35.         FormBuilderInterface $builder,
  36.         string               $activityName,
  37.         string               $sectorAreaName 'sectorArea',
  38.         bool                 $multiple true
  39.     ): void {
  40.         $builder->get($sectorAreaName)->addEventListener(
  41.             FormEvents::POST_SUBMIT,
  42.             function (FormEvent $event) use ($activityName$multiple$builder) {
  43.                 $form $event->getForm();
  44.                 /** @var SectorArea $sectorArea */
  45.                 $sectorArea $form->getData();
  46.                 // Recupérer les activities par defaut
  47.                 $methodName sprintf('get%s'ucfirst($activityName));
  48.                 $selectedActivities $builder->getData()->$methodName();
  49.                 // $activities = ($sectorArea) ? $sectorArea->getActivities() : [];
  50.                 $activities = ($sectorArea) ? $sectorArea->getActivities() : $selectedActivities;
  51.                 $this->addActivityField($form->getParent(), $activities$activityName$multiple);
  52.             }
  53.         );
  54.         $builder->addEventListener(
  55.             FormEvents::POST_SET_DATA,
  56.             function (FormEvent $event) use ($activityName$multiple) {
  57.                 $data $event->getData();
  58.                 $methodName sprintf('get%s'ucfirst($activityName));
  59.                 /** @var ArrayCollection $activities */
  60.                 $activities $data->$methodName();
  61.                 $form $event->getForm();
  62.                 // La condition à vérifier depend de l'activité (si c'est une collection d'activity ou un objet activity)
  63.                 $condition = ($multiple) ? ($activities->count() > 0) : ($activities);
  64.                 if ($condition) {
  65.                     $this->addActivityField($form$activities$activityName$multiple);
  66.                 } else {
  67.                     $this->addActivityField($formnull$activityName$multiple);
  68.                 }
  69.             }
  70.         );
  71.         // Important pour les options "Autre" sur les metiers
  72.         // Supprimer l'option "Autre" avec id = "" sur les activities
  73.         $builder->addEventListener(
  74.             FormEvents::PRE_SUBMIT,
  75.             function (FormEvent $event) use ($activityName) {
  76.                 $data $event->getData();
  77.                 if ($data && array_key_exists($activityName$data)) {
  78.                     $arrayActivities $data[$activityName];
  79.                     if (is_array($arrayActivities)) {
  80.                         foreach ($arrayActivities as $key => $value) {
  81.                             if ($value == null) unset($arrayActivities[$key]);
  82.                         }
  83.                     }
  84.                     $data[$activityName] = $arrayActivities;
  85.                     $event->setData($data);
  86.                 }
  87.             }
  88.         );
  89.     }
  90.     /**
  91.      * Rajoute un champ region au formulaire
  92.      */
  93.     private function addActivityField(
  94.         FormInterface $form,
  95.                       $activities null,
  96.         string        $activityName null,
  97.         bool          $multiple false
  98.     ): void {
  99.         $builder = ($multiple) ?
  100.             $this->addMultipleActivity($form$activities$activityName) :
  101.             $this->addUniqueActivity($form$activities$activityName);
  102.         $form->add($builder->getForm());
  103.     }
  104.     private function addUniqueActivity(
  105.         FormInterface &$form,
  106.                       $activities null,
  107.         ?string        $activityName null
  108.     ): FormBuilderInterface {
  109.         if ($activities instanceof Activity) {
  110.             $data[] = $activities;
  111.         } else $data $activities;
  112.         return $form->getConfig()->getFormFactory()->createNamedBuilder(
  113.             $activityName,
  114.             EntityType::class,
  115.             null,
  116.             [
  117.                 'class' => Activity::class,
  118.                 'choice_label' => 'name',
  119.                 'placeholder' => $activities 'menu.select_activity' 'menu.select_sector',
  120.                 'auto_initialize' => false,
  121.                 'choices' => $data $data : [],
  122.                 'attr' => ['class' => 'form-control'],
  123.                 'required' => false,
  124.                 'placeholder' => 'menu.select',
  125.                 'query_builder' => function (EntityRepository $entityRepository) {
  126.                     return $entityRepository->createQueryBuilder('a')
  127.                         ->orderBy('a.name''ASC');
  128.                 }
  129.             ]
  130.         );
  131.     }
  132.     private function addMultipleActivity(FormInterface &$form$activities null, ?string $activityName null): FormBuilderInterface {
  133.         return $form->getConfig()->getFormFactory()->createNamedBuilder(
  134.             $activityName,
  135.             EntityType::class,
  136.             null,
  137.             [
  138.                 'class' => Activity::class,
  139.                 'choice_label' => 'name',
  140.                 'multiple' => true,
  141.                 'placeholder' => $activities 'menu.select_activity' 'menu.select_sector',
  142.                 'auto_initialize' => false,
  143.                 'choices' => $activities $activities : [],
  144.                 'data' => $activities,
  145.                 'attr' => ['class' => 'form-control'],
  146.                 'required' => false,
  147.                 'query_builder' => function (EntityRepository $entityRepository) {
  148.                     return $entityRepository->createQueryBuilder('a')
  149.                         ->orderBy('a.name''ASC');
  150.                 }
  151.             ]
  152.         );
  153.     }
  154.     /**
  155.      * @return Activity[]|array
  156.      */
  157.     public function getAllActivities(): array {
  158.         return $this->activityRepository->findAll();
  159.     }
  160. }