错误渲染的Symfony 4编辑形式,其包括文件类型时

问题描述 投票:2回答:1

我按照这个文件https://symfony.com/doc/current/controller/upload_file.html列出的步骤,以允许一个文件被上传。它可以正常使用添加一个新的项目,但是当我尝试编辑我的实体,我发现了以下错误:

表单的视图数据有望成为一流的Symfony \分量\ HttpFoundation的\文件\文件的实例,但它是一个(n)的字符串。您可以通过设置“data_class”选项设置为空或通过添加一个转换(n)的字符串的Symfony \分量\ HttpFoundation的实例\文件\文件视图变压器避免这个错误。

我试着像什么建议文章中追加该文件夹的文件类型,像这样在我的更新方法的实体的路径代码:

public function editAction(Request $request, Advertiser $advertiser)
{

    $advertiser->setLogo(
        new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
    );

    $editForm = $this->createForm(AdvertiserType::class, $advertiser);

    $editForm->handleRequest($request);
    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $this->getDoctrine()->getManager()->flush();
        return $this->redirectToRoute('advertiser_list');
    }
    return $this->render('advertiser/index.html.twig', [
        'form' => $editForm->createView()
    ]);
}

该logo_directory参数正确定义(和工作的罚款创造新的实体)。

请告知,如果你有什么我做错了任何想法,我知道。

谢谢您的帮助。

更新:在这篇文章中The form's view data is expected to be an instance of class ... but is a(n) string有一个建议的解决方案在下面的表单生成代码,包括:

->add('file', FileType::class, array('data_class' => null))

所以,我现在这样做的,编辑表单将显示 - 但它不会与先前的选择prepoulate。

->add('logo', FileType::class, array('data_class' => null), ['label' => 'Logo (JPG or PNG file)'])

这是如何有什么想法可以改变,使形式与之前的选秀节目预先填入?

symfony symfony-forms
1个回答
1
投票

设置一个空data_class将删除警告,但它不会工作,你不需要它在这一点上。

这是由于这样的事实,一旦你的文件被持久化,什么留在你的数据库只是一个路径,而不是文件本身(这是在磁盘上);

如果您想再次编辑这个实体,路径(字符串)必须转化为再次文件实体;这是错误信息说什么。

..这是你做了什么,当你写的:

$advertiser->setLogo(
    new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
);

现在,剩下的问题是,你要预填充文件字段。事实上,这是不可能的,因为文件字段指向一个位置,在自己的电脑,而不是你的服务器上的文件(你不能自动上传从别人的电脑类似的东西,那将是非常危险的)。

你想要做什么可能是预示着文件已经存储,得到它的路径,也许它显示给用户。

因此,在你的嫩枝模板,这样的事情(与你的实际标识目录更改):

{% if form.logo.vars.data %}
  <img src="{{ asset('/uploads/logos_directory/' ~ form.logo.vars.data.filename) }}"/>
{% endif %}

希望这是明确的。

© www.soinside.com 2019 - 2024. All rights reserved.