2

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;
   }

}

4

1 に答える 1

1

Userあなたのアプローチには、からエンティティへの「転送」関係が必要ですEmail。そうでない場合、管理者は何を変更して永続化するかを知りません。変数が実際にその関係を認識User.phpできるように、コードを変更します。emailつまり、次のようなものを追加する必要があります

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