2013-01-14 34 views
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; 
    } 

}

回答

1

您的方法需要從UserEmail實體的「向前」關係,否則管理員不知道要更改和保留什麼。在User.php中更改您的代碼,以便email變量實際知道其關係。這意味着你應該添加類似

/** 
* @var array emails 
* @ORM\OneToMany(targetEntity="Email", mappedBy="systemUser", cascade={"all"}) 
*/ 
protected $emails; 
+0

感謝您的答覆。我已經在Symfony論壇中找到類似的案例。 http://forum.symfony-project.org/viewtopic.php?f=23&t=35914 但後來我得到了一些問題,其中一個是我的EmailType類沒有被讀取,所以只顯示一個字段而不是兩個。第二個問題是當我試圖保存表格: '預期的參數的類型「數組」,「字符串」給出的「 我發現地址字段被髮送兩次:第一個字符串,然後爲數組。 – abiyi

+0

無論如何,好像所有這些都是浪費時間,因爲Symfony 2.0沒有正確處理反向關係。該修復在Symfony 2.1的新Form類中正確實現。 https://github.com/symfony/symfony/issues/3539 https://github.com/symfony/symfony/issues/1540 因此,我應該升級框架以完成工作(因爲2.0系列將支持到本月)。 – abiyi

+0

另一件事:'在映射註解中,'mappedBy =「systemUser」'是錯誤的,'mappedBy'目標是一個類屬性,而不是任何數據庫表。使用'systemUser'會導致錯誤。 – abiyi