Symfony 4 表单 CollectionType:仅使新行需要 FileType 元素

Posted

技术标签:

【中文标题】Symfony 4 表单 CollectionType:仅使新行需要 FileType 元素【英文标题】:Symfony 4 forms CollectionType: make FileType element required for new rows only 【发布时间】:2019-02-27 18:08:31 【问题描述】:

我有一组图像,我希望能够在 Symfony 4 表单中添加/更新/删除这些图像。

要为这些图像创建一个表单,我使用了一个包含 FileType 的自定义表单:

public function buildForm(FormBuilderInterface $builder, array $options) 

    $builder
        ->add('image', FileType::class, array(
            'data_class' => null
        ))
    ;


然后,我使用一个填充了上述表单实例的 CollectionType 来为数组中的每个图像呈现一个表单,其中包含“allow_add”和“allow_delete”,以便我可以通过 javascript 添加/删除行。

public function buildForm(FormBuilderInterface $builder, array $options) 

    $builder->add('imagesets', CollectionType::class, array(
        'entry_type' => ImageType::class,
        'entry_options' => array('label' => false),
        'allow_add' => true,
        'allow_delete' => true
    ));

这适用于添加新图像,但在更新现有图像时,不需要 FileType 元素,它应该只用于新行。

问题:如何使现有图像不需要文件类型,但所有新行都需要?

(注意,我会将普通数组传递给这些表单对象,而不是 Doctrine 实体。)

【问题讨论】:

【参考方案1】:

如果对象不是新的(或不为空),您应该将EventListener 添加到您的 ImageType 表单并修改 required 属性。请记住,在表单中添加与前一个同名的第二个元素会替换它。

$builder
    ->add('image', FileType::class, array(
        'data_class' => null,
        'required' => true,
    ))
    ;

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) 
    // get the form object
    $form = $event->getForm();
    // get the entity/object data
    $image = $event->getData();
    // if it is new, it will be null
    if(null !== $image) 
        // modify the input
        $form->add('image', FileType::class, array(
            'data_class' => null,
            'required' => false,
        ))
         ;
    );

【讨论】:

是的,这是正确的答案! truefalse 需要切换。谢谢! :D 写完答案后,我重新阅读了您的问题,以确保答案正确并切换了真假,但没有更新 if 子句,对不起:-) 它应该是:null !== $图像。这样更好吗? 没问题,null !== $image 在这里实际上比切换真/假更有意义,所以我将使用它。谢谢! :)

以上是关于Symfony 4 表单 CollectionType:仅使新行需要 FileType 元素的主要内容,如果未能解决你的问题,请参考以下文章

CSRF 令牌无效。请尝试重新提交表单。 Symfony 4

Symfony 4 - 如何在不构建表单的情况下添加 csrf 令牌?

在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段

Symfony 4.4:为图像文件上传保留的实体/模型属性由表单系统设置更新(结果始终为空 - 没有错误)

symfony 4在表单上没有handleResquest方法但使用xhr对象html上传

Symfony 3.4 和模态表单验证