我一直在尝试在 Sonata Admin Bundle 2.0、Sonata User Bundle 2.0 和 Symfony 2.0.16 中实现嵌入表单(是的,我知道它现在有点老了)并且在阅读了很多论坛帖子和手册之后我可以实现它......但只是在表单级别,它不能在编辑模式下显示数据,也不能在创建模式下持久化。
更明确地说,我正在尝试以一对多的关系(一个用户有很多电子邮件,或者只有一个)建立用户实体(来自 Sonata 用户包)与电子邮件实体之间的关系。因此,在用户表单中将动态嵌入一个或多个电子邮件表单,这似乎正在工作,但与电子邮件表断开连接。
systemUser 指向表用户。我必须更改它,因为我使用的是 PostgreSQL 并且 word 是保留的。
用户管理员.php
<?php
class UserAdmin extends Admin
{
// more code
$formMapper
->with('General')
->add('username')
->add('email')
->add('plainPassword', 'text', array('required' => false))
->end()
->with('Groups')
->add('groups', 'sonata_type_model', array('required' => false))
->end()
->with('Profile')
->add('dateOfBirth', 'date', array('required' => false))
->add('firstname', null, array('required' => false))
->add('lastname', null, array('required' => false))
->add('website', 'url', array('required' => false))
->add('locale', null, array('required' => false))
->add('timezone', null, array('required' => false))
->end()
->with('Emails')
->add('emails', 'collection', array(
'label' => 'Emails',
'required' => true,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
),
array(
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'id',
'targetEntity'=> 'MyProject\xBundle\Entity\Email',
'link_parameters' => array('context' => 'user'),
)
)
;
// more code ...
}
用户.php
<?php
class User extends BaseUser
{
/**
* @var array emails
*/
protected $emails;
/**
* @var string user
*/
protected $user;
public function __construct()
{
$this->emails = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add emails
*
* @param MyProject\xBundle\Email $email
*/
public function addEmails(\MyProject\xBundle\Entity\Email $email)
{
$this->emails[] = $email;
}
/**
* Get emails
*
* @return Doctrine\Common\Collections\Collection
*/
public function getEmails()
{
return $this->emails;
}
/**
* Set emails
*
* @param $emails
* @return Email
*/
public function setEmails($emails)
{
$this->$emails = $emails;
foreach ($emails as $email) {
$email->setUser($this);
}
}
/**
*
* @param string $user
*/
public function setUser($user)
{
$this->user = $user;
}
}
电子邮件.php
<?php
class Email
{
/**
* @var SystemUser
*
* @ORM\ManyToOne(targetEntity="User", cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="system_user_id", referencedColumnName="id")
* })
*
*/
private $systemUser;
public function __construct()
{
$this->systemUser = new ArrayCollection();
}
/**
*
* @param MyProject\xBundle\Entity\User $systemUser
*/
public function setSystemUser(\MyProject\xBundle\Entity\User $systemUsers = null)
{
$this->systemUser = $systemUser;
return $this;
}
/**
* Get systemUser
*
* @return MyProject\xBundle\Entity\User
*/
public function getSystemUser()
{
return $this->systemUser;
}
}