我怎么能不在 symfony 中显示我的表单的一部分?

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

我必须显示或不显示表单的一部分,具体取决于变量在我的数据库中采用的值。

这是我的表格:

    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);
    }

我需要显示或不显示 ChoiceType。

有什么想法吗?

在树枝上:

{{ 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}) }}

使用 {'render_rest': false},您无需呈现表单的其余部分。 如果这样做,请不要忘记呈现 CSRF 令牌。 让我们知道。

你可以使用表单事件,我觉得这个页面可以帮助你:https://symfony.com/doc/4.4/form/dynamic_form_modification.html

类似的东西:

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);
}

我想你可以循环将你的表单字段扔到树枝中来显示它们,但我现在还没有想到那部分,正在研究它