【问题标题】:Symfony 4 forms CollectionType: make FileType element required for new rows onlySymfony 4 表单 CollectionType:仅使新行需要 FileType 元素
【发布时间】: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 实体。)

【问题讨论】:

    标签: forms symfony symfony4


    【解决方案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 在这里实际上比切换真/假更有意义,所以我将使用它。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2017-01-15
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多