Php symfony表单元素选项

Php symfony表单元素选项,php,forms,file-upload,symfony,Php,Forms,File Upload,Symfony,好吧,这有点复杂,所以请容忍我。我会尽量保持它的清晰和简洁 对于简单的crud,我正在使用Symfony2非常好的form builder系统,但是基本的file upload元素不能完全满足我的需要,所以我想通过添加缩略图预览和其他一些细节来扩展它 阅读本文后,我发现我可以创建自己的自定义模板块来渲染文件元素: 这真的很酷,而且似乎工作得很完美。但是,我将文件上载的路径存储在实体中的一个单独属性中,基于此: 所以,我需要一些方法让模板访问路径字段。我创建了一个自定义文件类型类,如下所示:

好吧,这有点复杂,所以请容忍我。我会尽量保持它的清晰和简洁

对于简单的crud,我正在使用Symfony2非常好的form builder系统,但是基本的file upload元素不能完全满足我的需要,所以我想通过添加缩略图预览和其他一些细节来扩展它

阅读本文后,我发现我可以创建自己的自定义模板块来渲染文件元素:

这真的很酷,而且似乎工作得很完美。但是,我将文件上载的路径存储在实体中的一个单独属性中,基于此:

所以,我需要一些方法让模板访问路径字段。我创建了一个自定义文件类型类,如下所示:

<?php

namespace TechPeople\InvoiceBundle\Component\Form\Type;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;

use Symfony\Component\Form\Extension\Core\Type\FileType as SymfonyFileType;

class FileType extends SymfonyFileType {
    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars = array_replace($view->vars, array(
            'type'  => 'file',
            'value' => '',
            'path' => $options['path'],
        ));
    }
}
<?php

namespace TechPeople\InvoiceBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class InvoiceType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        echo 'test';
        $builder
            ->add('month')
            ->add('year')
            ->add('expenses')
            ->add('due')
            ->add('paid')
            ->add('created')
            ->add('expense_amount', 'money')
            ->add('total_amount', 'money')
            ->add('attachment', 'file', array('path'=>$options['data']->getAttachmentPath()))
            ->add('vendor')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'TechPeople\InvoiceBundle\Entity\Invoice'
        ));
    }

    public function getName()
    {
        return 'techpeople_invoicebundle_invoicetype';
    }
}

所以,看起来某个地方有一个允许选项的列表,但我找不到。此外,我不能100%确定InvoiceType中的add()方法是否将选项数组传递给FileType中的buildView()方法。我在跟踪这两件事之间的代码时遇到问题。

首先,创建自定义类后,您应该声明(注册它)将其用作
文件
类型:


是的,每个类型(及其层次结构)都定义了允许的选项:那么,setDefaultOptions实际上设置了允许的选项?我认为这只是为其他地方定义的一组选项设置默认值。我试试看,谢谢。它成功了。没有更多的错误。“谢谢你!不确定getParent()方法的用途。我的意思是,我知道这个类扩展了真正的文件类型(因此是它的子类),但我不确定为什么需要这样一个方法。此外,getName()方法也将返回“file”。看起来有点奇怪,就像你自己的父亲一样。我不知道,我想我只是无知。但是如果你有时间的话,总是很高兴能少一些。我认为getParent主要用于表单类型扩展,所以我不确定是否需要它。getParent用于模板继承。forms API将通过此继承路径搜索用于呈现类型的潜在模板。可能类似于我的类型->收藏->表单。
The option "path" does not exist. Known options are: "attr", "block_name", "by_reference", "cascade_validation", "compound", "constraints", "csrf_field_name", "csrf_protection", "csrf_provider", "data", "data_class", "disabled", "empty_data", "error_bubbling", "error_mapping", "extra_fields_message", "intention", "invalid_message", "invalid_message_parameters", "label", "label_attr", "mapped", "max_length", "pattern", "post_max_size_message", "property_path", "read_only", "required", "translation_domain", "trim", "validation_constraint", "validation_groups", "virtual"
500 Internal Server Error - InvalidOptionsException