我有一个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你们应该自己处理。
最重要的是,您可能应该添加用户删除图像的功能。但这取决于你的商业模式。