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,
))
;
);
【讨论】:
是的,这是正确的答案!true
和 false
需要切换。谢谢! :D
写完答案后,我重新阅读了您的问题,以确保答案正确并切换了真假,但没有更新 if 子句,对不起:-) 它应该是:null !== $图像。这样更好吗?
没问题,null !== $image 在这里实际上比切换真/假更有意义,所以我将使用它。谢谢! :)以上是关于Symfony 4 表单 CollectionType:仅使新行需要 FileType 元素的主要内容,如果未能解决你的问题,请参考以下文章
CSRF 令牌无效。请尝试重新提交表单。 Symfony 4
Symfony 4 - 如何在不构建表单的情况下添加 csrf 令牌?
在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段
Symfony 4.4:为图像文件上传保留的实体/模型属性由表单系统设置更新(结果始终为空 - 没有错误)