src/FormSubscriber/RFDiligenciaSubscriber.php line 66

Open in your IDE?
  1. <?php
  2. namespace App\FormSubscriber;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\Form\FormEvent;
  6. use Symfony\Component\Form\FormEvents;
  7. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  8. use App\Entity\ParDescripcionDiligencia;
  9. use App\Entity\RFDiligencia;
  10. class RFDiligenciaSubscriber implements EventSubscriberInterface
  11. {
  12.     private EntityManagerInterface $entityManager;
  13.     public function __construct(EntityManagerInterface $entityManager)
  14.     {
  15.         $this->entityManager $entityManager;
  16.     }
  17.     public static function getSubscribedEvents(): array
  18.     {
  19.         return [
  20.             FormEvents::PRE_SET_DATA => 'preSetData',
  21.             FormEvents::PRE_SUBMIT => 'preSubmit',
  22.         ];
  23.     }
  24.     public function preSetData(FormEvent $event): void
  25.     {
  26.         $form $event->getForm();
  27.         $data $event->getData();
  28.         if (method_exists($data'getMensajero') && $data->getMensajero()) {
  29.             $idColaborador $data->getMensajero()->getId();
  30.             $diligencias $this->entityManager->getRepository(RFDiligencia::class)
  31.                 ->diligenciaColaborador([$idColaborador], [34]);
  32.             $ordenAct array_map(fn($d) => $d['id'], $diligencias);
  33.             $ordenEntities $this->entityManager->getRepository(RFDiligencia::class)
  34.                 ->findBy(['id' => $ordenAct]);
  35.             $form->add('ordenTmp'EntityType::class, [
  36.                 'label' => 'Orden Diligencias',
  37.                 'required' => true,
  38.                 'multiple' => true,
  39.                 'mapped' => false,
  40.                 'class' => RFDiligencia::class,
  41.                 'query_builder' => function ($er) use ($ordenAct) {
  42.                     return $er->createQueryBuilder('e')
  43.                         ->leftJoin('e.mensajero''m')
  44.                         ->leftJoin('e.estado''es')
  45.                         ->where('(m.id IS NULL OR e.id IN (:diligencias))')
  46.                         ->andWhere('es.nombre IN (:estados)')
  47.                         ->setParameter('diligencias'$ordenAct ?: [0])
  48.                         ->setParameter('estados', ['SOLICITADO''AUTORIZADO']);
  49.                 },
  50.                 'attr' => ['class' => 'nonSelectMultiple multipleSelect'],
  51.                 'placeholder' => 'Seleccióne una opción.',
  52.                 'data' => $ordenEntities,
  53.             ]);
  54.         }
  55.     }
  56.     public function preSubmit(FormEvent $event): void
  57.     {
  58.         $form $event->getForm();
  59.         $data $event->getData();
  60.         // Descripción Diligencia dinámica
  61.         if (isset($data['tipoDiligencia'])) {
  62.             $idTipoDiligencia = (int)$data['tipoDiligencia'];
  63.             $required true;
  64.             $idDesDil = match ($idTipoDiligencia) {
  65.                 => [12345],
  66.                 => [16],
  67.                 => (function () use (&$required) {
  68.                     $required false;
  69.                     return [0];
  70.                 })(),
  71.                 => [78910],
  72.                 => [1112],
  73.                 => [131415],
  74.                 default => [0],
  75.             };
  76.             if ($idTipoDiligencia == 3) {
  77.                $form->remove('descripcionDiligencia');
  78.             }else{
  79.                 $form->add('descripcionDiligencia'EntityType::class, [
  80.                     'class' => ParDescripcionDiligencia::class,
  81.                     'query_builder' => fn($er) => $er->createQueryBuilder('dd')
  82.                         ->where('dd.id IN (:id)')
  83.                         ->setParameter('id'$idDesDil)
  84.                         ->orderBy('dd.nombre''ASC'),
  85.                     'label' => 'Descripción Diligencia',
  86.                     'required' => $required,
  87.                     'attr' => ['class' => 'form-control nonSelectMultiple'],
  88.                     'placeholder' => 'Seleccione una opción.',
  89.                 ]);
  90.             }
  91.         }
  92.         // OrdenTmp dinámico según mensajero
  93.         if (isset($data['mensajero'])) {
  94.             $idColaborador $data['mensajero'];
  95.             $diligencias $this->entityManager->getRepository(RFDiligencia::class)
  96.                 ->diligenciaColaborador([$idColaborador], [34]);
  97.             $ordenAct array_map(fn($d) => $d['id'], $diligencias) ?: [0];
  98.             $form->add('ordenTmp'EntityType::class, [
  99.                 'label' => 'Orden Diligencias',
  100.                 'required' => true,
  101.                 'multiple' => true,
  102.                 'mapped' => false,
  103.                 'class' => RFDiligencia::class,
  104.                 'query_builder' => function ($er) use ($ordenAct) {
  105.                     return $er->createQueryBuilder('e')
  106.                         ->leftJoin('e.mensajero''m')
  107.                         ->leftJoin('e.estado''es')
  108.                         ->where('(m.id IS NULL OR e.id IN (:diligencias))')
  109.                         ->andWhere('es.nombre IN (:estados)')
  110.                         ->setParameter('diligencias'$ordenAct)
  111.                         ->setParameter('estados', ['SOLICITADO''AUTORIZADO']);
  112.                 },
  113.                 'attr' => ['class' => 'nonSelectMultiple multipleSelect'],
  114.                 'placeholder' => 'Seleccióne una opción.',
  115.             ]);
  116.             // Sin necesidad de hacer setData manual aquí
  117.         }
  118.     }
  119. }