Symfony CMF在产品实体上具有多个图像
我目前正在尝试使Symfony CMF在产品实体上具有多个图像,symfony,sonata-admin,symfony-cmf,Symfony,Sonata Admin,Symfony Cmf,我目前正在尝试使Symfony CMF和Sonata允许管理员用户通过同一视图面板向产品添加多个图像。我已经设置了我的产品和图像实体,并单独处理它们的ORM关系 产品: class Product extends AbstractEntity { /** * @ORM\OneToMany(targetEntity="Image", mappedBy="product", cascade={"persist"}) */ protected $images;
Symfony CMF
和Sonata
允许管理员用户通过同一视图面板向产品添加多个图像。我已经设置了我的产品
和图像
实体,并单独处理它们的ORM关系
产品:
class Product extends AbstractEntity
{
/**
* @ORM\OneToMany(targetEntity="Image", mappedBy="product", cascade={"persist"})
*/
protected $images;
// ...
图片:
class Image extends AbstractEntity
{
/**
* @ManyToOne(targetEntity="Product", inversedBy="image", cascade={"persist"})
* @JoinColumn(name="product_id", referencedColumnName="id")
**/
private $product;
// ...
与其让用户先添加所有图像,然后再链接到它们,我希望它可以从同一个视图中实现。因此,在我的ProductAdmin
课程中,我添加了以下内容:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('Product')
->add('name', 'text', array('required' => true))
// everything else ...
->add('images', 'sonata_type_collection', array(
'type_options' => array('delete' => false),
), array(
'edit' => 'inline',
'inline' => 'table',
))
->end();
}
目前,这允许我从产品管理页面上传图像。然而,它并没有在产品和形象之间建立联系,我不确定我需要做什么才能让它做到这一点
更新
在阅读了StackOverflow和更广泛的web上的无数文章后,我似乎看到的共同反应是,只有当sonata_type_集合
用于持有关系的实体的管理页面时,才会存储该关系(在我的情况下,就是图像)。我可以理解为什么会这样,但从用户的角度来看,反过来做会更好(因为我希望将图像添加到产品中,而不是先添加图像,然后再添加产品)
我会留下这个问题,以防有人找到解决办法
工作
我已经设法让它工作了。首先,我已将我的关系更改为多对多(以便图像可以在我的系统包含版本时重新用于其他产品),但我不认为这是修复本身,但仍然值得注意
我认为它的工作原理是包含了by_reference
属性:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('Product')
->add('name', 'text', array('required' => true))
// everything else ...
->add('images', 'sonata_type_collection', array(
'by_reference' => false,
'type_options' => array('delete' => false),
), array(
'edit' => 'inline',
'inline' => 'table',
))
->end();
}
所以我的问题是因为我缺少
'by_reference'=>false
:
类似地,如果您使用的集合表单类型的基础集合数据是对象(如Doctrine的ArrayCollection),则如果需要调用加法器和移除器(例如addAuthor()和removeAuthor()),则by_引用必须设置为false
或者在我的例子中addImage()
和removeImage()