表单的视图数据应该是类File的实例,但是是(n)字符串

时间:2017-01-30 11:05:00

标签: php symfony

我试图显示指向下载Symfony 中现有文件的链接,但我有标题中的错误。

我有一个上传她的文件的托儿所,之后我想要展示它们。我已经完成了文档的这一部分:http://symfony.com/doc/current/form/create_form_type_extension.html。但它对我不起作用......

所以,这是我的扩展,我们在表单中添加了两个选项:

<?php

namespace VS\CrmBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\PropertyAccess\PropertyAccess;

class DocumentTypeExtension extends AbstractTypeExtension
{

    /**
     * Returns the name of the type being extended.
     *
     * @return string The name of the type being extended
     */
    public function getExtendedType()
    {
        return FileType::class;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefined(array('doc_path', 'doc_name'));
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if(isset($options['doc_path']))
        {
            $parentData = $form->getParent()->getData();

            $documentUrl = null;
            if(null !== $parentData)
            {
                $accessor = PropertyAccess::createPropertyAccessor();
                $documentUrl = $accessor->getValue($parentData, $options['doc_path']);
            }

            $view->vars['doc_path']-> $documentUrl;
        }

        if(isset($options['doc_name']))
        {
            $parentData = $form->getParent()->getData();

            $documentName = null;
            if(null !== $parentData)
            {
                $accessor = PropertyAccess::createPropertyAccessor();
                $documentName = $accessor->getValue($parentData, $options['doc_name']);
            }

            $view->vars['doc_name']-> $documentName;
        }
    }
}

服务定义:

vs_crm.document_type_extension:
        class: VS\CrmBundle\Form\Extension\DocumentTypeExtension
        tags:
          - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FileType }

查看扩展程序:

{% extends 'form_div_layout.html.twig' %}

{% block file_widget %}
    {% spaceless %}
        {% if (doc_path is not null) and (doc_name is not null) %}
            <a href="{{ asset(doc_path) }}">{{ doc_name }}</a>
        {% endif %}
    {% endspaceless %}
{% endblock %}

我的表格:

<?php

namespace VS\CrmBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class NurseryDocumentsType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('docUrl', FileType::class, array(
                'label' => 'Choose a PDF file',
                'doc_path' => 'nurseryDocumentsPath',
                'doc_name' => 'docUrl'
            ))
            ->add('isMandatory')
            ->add('docType');
    }

我尝试过几种方式调用form_widget但不成功......

我从文档中真正理解的是:ok,buildForm中的doc_name将采用我的doc_url(whitch是保存在db中的文件的名称)但是doc_path呢?所以我说这个(不要粗鲁:p):

// NurseryDocuments entity
    /**
     * @return string|null
     */
    public function getNurseryDocumentPath()
    {
        return __DIR__.'/../../../web/static/documents/NurseryDocuments'.$this->docUrl;
    }

小精度: 1)我试图用CraueFormBundle创建的多步骤形式显示这些文档,这样我就无法将参数从控件传递给我的流程。 2)我试图做出如下行动:

public function showNurseryDocumentAction($document)
    {
        $path = $this->get('kernel')->getRootDir().'/../web/static/documents/NurseryDocuments/';
        $content = file_get_contents($path.$document);

        $response = new Response();

        $response->headers->set('Content-Type', 'mime/type');
        $response->headers->set('Content-Disposition', 'attachment;filename="'.$document);
        $response->setContent($content);

        return $response;
    }

这适用于另一种情况但在这里我有错误......

完成错误:

  

表单的视图数据应该是类的实例   Symfony \ Component \ HttpFoundation \ File \ File,但是是一个(n)字符串。您   通过设置&#34; data_class&#34;可以避免此错误null或by的选项   添加一个视图转换器,将(n)字符串转换为实例   Symfony \ Component \ HttpFoundation \ File \ File。

谢谢!

2 个答案:

答案 0 :(得分:3)

请在'data_class' => null中添加docUrl FormType之后尝试。

<强> NurseryDocumentsType.php

->add('docUrl', FileType::class, array(
    'label' => 'Choose a PDF file',
    'doc_path' => 'nurseryDocumentsPath',
    'doc_name' => 'docUrl',
    'data_class' => null
))

答案 1 :(得分:0)

好的,我做了另一个表格,如:

<?php

namespace VS\CrmBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class NurseryDocumentsShowType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('docUrl', TextType::class);
    }

    public function getParent()
    {
        return NurseryDocumentsType::class;
    }
}

我使用下载方法,因为您可以看到更高的showNurseryDocumentAction($document)。所以我需要一个formType用于上传文档,另一个用于显示/下载它们。希望它可以帮助别人。