使用DataTransformer

时间:2017-03-03 12:51:03

标签: php forms symfony

我无法设置附加了DataTransformer的表单字段的默认值。

我们以official documentation on DataTransformers

为例
class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('description', TextareaType::class)
        ->add('issue', TextType::class)
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Task::class,
    ));
}

在示例中,ModelTransformer被添加到'问题'字段,在呈现表单时将Issue对象转换为字符串(问题编号),并在表单提交时将其转换回Issue。

现在我通过构建器选项设置问题字段的默认值:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $issue = $options['issue']; //$issue contains an Issue Object from the controller
    $builder
        ->add('description', TextareaType::class)
        ->add('issue', TextType::class, array(
            'data' => $issue
        ))
    ;
}

渲染表单时出现以下错误:

  

表单的视图数据应该是AppBundle / Entity / Issue类的实例,但是是(n)字符串。您可以通过设置" data_class"来避免此错误。 null的选项或添加视图转换器,将(n)字符串转换为AppBundle / Entity / Issue的实例。

  • 转储$ issue返回一个问题对象
  • 按建议将data_class选项设置为null将返回相同的错误
  • 传递$ issue-> getId()而不是$ issue会出现以下错误:"在整数&#34上调用成员函数getId();

我真的不明白这个错误,希望你能帮忙!

1 个答案:

答案 0 :(得分:0)

IssueSelectorTypeTextType的子)期望字符串作为初始值并且内部的数据转换器将其转换为问题实例,因此您需要传递问题ID。

但是,data选项始终不起默认值:

  

表单字段的默认值直接取自底层数据结构。数据选项会覆盖此默认值(Doc.

有关详细信息,请参阅此答案:How to set a default value in a Symfony 2 form field?