Liiuc
Liiuc

Reputation: 182

how can I not display a part of my form in symfony?

I have to show or not a part of my form depending on the value that a variable assumes in my database.

Here is my form:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('assetClass',ChoiceType::class, array(
                        'placeholder' => 'Select asset class',
                        'choices'  => array(
                            'a' => '1',
                            'b' => '2',
                            'c' => '3'
                        )))
                ->add('code')
                ->add('name')
                ->add('note',TextareaType::class,array('required' => false))
                ->add('route', HiddenType::class);
    }

I need to show or not the ChoiceType.

Any idea for doing that?

Upvotes: 0

Views: 78

Answers (2)

Ravirn
Ravirn

Reputation: 11

You can use the form events, i feel like this page can help you : https://symfony.com/doc/4.4/form/dynamic_form_modification.html

Something like that:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $test = $event->getData();
        $form = $event->getForm();

        if (your condition) {
            $form->add('assetClass',ChoiceType::class, array(
                    'placeholder' => 'Select asset class',
                    'choices'  => array(
                        'a' => '1',
                        'b' => '2',
                        'c' => '3'
                    )))
        }
    }

    $builder
            ->add('code')
            ->add('name')
            ->add('note',TextareaType::class,array('required' => false))
            ->add('route', HiddenType::class);
}

I guess you can then loop threw your form fields in twig to display them but i haven't figured that part for now, working on it

Upvotes: 1

shaax
shaax

Reputation: 336

In twig :

{{ form_start(form, {'method': 'POST'}) }}
    {% if condition %}
        {{ form_widget(form.assetClass) }}
    {% endif %}
    {{ form_widget(form.code) }}
    {{ form_widget(form.name) }}
    {{ form_widget(form.note) }}
    {{ form_widget(form.route) }}
    {{ form_widget(form._token) }}
{{ form_end(form, {'render_rest': false}) }}

With {'render_rest': false}, you don't render the rest of your form. If you do that, dont forget to render the CSRF token. Let us know.

Upvotes: 2

Related Questions