报名表与新领域相关

时间:2014-09-14 21:12:35

标签: fosuserbundle symfony-2.3

我正在尝试使用FosUserBundle向我的注册表单添加字段。

将常规字段添加到用户类,例如“name”,“age”,这很容易做到:

class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    // add your custom field
    $builder
        ->add('name')
    ;
}

public function getParent()
{
    return 'fos_user_registration';
}

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

这一切正常,新字段将写入我的数据库表。

但是我如何在Fos Bundle的注册类型中添加一个新的FormType,如: 用户可以拥有与OneToMany相关的地址。

我尝试了以下内容,首先创建地址类并给他一个用户:

   /**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="addresses")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;

然后通过向User类添加地址:

 /**
 * @ORM\OneToMany(targetEntity="Address", mappedBy="user")
 */
protected $addresses;

public function __construct()
{
    parent::__construct();

    // your own logic
    $this->addresses= new ArrayCollection();
}

添加AddressType:

class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('state', 'text')
    ->add('city','text')
    ->add('zipcode', 'text')
    ->add('street', 'text');
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' =>  'Acme\UserBundle\Entity\Address',
    ));
}

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

到RegistrationFormType工作,字段显示在浏览器中:

 public function buildForm(FormBuilderInterface $builder, array $options)
{
    // add your custom field
    $builder
        ->add('name')
        ->add('addresses', new AddressType())
    ;
}

但是当我尝试使用新数据提交表单时,我不知道如何说symfony输入的地址应该与用户相关。 我总是得到错误:

“表单的视图数据应该是Acme \ UserBundle \ Entity \ Address类的实例,但是是Doctrine \ Common \ Collections \ ArrayCollection类的实例。您可以通过设置”data_class“选项来避免此错误null或添加一个视图转换器,将类Doctrine \ Common \ Collections \ ArrayCollection的实例转换为Acme \ UserBundle \ Entity \ Address的实例。“

我在这里做错了什么?

问候。

1 个答案:

答案 0 :(得分:2)

当您提供" data_class"时,您尝试将集合添加为单个字段。你说#34;这里是这个实体的形式",但是由于错误说系统必须管理每个与单个实体相关的表单集合,你需要对它们进行数据转换他可以用简单(或预建)的方式管理(寻找DataTransformers)

或者您可以使用colletion字段类型并将其传递给地址表单类型

- 在评论后编辑 -

不,抱歉我错过了,你需要一个实体表单类型,因为你声明用户有一个地址(许多用户可以映射到同一个地址,即一个家庭),所以&#39 ;不需要集合,尽管你在拥有这个用户方面坚持让用户不必担心,如果你说你的映射模式中的级联持续存在于ManyToOne关系中,Doctrine会存储地址为你(或在匹配的情况下使用现有的)

顺便说一句,我被你的句子弄糊涂了#34;用户可以拥有一个与OneToMany相关的地址。"这种误导性,用户可以拥有一个与ManyToOne关系相关的地址(许多用户可以拥有一个地址),该地址与用户处于一种关系(许多用户拥有该地址)