Symfony 4表单CollectionType:使FileType元素仅对新行为必填项

4

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

为了创建这些图片的表单,我正在使用一个自定义表单,其中包含一个FileType:

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

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

}

我使用一个填充了上述表单实例的CollectionType来渲染数组中每个图像的表单,通过JavaScript可以添加/删除行,并且设置了'allow_add'和'allow_delete'。

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元素不应该是必需的,它只应该在新行中是必需的。
问题:如何使FileType对于所有新行都是必需的,而对于现有图片来说则不是必需的?
(注意,我将向这些表单对象传递普通数组,而不是Doctrine实体。)
1个回答

2
你应该在ImageType表单中添加一个EventListener,并且如果对象不是新的(或不为null),则修改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 - Marleen
在回答问题后,我重新阅读了您的问题以确保答案正确,并交换了true和false,但没有更新if子句,非常抱歉 :-) 应该是:null!== $image。这样好吗? - user6564978
没问题,而且 null !== $image 在这里比切换 true/false 更有意义,所以我会使用它。谢谢! :) - Marleen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接