Symfony2在多个实体上嵌入表单



我有3个实体用户

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

病理学

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

用户病理学

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

然后,在用户表单上,我想要所有"病理学"的列表,复选框为"atteint",文本区域为"cause"。

例如:

--label--病理学--/label--

病理学A:是/否-文本区域导致

病理学B:是/否-文本区域导致

病理学C:是/否-文本区域导致

病理学D:是/否-文本区域导致

病理学E:是/否-文本区域导致

我按照下面的方式进行,但不方便的是,每一行都应该用javascript动态添加,并且"病理学"在一个选择字段中。

在UserRegisterType中

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

为了避免选择字段中的patologies,覆盖字段的窗口小部件

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

请参阅http://symfony.com/doc/current/book/forms.html#form-主题化有关主题化的详细信息

或者,根据渲染集合的方式,也可以采用以下方式:Symfony2表单生成器-实体只读字段作为标签

要将所有病理连接到新用户,只需将它们添加到User__construct中即可

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

这就是我让工作的方法

首先将cascade={"persist"}添加到用户中的OneToMany关系中,以自动保持用户病理

Class User
{
    /**
     * @ORMOneToMany(targetEntity="MyappUserBundleEntityUserPathologie", mappedBy="user", cascade={"persist"})
     */ 
    protected $userPathologies;
}

然后,按照@Hpatioo建议的,将所有病理学添加到新实体中

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

在树枝模板中,我再次使用了一个循环来获得预期的结果

{% 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 %}

相关内容

  • 没有找到相关文章

最新更新