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

问题描述 投票:0回答:3

我有一个简单的

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

但即使我使用

form_row
专门逐行渲染我的表单,当我在末尾添加
form_end
时,它会渲染我的所有字段,甚至是我没有调用的字段。

我的表单类型

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 的情况下做到这一点,并且能够在我的视图中仅呈现表单的特定字段?

forms symfony
3个回答
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)
    {
        /...
    }
}

你不需要改变

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

3
投票

来自 symfony 文档

这个助手 (form_end) 也会输出 form_rest() 除非你将 render_rest 设置为 false。

form_rest(视图,变量)

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

{# don't render unrendered fields #}
{{ form_end(form, {'render_rest': false}) }}

1
投票

试试这个

{{ form_start(editForm) }}
{{ form_row(editForm.name) }}
{{ form_row(editForm.save) }}
{{ form_end(editForm, {'render_rest': false}) }}
© www.soinside.com 2019 - 2024. All rights reserved.