0

I have 3 entities User

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

Pathologie

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;

}

Then, on the User form, I want to have the list of all "Pathologies" with the checkbox "atteint" and textarea "cause".

ex:

--label-- Pathologies --/label--

Pathologie A : Yes/No - Textarea cause

Pathologie B : Yes/No - Textarea cause

Pathologie C : Yes/No - Textarea cause

Pathologie D : Yes/No - Textarea cause

Pathologie E : Yes/No - Textarea cause

I proceed like below but the inconvenient is that each line should be added dynamically with javascript and the "pathologies" are in a select field.

in UserRegiterType

public function buildForm(FormBuilderInterface $builder, array $options)
{   

    $builder
        ->add('userPathologies', 'collection', array(
            'type' => new UserPathologieType(), 
            'label' => false, 
            'allow_add' => true,
        ));
}

And in UserPathologieType, I have

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, 
        ));
}

2 Answers 2

2

To avoid patologies in select field override the widget for the field

{% block pathologie_widget %}
    <b>{{ value }}</b>
{% endblock %}

See http://symfony.com/doc/current/book/forms.html#form-theming for details about for theming

Or depending on how you are rendering your collection you can also take this way: Symfony2 formbuilder - entity readonly field as label

To have all pathologies connected to a new user just add them in the __construct of User

public function __construct() {

   // get all phatologies

   foreach ($allPhatologies as UserPathologie) {
       $this->userPathologies->add(new UserPathologie());
   }

}
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you! It works! But instead of putting it in the constructor, I put it in the controller in order to get all pathologies
0

This is how I did to get it work

First add cascade={"persist"} to the OneToMany relation in User to persist automatically the user pathologies

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

Then, add all pathologies to the new entity as @Hpatoio suggested

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

And in the twig template, I used again a loop to get the expected result

{% for up in form.userPathologies%}
    <input type="hidden" name="{{ up.pathologie.vars.full_name }}" id="{{ up.pathologie.vars.id }}" value="{{ up.pathologie.vars.value }}" />
    <p class="line"><label>{{ up.vars.value.pathologie }}</label>{{ form_widget(up.atteint) }}</p>
    <p class="line">{{ form_row(up.cause) }}</p>
{% endfor %}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.