2
我一直在試圖在索納塔管理捆綁2.0,索納塔用戶捆綁2.0和Symfony 2.0.16(是的,我知道它現在有點老),並閱讀了大量的論壇帖子和手冊後,我可以實現它......但只是在表單層面上,它不能在編輯模式下顯示數據,或者將其保存在創建模式下。索納塔管理嵌入形式一對多不堅持
更具體地說,我試圖使一個User實體(來自Sonata User Bundle)與一個Email實體之間的關係以一對多的關係(一個用戶有很多電子郵件,或者只有一個)。所以在用戶表單中會有一個或多個電子郵件表單動態嵌入,這似乎是工作,但與電子郵件表斷開連接。
systemUser指向表用戶。我必須改變它,因爲我使用的是PostgreSQL,而且字是保留的。
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 ...
}
user.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;
}
}
Email.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;
}
}
感謝您的答覆。我已經在Symfony論壇中找到類似的案例。 http://forum.symfony-project.org/viewtopic.php?f=23&t=35914 但後來我得到了一些問題,其中一個是我的EmailType類沒有被讀取,所以只顯示一個字段而不是兩個。第二個問題是當我試圖保存表格: '預期的參數的類型「數組」,「字符串」給出的「 我發現地址字段被髮送兩次:第一個字符串,然後爲數組。 – abiyi
無論如何,好像所有這些都是浪費時間,因爲Symfony 2.0沒有正確處理反向關係。該修復在Symfony 2.1的新Form類中正確實現。 https://github.com/symfony/symfony/issues/3539 https://github.com/symfony/symfony/issues/1540 因此,我應該升級框架以完成工作(因爲2.0系列將支持到本月)。 – abiyi
另一件事:'在映射註解中,'mappedBy =「systemUser」'是錯誤的,'mappedBy'目標是一個類屬性,而不是任何數據庫表。使用'systemUser'會導致錯誤。 – abiyi