我目前正在努力让Symfony CMF
和Sonata
允许管理员用户通过同一个视图面板向产品添加多个图片。我已经设置了Product
和Image
个实体,并且单独使用了他们的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和更广泛的网络上阅读了无数文章后,我似乎看到的常见反应是,只有当sonata_type_collection
用于保存关系的实体的Admin页面时才存储关系(在我的情况就是图像)。我可以理解为什么会这样,但从用户的角度来看,也可以更好地工作(因为我希望将图像添加到产品中,而不是添加图像,然后向他们添加产品) )。
如果有人/确实找到了解决方法,我会保留这个问题。
WORKING
我设法让它运转起来。首先,我已将我的关系更改为多对多(因此我的系统包含版本可以将图像重新用于其他产品),但我不认为这是修复本身,但值得注意的是。
我认为它的工作原理是包含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();
}
答案 0 :(得分:0)
所以我的问题是因为我遗失了'by_reference' => false
:http://symfony.com/doc/current/reference/forms/types/collection.html#by-reference
类似地,如果您使用的是基础集合数据是对象的集合表单类型(如使用Doctrine的ArrayCollection),那么如果您需要加法器和移除器,则必须将by_reference设置为false(例如addAuthor()和removeAuthor ())被召唤。
或者就我而言addImage()
和removeImage()
。