2

我一直在尝试在 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;
   }

}

4

1 回答 1

1

您的方法需要从UserEmail实体的“正向”关系,否则管理员不知道要更改和坚持什么。更改您的代码,User.php以便email变量真正了解其关系。这意味着您应该添加类似

/**
 * @var array emails
 * @ORM\OneToMany(targetEntity="Email", mappedBy="systemUser", cascade={"all"})
 */
protected $emails;
于 2013-01-19T14:14:16.480 回答