2014-09-14 2 views
1

Я пытаюсь добавить поля в свою регистрационную форму с помощью FosUserBundle.Регистрация с новыми полями

Добавление нормальных полей в Класс_пользователей как «имя», «возраст» например легко сделать:

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'; 
} 
} 

Это все работает и новые поля записываются в моей таблице базы данных.

Но как добавить новый тип FormType в тип регистрации Fos Bundle, например: Пользователь может иметь адрес, который связан с OneToMany.

Я попробовал его с нижеследующим, сначала создать класс адресов и давая ему одному пользователю:

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="addresses") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
protected $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'; 
} 
} 

для регистрацииFormType работает, и поля отображаются d в браузере:

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

Но когда я пытаюсь отправить форму с новыми данными, я не знаю, как сказать Symfony, что адрес введенный должен быть связан с пользователем. Im всегда получает ошибку:

«Ожидается, что данные вида формы будут экземпляром класса Acme \ UserBundle \ Entity \ Address, но являются экземпляром класса Doctrine \ Common \ Collections \ ArrayCollection. Вы можете избежать этого ошибка, установив опцию «data_class» в значение null или добавив трансформатор вида, который преобразует экземпляр класса Doctrine \ Common \ Collections \ ArrayCollection в экземпляр Acme \ UserBundle \ Entity \ Address. "

Что я здесь делаю неправильно?

С уважением.

ответ

2

Вы пытаетесь добавить коллекцию в виде одного поля, когда вы даете «data_class», который вы говорите «здесь это форма для этого объекта», но по мере того, как ошибка говорит, что система должна управлять набор форм, каждый из которых связан с одним объектом, вам необходимо преобразовать их в то, что он может управлять простым (или готовым) способом (искать DataTransformers)

или вы можете использовать тип поля colletion и передать их форма тип адреса

- отредактирован после комментария -

нет, жаль, что я пропустил, что, вам нужен тип формы сущности, потому что вы заявляете, что у пользователя есть один адрес (и многие пользователи могут быть сопоставлены с одним и тем же адресом, т. е. с семьей), поэтому нет необходимости в коллекции, хотя вы находитесь на стороне владельца, сохраняя пользователь, вам не нужно беспокоиться, если вы скажете, что каскад сохраняется в вашей схеме сопоставления для отношения ManyToOne, Doctrine будет хранить адрес для вас (или использовать существующий в случае подходящего)

btw i was озадаченный вашим предложением «Пользователь может иметь адрес, который связан с OneToMany.«это вводит в заблуждение, пользователь может иметь адрес, который связан с отношением ManyToOne (у многих пользователей может быть адрес), адрес находится в отношении oneToMany с пользователями (адрес принадлежит многим пользователям)

+0

Хорошо, так что даже если я просто добавляю один адрес во время регистрации пользователю, так как есть отношение OneToMany, мне нужно использовать тип поля коллекции? И если im использует тип коллекции, тогда адрес будет автоматически сопоставлен с пользователем, поэтому в mysql будет запись в «адресе», относящемся к новому пользователю? С уважением –

+0

Я думал, что один пользователь может иметь много адресов и один адрес может быть сопоставлен одному пользователю. (OneToMany) Но то, что вы говорите, также звучит right .. (ManyToOne), так будет ли это отношение ManyToMany? Я посмотрю на тип Entity, спасибо большое! –

+0

Или это будет даже отношение OneToOne, когда я просто позволю пользователю ввести один адрес во время процесса регистрации и «необязательный» адрес? i Я бы сказал, что User (1) - Address (*) является правильным способом. –

Смежные вопросы