Sonata Admin sonata_type_collection

时间:2015-02-02 22:20:19

标签: symfony sonata-admin symfony-sonata

我对Sonata管理员表格有疑问......

我想在有位置的专辑中插入音乐......

我的问题是当我创建一个专辑...我可以添加很多,因为我想要AlbumHasMusic ...但是当我提交我的表单时...每个AlbumHasMusic都有一个空专辑,而音乐和位置都可以。

如何将相册ID添加到每个AlbumHasMusic?

这些是我的实体:

Album

/**
 * Album
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\AlbumRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Album
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="titre", type="string", length=255)
     */
    private $titre;

    /**
     * @var UploadedFile
     */
    private $cover;

    /**
     * @var String
     *
     * @ORM\Column(name="filename", type="string", length=255, nullable=true)
     */
    private $covername;

    /**
     *
     * @var Array<AlbumHasMusiques>
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\AlbumHasMusiques", mappedBy="album", cascade={"persist"})
     */
    private $albumHasMusiques;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated", type="time", nullable=true)
     */
    private $updated;
}

AlbumHasMusic

/**
 * AlbumHasMusiques
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\AlbumHasMusiquesRepository")
 */
class AlbumHasMusiques
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Album
     *
     * @ORM\ManyToOne(targetEntity="Album")
     * @ORM\JoinColumn(name="album_id", referencedColumnName="id")
     */
    private $album;

    /**
     * @var Musique
     *
     * @ORM\ManyToOne(targetEntity="Musique")
     * @ORM\JoinColumn(name="musique_id", referencedColumnName="id")
     */
    private $musique;

    /**
     * @var integer
     *
     * @ORM\Column(name="position", type="integer")
     */
    private $position;

}

Music

/**
 * Musique
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\MusiqueRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Musique
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="duree", type="time", nullable=true)
     */
    private $duree;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated", type="time", nullable=true)
     */
    private $updated;

    /**
     * @var string
     */
    private $file;

    /**
     * @var String
     *
     * @ORM\Column(name="filename", type="string", length=255, nullable=true)
     */
    private $filename;

    /**
     * @var string
     *
     * @ORM\Column(name="titre", type="string", length=255, nullable=true)
     */
    private $titre;

    /**
     * @var Genre
     *
     * @ORM\ManyToOne(targetEntity="Genre", inversedBy="musiques")
     * @ORM\JoinColumn(name="genre_id", referencedColumnName="id", nullable=false)
     */
    private $genre;

    /**
     * @ORM\ManyToMany(targetEntity="MotClef", inversedBy="musiques")
     */
    private $motsClef;
}

我想做一些像Galeries和Sonata Media Bundle的媒体。

这是我的AlbumAdmin

class AlbumAdmin extends Admin
{
    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('titre')
            ->add('covername')
            ->add('updated')
            ->add('albumHasMusiques', 'sonata_type_collection', array(
                'cascade_validation' => true,
                'by_reference'       => false,
            ), array(
                    'edit'              => 'inline',
                    'inline'            => 'table',
                    'sortable'          => 'position',
                    'link_parameters'   => array('context' => 'default'),
                    'admin_code'        => 'app.admin.album_has_musiques',
                )
            )
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function prePersist($album)
    {
        $album->setAlbumHasMusiques($album->getAlbumHasMusiques());
    }

    /**
     * {@inheritdoc}
     */
    public function preUpdate($album)
    {
        $album->setAlbumHasMusiques($album->getAlbumHasMusiques());
    }
}

和AlbumHasMusicAdmin:

class AlbumHasMusiquesAdmin extends Admin
{
    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('musique', 'sonata_type_model_list', array('required' => true), array(
                 'link_parameters' => ['context' => 'default'],
            ))
            ->add('position', 'hidden')
        ;
    }
}

你有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为你在相册实体的addAlbumHasMusiques()函数中遗漏了一些东西:确保你是这样编写的:

 public function addAlbumHasMusiques(\AppBundle\Entity\AlbumHasMusiques $albumHasMusiques) {
    $albumHasMusiques->setAlbum($this);  // The important line !!!!  
    $this->albumHasMusiques[] = $albumHasMusiques;

    return $this;
 }