我有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 %}