缺少从FormEvents PRE_SUBMIT到SUBMIT侦听器的数据



我有一个Symfony 4表单,我想操作一个字段的值。

我有更多的监听器附加到它:PRE_SET_DATA, PRE_SUBMIT和SUBMIT(最后一个仅用于验证目的)。

更准确地说,它是一个文件上传器字段在修改表单中,所以如果用户留下空,那么我想使用之前的值was(没有更改)。

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$data = $event->getData();
$event->getForm()->get('picture')->setData($data->getPicture());

在上面的例子中,我已经用存储的值(来自实体)设置了字段的值,这是工作的

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$data = $event->getData();  // array
$entity = $event->getForm()->getData();
if (empty($data['picture']) && !empty($entity)) {
$data['picture'] = $entity->getPicture();
$event->setData($data);
}

转储$event仍然包含数据,到目前为止还可以。

$builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) {
dump($event);
});

但是SUBMIT事件忘记了所有内容,此时我无法添加它。

目标是设置picture字段的值,该值指向SUBMIT而不是消失。

我的假设是,您的数据是通过FileType故意在事件之间删除的。这是因为FileType期望从用户对象类型:

SymfonyComponentHttpFoundationFileUploadedFile

但是可能你只有文件名在您的实体中,而不是此对象中。这就是为什么它被忽略了。

最重要的是,你不能用来自服务器的数据预填充HTML。按规格是不可能的。

解决方案显示空文件上传输入。如果图片存在,在模板中向用户显示它的右边。这样用户就知道图片已经上传了。

在控制器中检查用户是否通过您的文件上传任何内容。只要有文件,就处理。这需要将上传字段设置为mapped=false你们应该自己处理。

最重要的是,您可能应该添加用户删除图像的功能。但这取决于你的商业模式。

最新更新