Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 5 - Filtrer Collection Form

    1 octobre 2021 à 15:15:50

    Bonjour à tous, 

    J'essaye de filtrer les résultats que je récupère et que je passe dans mon formulaire.

    Il s'agit d'un formulaire de collections (Un User a plusieurs Services).

    J'ai tenté de mettre un pre_set_data dans le formulaire mais je ne maîtrise pas son utilisation. 

    Comment puis-je faire pour ne pas recevoir les lignes de ma table Service pour lesquelles le prestataire est égal au service_prestataire.

    Voici mon entité service

    <?php
    
    namespace App\Entity;
    
    use App\Repository\ServiceRepository;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass=ServiceRepository::class)
     */
    class Service
    {
        //[...]
    
        /**
         * @ORM\ManyToOne(targetEntity=User::class, inversedBy="services")
         */
        private $performer;
    
    
    
        /**
         * @ORM\ManyToOne(targetEntity=User::class, inversedBy="performer_services")
         */
        private $service_performer;
    
    
        //[...]
    
        public function getPerformer(): ?user
        {
            return $this->performer;
        }
    
        public function setPerformer(?user $performer): self
        {
            $this->performer = $performer;
    
            return $this;
        }
    
    
    
        public function getServicePerformer(): ?User
        {
            return $this->service_performer;
        }
    
        public function setServicePerformer(?User $service_performer): self
        {
            $this->service_performer = $service_performer;
    
            return $this;
        }
    }

    Mon formulaire de collection

    <?php
    
    namespace App\Form;
    
    use App\Entity\User;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\CollectionType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    
    
    class PerformerServiceType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('performer_services',CollectionType::class,[
                    'entry_type' => ServicePerformerNoMoneyUnitType::class,
                    'entry_options' => ['label' => false],
                    'allow_add' => true,
                    'allow_delete' => true,
                ])
                ->add('enregistrer', SubmitType::class)
            ;
            ;
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => User::class,
            ]);
        }
    }

    Mon formulaire d'entité (Service)

    <?php
    
    namespace App\Form;
    
    use App\Entity\Service;
    use App\Repository\UserRepository;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\MoneyType;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Security\Core\Security;
    use App\Entity\User;
    
    class ServicePerformerNoMoneyUnitType extends AbstractType
    {
        public function __construct(Security $security)
        {
            $this->security = $security;
        }
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name')
                ->add('price', MoneyType::class, [
                    'currency' => false])
                ->add('servicePerformer', EntityType::class, [
                    'class' => 'App\Entity\User',
                    'query_builder' => function (UserRepository $er) {
                        return $er->findByPartners($this->security->getUser());
                    },
                ])
                ->add('description')
            ;
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
                $service = $event->getData();
                $userService = new User;
                $performerService = new User;
                if ($service <> null)
                {
                    $userService = $service->getPerformer();
                    dump($userService);
                    $performerService = $service->getServicePerformer();
                    dump($performerService);
                }
    
                $form = $event->getForm();
    
                // checks if the Product object is "new"
                // If no data is passed to the form, the data is "null".
                // This should be considered a new "Product"
                if ($userService == $performerService) {
                    $form->removeElement();
                }
            });
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => Service::class,
            ]);
        }
    }

    Merci :) 





    • Partager sur Facebook
    • Partager sur Twitter
      2 octobre 2021 à 21:16:18

      est-ce vraiment utile d'avoir deux manytoone sur une même entité ?
      • Partager sur Facebook
      • Partager sur Twitter

      Symfony 5 - Filtrer Collection Form

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown