【问题标题】:Multiple nested collection fields in Sonata AdminSonata Admin 中的多个嵌套集合字段
【发布时间】:2021-01-09 05:56:59
【问题描述】:

我没有使用 Sonata Admin 的经验,我需要帮助。

有 4 个实体:Poll、Field(问题)、PollHasField、Option(答案)。 我需要创建一个 PollAdmin 页面,以便为它们创建字段和选项。

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

request.CRITICAL:未捕获的 PHP 异常 Symfony\Component\Form\Exception\UnexpectedTypeException:“预期 “数组或\​​Traversable”类型的参数, “Proxies_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', null, array('label' => 'is active'))
                ->add('howOftenToShow', null, 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', 'sonata_type_collection', array(
                    'label'              => 'Options',
                    'cascade_validation' => true,
                    'by_reference'       => false,
                    'required'           => false,
                    'attr'               => array(
                        'class' => 'form-control'
                    )
                ), array(
                    'edit'         => 'inline',
                    'inline'       => 'table',
                    'sortable'     => 'position',
                    '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', null, array('label' => 'sip.customer.title'))
        ->add('type', 'choice', array('label' => 'Type', 'choices' => Field::getTypes()))

        ->add('options', 'sonata_type_collection', array(
                'label'              => 'Options',
                'cascade_validation' => true,
                'by_reference'       => false,
                'required'           => false,
                'attr'               => array(
                    'class' => 'form-control'
                )
            ), array(
                'edit'         => 'inline',
                'inline'       => 'table',
                'sortable'     => 'position',
                'admin_code'   => 'sip.content.option.admin',
            )
        )
        ->end()
    ;
}

OptionAdmin 类:

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

我做错了什么?

【问题讨论】:

    标签: php symfony sonata-admin symfony-sonata


    【解决方案1】:

    通过替换 Poll 类中 OneToMany 的 ManyToMany 关系来修复它。所以不再需要 PollHasField\PollHasFieldAdmin 类。

    PollAdmin 类:

    protected function configureFormFields(FormMapper $formMapper)
        {
            $formMapper
                ->with('General')
                    ->add('title', null, array('label' => 'sip.customer.title'))
                    ->add('active', null, array('label' => 'Active'))
                    ->add('howOftenToShow', null, 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 的支持@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-29
      • 2014-12-31
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2018-07-20
      相关资源
      最近更新 更多