我对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')
;
}
}
你有什么想法吗?
答案 0 :(得分:1)
我认为你在相册实体的addAlbumHasMusiques()函数中遗漏了一些东西:确保你是这样编写的:
public function addAlbumHasMusiques(\AppBundle\Entity\AlbumHasMusiques $albumHasMusiques) {
$albumHasMusiques->setAlbum($this); // The important line !!!!
$this->albumHasMusiques[] = $albumHasMusiques;
return $this;
}