Sonata Admin嵌入表单一对多不会持久存在

时间:2013-01-14 22:20:07

标签: forms symfony doctrine-orm sonata-admin

我一直在尝试在Sonata Admin Bundle 2.0,Sonata User Bundle 2.0和Symfony 2.0.16中实现嵌入表单(是的,我知道它现在有点老了)并在阅读了很多论坛帖子和手册后能够实现它...但只是在表单级别,它不能在编辑模式下显示数据,或者在创建模式下保持数据。

更具特异性,我正在努力使用户实体(来自Sonata用户捆绑包)与电子邮件实体之间的关系,以一对多的关系(一个用户有许多电子邮件,或只有一个) 。因此,在用户表单中将有一个或多个动态嵌入的电子邮件表单,这似乎有效,但与电子邮件表断开连接。

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 个答案:

答案 0 :(得分:1)

您的方法需要从UserEmail实体的“前进”关系,否则管理员不知道要更改和保留的内容。更改User.php中的代码,以便email变量实际知道其关系。这意味着您应该添加类似

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