奏鸣曲管理员 w=10=sh

Sonata Admin sonata_type_collection

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

我想做一些像 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());
    }
}

并且专辑有音乐管理员:

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

你有什么想法吗?

我认为您在专辑实体的 addAlbumHasMusiques() 函数中遗漏了某些内容:确保您是这样写的:

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

    return $this;
 }