Symfony : modifier les champs d’un formulaire en fonction de son objet ou d’options

Depuis le controller, c’est un appel du formulaire classique, on ajoute juste les éventuelles options si besoins

$form = $this->createForm(ExampleFormType::class, $example, array('custom' => true));

Dans « ExampleFormType » définition de l’option « custom » et utilisation des « Form Events » pour adapter les champs

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class ExampleFormType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use($options) {
            $example = $event->getData(); //recuperation de l'objet sur lequel le formulaire se base
            $form = $event->getForm(); //recuperation du formulaire
            //en fonction du type de l'utilisateur les champs sont différents
            if ($example->getStatus() == 1 && $options['custom']) {
                $form->add('firstName', null, array('label' => 'Prénom'));
                //....
            } else {
                $form->add('lastName', null, array('label' => 'Nom'));
                //....
            }
        });
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Example',
            'custom' => false
        ));
    }

}

Savoir si un champs est définis dans twig

{% if form.firstName is defined %}
    {{form_row(form.firstName)}}
{% endif %}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *