如何显示“创建”和“编辑”操作的表单的特定字段-Symfony3

chi*_*ger 0 forms symfony

我有一个简单的FormType附加到一个media在我看来呈现为wich 的实体。我有一个newAction可以创建对象的对象,一个editAction可以让我在控制器中使用相同表单进行编辑的对象。但是我不希望在edit视图中出现某些字段,因为在创建该字段时已经输入了它们。

但是,即使我form_row习惯逐行专门渲染表单,但是当我form_end在末尾添加时,它也会渲染我的所有字段,即使我没有调用过。

我的FormType

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', FileType::class, array(
            'data_class'          => null,
            'label'               => "Add an image"
        ))
        ->add('context', ChoiceType::class, array(
            'label'               => 'image section',
            'choices' => array(
                'header' => 'header',
                'middle' => 'middle',
            )
        ))
        ->add('save', SubmitType::class, array(
            'label'               => "Add"
        ));
}
Run Code Online (Sandbox Code Playgroud)

我的看法

{{ form_start(editForm) }}
{{ form_row(editForm.name) }}
{{ form_row(editForm.save) }}
{{ form_end(editForm) }}
Run Code Online (Sandbox Code Playgroud)

但是,即使我使用表单行,它实际上也会context在视图中显示我的字段,而我没有调用它。因此,我尝试了一些解决方法。

这是可行的,但是当我单击submit表单时,它向我显示了一个错误,即context字段不能为null,因此无法解决问题

{% do editForm.context.setRendered %}
Run Code Online (Sandbox Code Playgroud)

我找到了一种使用jQuery来隐藏这样的表单的方法

<script>
        $(document).ready(function () {
            $("#media_context").parent().hide();
        });
    </script>
Run Code Online (Sandbox Code Playgroud)

jQuery可以在我的表单中隐藏我的行。但是我想知道是否可以在不使用jQuery的情况下做到这一点,并且只能在视图中呈现表单的特定字段?

mic*_*dev 5

在Symfony 2中,您可以在编辑实体时从构建器中删除一些字段。您的编辑表单必须extends在Symfony 2中创建表单。

我认为您可以在Symfony 3中执行相同的操作,尝试执行以下操作:

class EditType extends CreateType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder
            ->remove('context') //remove the fields that no longer needed
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        /...
    }
}
Run Code Online (Sandbox Code Playgroud)

你不需要改变 CreateType

class Createtype extends AbstractType
{
  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
        ->add('name', FileType::class, array(
            'data_class'          => null,
            'label'               => "Add an image"
        ))
        ->add('context', ChoiceType::class, array(
            'label'               => 'image section',
            'choices' => array(
                'header' => 'header',
                'middle' => 'middle',
            )
        ))
        ->add('save', SubmitType::class, array(
            'label'               => "Add"
        ));
  }
}
Run Code Online (Sandbox Code Playgroud)