Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony CMF在产品实体上具有多个图像_Symfony_Sonata Admin_Symfony Cmf - Fatal编程技术网

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()