Symfony文件字段在编辑时为空

时间:2017-09-13 23:37:46

标签: php forms symfony

我正在阅读一段时间,但发现没有什么对我有用。 这是实体

/**
 * @ORM\Column(type="string")
 *
 * @Assert\NotBlank(message="Molimo unesite PDF ili Word fajl.")
 * @Assert\File(mimeTypes={ "application/vnd.openxmlformats-officedocument.presentationml.presentation", "application/vnd.ms-powerpoint", "application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"})
 */
private $body;

这是表格

// Problem with empty field on edit persist! Form expect FileType but db sends string!!!
            ->add('body', FileType::class,  [
                //'data_class' => null,// <-- If I change it nothing happened.
                'label' => 'Word ili pdf dokument',
                'invalid_message' =>'Id posta nije validan',
                'attr' => [
                    'class' => 'form-group',
        ]])

一切都非常简单,并按照文档进行。我有一个实体,其中包含少量属性,其中一个属于文件($ body)。文件设置为保存在web / uploads / post /中。当我去编辑页面时,我收到了这个错误:

“表单的视图数据应该是Symfony \ Component \ HttpFoundation \ File \ File类的实例,但是是一个(n)字符串。您可以通过将”data_class“选项设置为null来避免这种情况或者通过添加一个视图转换器,将一个字符串转换为一个Symfony \ Component \ HttpFoundation \ File \ File“的实例。

如果我设置data_status =&gt;空字段为空。

我需要的是一些链接到这个工作的例子,Data Transformer可能吗?

4 个答案:

答案 0 :(得分:2)

好的,解决了。 @ASOlivieri的答案很好,有一个小修改。他的回答中的代码将记住文件名的路径。所以如果你想再次编辑它会抛出未找到的exeption。您必须再次 - &gt; setBody,与原始文件名相同。在flush()

之前设置它
Oreo

希望这有帮助!

答案 1 :(得分:2)

我在编辑操作中遇到了相同的问题,并通过将clearMissing参数设置为false而不是使用$form->handleRequest($request);来手动提交表单来解决该问题,如https://symfony.com/doc/current/form/direct_submit.html所述:

if ($request->isMethod('POST'))
{
    $form->submit($request->request->get($form->getName()),false);

    if ($form->isSubmitted() && $form->isValid())
    {

这样,如果您不提交新文件,则file的原始值将不会设置为null。

答案 2 :(得分:1)

你可以通过在editAction中创建一个新的File()来解决这个问题。像这样:

/**
 * @Route("/edit/{yourEntity}", name="entity_edit")
 * 
 * @return Response
 */
public function editAction(Request $request, YourEntity yourEntity)
{
    $body = new File($this->getParameter('your_files_directory') . '/' . $yourEntity->getBody());
    $yourEntity->setBody($body);
    // rest of your editAction
}

答案 3 :(得分:0)

对我来说,有帮助的是:

if ($request->isMethod('POST')) {
        $form->submit($request->request->get($form->getName()));
        if ($form->isValid()) {...

$form->handleRequest($request);
if ($form->isSubmitted()) {
     if ($form->isValid()) { ...