如何显示表单的特定字段以便创建'和'编辑'行动 - Symfony3

时间:2017-03-19 10:19:37

标签: forms symfony

我有一个简单的FormType附加到我在视图中呈现的名为media的实体。 我有一个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"
        ));
}

我的观点

{{ form_start(editForm) }}
{{ form_row(editForm.name) }}
{{ form_row(editForm.save) }}
{{ form_end(editForm) }}

但即使我使用表单行,它实际上在视图中显示了我的context字段,我没有调用它。 所以我尝试了一些黑客来解决它。

这个有效,但是当我点击submit表单时,它会显示context字段不能为空的错误,所以这并不能解决问题

{% do editForm.context.setRendered %}

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

<script>
        $(document).ready(function () {
            $("#media_context").parent().hide();
        });
    </script>

jQuery可以在我的表单中隐藏我的行。但我想知道我是否可以在不使用jQuery的情况下完成它并且能够在我的视图中仅渲染我的表单的特定字段?

3 个答案:

答案 0 :(得分:3)

在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)
    {
        /...
    }
}

您不需要更改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"
        ));
  }
}

答案 1 :(得分:2)

来自symfony docs

除非将render_rest设置为false,否则此助手(form_end)也会输出form_rest()。

form_rest(视图,变量)

这将呈现尚未为给定表单呈现的所有字段。

this.setState

答案 2 :(得分:1)

试试这个

{{ form_start(editForm) }}
{{ form_row(editForm.name) }}
{{ form_row(editForm.save) }}
{{ form_end(editForm, {'render_rest': false}) }}