Bjour à tous.
Je suis confronté à un petit problème concernant l'ajout d'un EventListener sur mon formType dans mon projet Symfony. J'ai suivi la doc ici , mais sans succès. J'ai aussi pas mal cherché sur d'autre forum, mais en vain.

Je vous explique mon problème:
Je dois créer un formulaire où les listes déroulantes (Regions -> Villes) se remplissent suivant nos choix dans les précédantes.

Ce que je fais

Voici le code pour l'entité Regions

/**
 * @ORM\Entity(repositoryClass="App\Repository\RegionsRepository")
 */
class Regions
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\City", mappedBy="region")
     */
    private $cities;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Users", mappedBy="region")
     */
    private $users;

    public function __construct()
    {
        $this->cities = new ArrayCollection();
        $this->users = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return Collection|City[]
     */
    public function getCities(): Collection
    {
        return $this->cities;
    }

    public function addCity(City $city): self
    {
        if (!$this->cities->contains($city)) {
            $this->cities[] = $city;
            $city->setRegion($this);
        }

        return $this;
    }

    public function removeCity(City $city): self
    {
        if ($this->cities->contains($city)) {
            $this->cities->removeElement($city);
            // set the owning side to null (unless already changed)
            if ($city->getRegion() === $this) {
                $city->setRegion(null);
            }
        }

        return $this;
    }
}

Le code pour l'entité City

/**
 * @ORM\Entity(repositoryClass="App\Repository\CityRepository")
 */
class City
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $town;

    /**
     * @ORM\Column(type="integer")
     */
    private $cp;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Regions", inversedBy="cities")
     * @ORM\JoinColumn(nullable=false)
     */
    private $region;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Users", mappedBy="city")
     */
    private $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTown(): ?string
    {
        return $this->town;
    }

    public function setTown(string $town): self
    {
        $this->town = $town;

        return $this;
    }

    public function getCp(): ?int
    {
        return $this->cp;
    }

    public function setCp(int $cp): self
    {
        $this->cp = $cp;

        return $this;
    }

    public function getRegion(): ?Regions
    {
        return $this->region;
    }

    public function setRegion(?Regions $region): self
    {
        $this->region = $region;

        return $this;
    }
}

Voici le code pour le FormType

class FormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
              ->add('region', EntityType::class, [
                'class'         => Regions::class,
                'placeholder' => '',
                'choice_label'  =>  'name'
            ])
        ;

        $formModifier = function (FormInterface $form, Region $region = null) {
            $ville = null === $region ? array() : $region->getCities();

            $form->add('city', EntityType::class, [
                'class'         => City::class,
                'placeholder' => '',
                'choices' => $ville
            ]);
        };

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier) {
                $data = $event->getData();

                $formModifier($event->getForm(), $data->getRegion());
            }
        );

        $builder->get('region')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {
                $region = $event->getForm()->getData();

                $formModifier($event->getForm()->getParent(), $region);
            }
        );
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Users::class
        ]);
    }
}

Et le code js

var $region = $('#inscrip_region');

$region.change(function() {
    var $form = $(this).closest('formin');
    var data = {};
    data[$region.attr('name')] = $region.val();

    $.ajax({
        url : $form.attr('action'),
        type: $form.attr('method'),
        data : data,
        success: function(html) {
            $('#inscrip_city').replaceWith(
                $(html).find('#inscrip_city')
            );
        }
    });
});

Ce que je veux

C'est que quand je choisis une Région la liste déroulante Ville se remplit en fonction de la Région choisie.

Ce que j'obtiens

La liste déroulante Ville ne se remplit pas, malgrés les diffèrents essais.

Mon controller est tout ce qu'il y a de plus basic, je lui demande faire apparaître le formulaire dans ma twig, et ma twig l'affiche.

Voilà je partage t donc si vous avez des suggestions je suis preneur. J'ai fait énormément de recherche sur internet, et pour l'instant aucun forum n'a pu vraiment m'aider, je vous avouerai ne pas totalement comprendre le fonctionnement des Event Listener sur Symfony.

Merci d'avance.

2 réponses


Bonjour,
Avez, vous résolut votre problème ? Je suis bloqué au même endroit..J'ai bien la liste des départements qui s'affiche, mais rien ne s'affiche dans la liste des villes après sélection d'un département !
Merci

Bonjour

Vérifie que tes sélecteurs sont correctes.