Symfony CMF在产品实体上有多个图像

时间:2015-09-01 13:35:50

标签: symfony sonata-admin symfony-cmf

我目前正在努力让Symfony CMFSonata允许管理员用户通过同一个视图面板向产品添加多个图片。我已经设置了ProductImage个实体,并且单独使用了他们的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();
}

1 个答案:

答案 0 :(得分:0)

所以我的问题是因为我遗失了'by_reference' => falsehttp://symfony.com/doc/current/reference/forms/types/collection.html#by-reference

  

类似地,如果您使用的是基础集合数据是对象的集合表单类型(如使用Doctrine的ArrayCollection),那么如果您需要加法器和移除器,则必须将by_reference设置为false(例如addAuthor()和removeAuthor ())被召唤。

或者就我而言addImage()removeImage()