我有一系列图像,希望能够以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元素,而仅在新行中需要。
问题:如何使文件类型对于现有图像不是必需的,而对于所有新行都是必需的?
(注意,我将普通数组传递给这些表单对象,而不是教义实体。)
答案 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,
))
;
});
}