Symfony 4表单CollectionType:仅将FileType元素用于新行

时间:2018-09-24 09:00:07

标签: forms symfony symfony4

我有一系列图像,希望能够以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元素,而仅在新行中需要。

问题:如何使文件类型对于现有图像不是必需的,而对于所有新行都是必需的?

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

1 个答案:

答案 0 :(得分:2)

如果对象不是新对象(或不为null),则应在ImageType表单中添加EventListener并修改 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,
        ))
         ;
    });
}