Sonata Admin Bundle 2.0、Sonata User Bundle 2.0、および Symfony 2.0.16 に埋め込みフォームを実装しようとしてきました (はい、今は古いものだとわかっています)。多くのフォーラムの投稿とマニュアルを読んだ後、できるようになりました。それを実装するには...しかし、フォームレベルだけでは、編集モードでデータを表示したり、作成モードでデータを保持したりできません。
より具体的に言えば、(Sonata User Bundle の) User エンティティと Email エンティティの間の関係を、1 対多の関係 (1 人の User が多数の Email を持っているか、1 つだけ) で機能させようとしています。したがって、ユーザー フォームには 1 つ以上の電子メール フォームが動的に埋め込まれ、動作しているように見えますが、電子メール テーブルとは切り離されています。
systemUser はテーブル user を指しています。私は PostgreSQL を使用しており、word は予約済みであるため、変更する必要がありました。
UserAdmin.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;
}
}