Formulário de incorporação Symfony2 em várias entidades

Eu tenho 3 entidades de usuário

class User extends BaseUser { /** * @ORM\OneToMany(targetEntity="UserPathologie", mappedBy="user") */ protected $userPathologies; } 

Patologia

 class Pathologie { /** * @var string * * @ORM\Column(name="nom", type="string", length=255) */ private $nom; /** * @ORM\OneToMany(targetEntity="UserPathologie", mappedBy="pathologie") */ protected $userPathologies; } 

UserPathologie

 class UserPathologie { /** * @ORM\ManyToOne(targetEntity="User", inversedBy="userPathologies") */ protected $user; /** * @ORM\ManyToOne(targetEntity="Pathologie", inversedBy="userPathologies") */ protected $pathologie; /** * @var boolean * * @ORM\Column(name="atteint", type="boolean") */ private $atteint; /** * @var string * * @ORM\Column(name="cause", type="text") */ private $cause; } 

Então, no formulário de usuário, eu quero ter a lista de todas as “patologias” com a checkbox de verificação “atteint” e “tarefa” de texto.

ex:

–abelabel – Patologias – / etiqueta–

Pathologie A: Sim / Não – causa de assunto de texto

Pathologie B: Sim / Não – Textarea causar

Pathologie C: Sim / Não – causa de texto

Pathologia D: Sim / Não – causa de razão de texto

Pathologie E: Sim / Não – Textarea causar

Eu procede como abaixo, mas o inconveniente é que cada linha deve ser adicionada dinamicamente com javascript e as “patologias” estão em um campo selecionado.

em UserRegiterType

 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('userPathologies', 'collection', array( 'type' => new UserPathologieType(), 'label' => false, 'allow_add' => true, )); } 

E no UserPathologieType, eu tenho

 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('pathologie') ->add('atteint', 'checkbox', array( 'label' => false, 'required' => false, )) ->add('cause', 'textarea', array( 'label' => 'Cause', 'required' => false, )); } 

Para evitar patologies em campo selecionado replace o widget para o campo

 {% block pathologie_widget %} {{ value }} {% endblock %} 

Veja http://symfony.com/doc/current/book/forms.html#form-theming para obter detalhes sobre o tema

Ou, dependendo de como você está processando sua coleção, você também pode seguir este caminho: Symfony2 formbuilder – entity readonly field, como etiqueta

Para que todas as patologias sejam conectadas a um novo usuário, basta adicioná-las na __construct do User

 public function __construct() { // get all phatologies foreach ($allPhatologies as UserPathologie) { $this->userPathologies->add(new UserPathologie()); } } 

Foi assim que fiz para que funcionasse

Primeiro adicione cascade={"persist"} à relação OneToMany no Usuário para persistir automaticamente as patologias do usuário

 Class User { /** * @ORM\OneToMany(targetEntity="Myapp\UserBundle\Entity\UserPathologie", mappedBy="user", cascade={"persist"}) */ protected $userPathologies; } 

Então, adicione todas as patologias à nova entidade como o @Hpatoio sugeriu

 private function createRegisterForm(User $entity) { $em = $this->getDoctrine()->getManager(); $pathologies = $em->getRepository("MyappUserBundle:Pathologie")->findAll(); //Loop all pathologies foreach($pathologies as $patho) { $up = new UserPathologie(); $up->setPathologie($patho); $up->setUser($entity); $up->setAtteint(false); //Add each pathologie to the User entity $entity->getUserPathologies()->add($up); } $form = $this->createForm(new UserRegisterType(), $entity, array( 'action' => $this->generateUrl('register_user'), 'method' => 'POST', )); return $form; } 

E no modelo de twig, usei novamente um loop para obter o resultado esperado

 {% for up in form.userPathologies%}  

{{ form_widget(up.atteint) }}

{{ form_row(up.cause) }}

{% endfor %}