我试图显示指向下载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。
谢谢!
答案 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用于上传文档,另一个用于显示/下载它们。希望它可以帮助别人。