Bonjour,
Je cherche à faire des formulaire qui on les valeurs qui se mettent à jours en fonction du premier choix.

Par exemple:
J'ai un premier formulaire: ParametreR qui peut avoir R1 ou R2 en choix
Un deuxiéme fomulaire Affaire qui est une liste de toutes les affaires existantes, ce que je veux c'est affichier seulement les Affaires qui ont la clé parametreR = R1 en base.

J'ai regarté sur le site, il y a bien un systéme similaire mais qui date un peu (7 ans)
J'ai essayé de regarder sur la doc Symfony ici : https://symfony.com/doc/current/form/dynamic_form_modification.html#adding-an-event-listener-to-a-form-class

Voici le code source de ma page FormulairesType.php:

<?php

namespace App\Form;

use App\Entity\CodeAffaire;
use App\Entity\Etablissements;
use App\Entity\Formulaires;
use App\Entity\Groupes;
use App\Entity\ParametreR;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

class FormulairesType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('parametrer', EntityType::class, [
                'class' => ParametreR::class,
                'choice_label' => 'nom',
                'mapped'      => false,
            ])

            ->add('CodeAffaire', EntityType::class, [
                'class' => CodeAffaire::class,
                'choice_label' => 'nom_affaire',
                'placeholder' => 'Sélectionnez une option',
                'required' => true,
            ]);

    }

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

Et voici le coed de mon entité ParametreR:

<?php

namespace App\Entity;

use App\Repository\ParametreRRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: ParametreRRepository::class)]
class ParametreR
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    private ?string $nom = null;

    #[ORM\OneToMany(mappedBy: 'parametrer', targetEntity: CodeAffaire::class)]
    private Collection $codeAffaires;

    #[ORM\OneToMany(mappedBy: 'parametrer', targetEntity: Formulaires::class)]
    private Collection $formulaires;

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

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

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setNom(string $nom): static
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * @return Collection<int, CodeAffaire>
     */
    public function getCodeAffaires(): Collection
    {
        return $this->codeAffaires;
    }

    public function addCodeAffaire(CodeAffaire $codeAffaire): static
    {
        if (!$this->codeAffaires->contains($codeAffaire)) {
            $this->codeAffaires->add($codeAffaire);
            $codeAffaire->setParametrer($this);
        }

        return $this;
    }

    public function removeCodeAffaire(CodeAffaire $codeAffaire): static
    {
        if ($this->codeAffaires->removeElement($codeAffaire)) {
            // set the owning side to null (unless already changed)
            if ($codeAffaire->getParametrer() === $this) {
                $codeAffaire->setParametrer(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, Formulaires>
     */
    public function getFormulaires(): Collection
    {
        return $this->formulaires;
    }

    public function addFormulaire(Formulaires $formulaire): static
    {
        if (!$this->formulaires->contains($formulaire)) {
            $this->formulaires->add($formulaire);
            $formulaire->setParametrer($this);
        }

        return $this;
    }

    public function removeFormulaire(Formulaires $formulaire): static
    {
        if ($this->formulaires->removeElement($formulaire)) {
            // set the owning side to null (unless already changed)
            if ($formulaire->getParametrer() === $this) {
                $formulaire->setParametrer(null);
            }
        }

        return $this;
    }
}

Merci beaucoup pour les futurs discussions et pistes pour réaliser ceci :)

1 réponse


si tu veux juste filtrer, un peu de js pour passer l'option en hidden pourrait aller ?

il faudrait mettre un attribut sur chaque option, et verifier ton formulaire que la valeur soit correcte.