Sonata Admin中的多个嵌套集合字段

问题描述

我在使用Sonata Admin方面经验很少,我需要帮助。

有4个实体:投票,字段(问题),PollHasField,选项(答案)。 我需要制作一个PollAdmin页面,可以在其中创建字段和选项。

enter image description here

现在,我设法创建一个FieldAdmin页面,您可以在其中创建选项,并创建一个PollAdmin页面,您可以在其中添加现有字段。 但是当我尝试通过在PollHasFieldAdmin中设置'sonata_type_collection'类型来将FieldAdmin与PollHasFieldAdmin绑定时,我得到了错误

request.CRITICAL:未捕获的PHP异常 Symfony \ Component \ Form \ Exception \ UnexpectedTypeException:“预期的 类型为“数组或\​​ Traversable”的参数, 给出“代理_ CG _ \ SIP \ ResourceBundle \ Entity \ Poll \ Field” C:\ wamp64 \ www \ butler.backend \ vendor \ sonata-project \ core-bundle \ Form \ EventListener \ Resizeformlistener.PHP 第96

PollAdmin 类:

protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('General')
                ->add('title',null,array('label' => 'sip.customer.title'))
                ->add('active',array('label' => 'is active'))
                ->add('howOftenToShow',array('label' => 'Frequency'))

                ->add('fields','sonata_type_collection',array(
                        'label'              => 'Fields','cascade_validation' => true,'by_reference'       => false,'required'           => false,'attr'               => array(
                            'class' => 'form-control'
                        )
                    ),array(
                        'edit'         => 'inline','inline'       => 'table','sortable'     => 'position','admin_code'   => 'sip.content.pollhasfield.admin',)
                )
            ->end()

        ;
    }

PollHasFieldAdmin 类:

protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('General')
             ->add('field',array(
                    'label'              => 'Options','attr'               => array(
                        'class' => 'form-control'
                    )
                ),array(
                    'edit'         => 'inline','admin_code'   => 'sip.content.field.admin',)
            )
            ->add('position','hidden',array(
                    'label' => 'sip_position',)
            )
            ->end();
    }

FieldAdmin

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->with('General')
        ->add('title',array('label' => 'sip.customer.title'))
        ->add('type','choice',array('label' => 'Type','choices' => Field::getTypes()))

        ->add('options',array(
                'label'              => 'Options','attr'               => array(
                    'class' => 'form-control'
                )
            ),array(
                'edit'         => 'inline','admin_code'   => 'sip.content.option.admin',)
        )
        ->end()
    ;
}

OptionAdmin 类:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->with('General')
            ->add('title',array('label' => 'sip.customer.title'))
            ->add('position',array('label' => 'sip_position'))
        ->end()
    ; 
}

我在做什么错了?

解决方法

在投票类中用OneToMany的替换ManyToMany关系修复了该问题。因此,不再需要PollHasField \ PollHasFieldAdmin类。

PollAdmin 类:

protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('General')
                ->add('title',null,array('label' => 'sip.customer.title'))
                ->add('active',array('label' => 'Active'))
                ->add('howOftenToShow',array('label' => 'Frequency'))

                ->add('fields','sonata_type_collection',array(
                        'label'              => 'Fields','cascade_validation' => true,'by_reference'       => false,'required'           => false,'attr'               => array(
                            'class' => 'form-control'
                        )
                    ),array(
                        'edit'         => 'inline','inline'       => 'table','admin_code'   => 'sip.content.field.admin',)
                )
            ->end()
        ;
    }

另外,因为项目使用SonataAdminBundle 2.4,所以我不得不在此拉取请求https://github.com/sonata-project/SonataAdminBundle/pull/3553的Sonata \ AdminBundle \ Admin \ AdminHelper类中添加对嵌套(> 2级)sonata_type_collection的支持。