Sonata Admin 中的多个嵌套集合字段
Posted
技术标签:
【中文标题】Sonata Admin 中的多个嵌套集合字段【英文标题】:Multiple nested collection fields in Sonata 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()
;
我做错了什么?
【问题讨论】:
【参考方案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 的支持@
【讨论】:
以上是关于Sonata Admin 中的多个嵌套集合字段的主要内容,如果未能解决你的问题,请参考以下文章
Sonata Admin Bundle:如何将表单中的“删除”按钮添加到嵌套实体列表中的实体?