Symfony2 Встроить форму в несколько сущностей

У меня есть 3 сущности Пользователь

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

Патология

class Pathologie
{
    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255)
     */
    private $nom;

    /**
     * @ORM\OneToMany(targetEntity="UserPathologie", mappedBy="pathologie")
     */ 
    protected $userPathologies;
}

Патология пользователя

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;

}

Затем в форме пользователя я хочу иметь список всех «патологий» с флажком «atteint» и текстовой областью «причина».

ex:

--label-- Патологии --/label--

Патология A : Да/Нет - Причина Textarea

Патология B : Да/Нет - причина в текстовом поле

Патология C : Да/Нет - причина в текстовом поле

Патология D : Да/Нет - Причина Textarea

Патология E : Да/Нет - причина в текстовом поле

Я продолжаю, как показано ниже, но неудобно то, что каждая строка должна добавляться динамически с помощью javascript, а «патологии» находятся в поле выбора.

в UserRegiterType

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

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

А в UserPathologieType у меня есть

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

person Mario Radomanana    schedule 01.10.2014    source источник


Ответы (2)


Чтобы избежать patologies в поле выбора, переопределите виджет для поля

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

См. http://symfony.com/doc/current/book/forms.html#form-theming для получения подробной информации о темах.

Или, в зависимости от того, как вы визуализируете свою коллекцию, вы также можете использовать этот способ: ">Конструктор форм Symfony2 - поле объекта только для чтения в виде метки

Чтобы все патологии были связаны с новым пользователем, просто добавьте их в __construct из User

public function __construct() {

   // get all phatologies

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

}
person Hpatoio    schedule 01.10.2014
comment
Спасибо! Оно работает! Но вместо того, чтобы положить его в конструктор, я положил его в контроллер, чтобы получить все патологии - person Mario Radomanana; 02.10.2014

Вот как я сделал, чтобы заставить его работать

Сначала добавьте cascade={"persist"} к отношению OneToMany в User для автоматического сохранения пользовательских патологий.

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

Затем добавьте все патологии в новую сущность, как предложил @Hpatoio.

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

И в шаблоне twig я снова использовал цикл, чтобы получить ожидаемый результат

{% 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 %}
person Mario Radomanana    schedule 03.10.2014