php - Sonata Admin 中的多个嵌套集合字段
问题描述
我没有使用 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 行
投票管理类:
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()
;
}
我究竟做错了什么?
解决方案
通过在 Poll 类中替换 OneToMany 的 ManyToMany 关系来修复它。因此不再需要 PollHasField\PollHasFieldAdmin 类。
投票管理类:
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 的支持
推荐阅读
- android - AlarmManager 设置未触发广播
- windows - Docker 自动从端口 8000 重定向到 8080 - Docker Bug
- sql - Hive SQL 中的 second()、minute()、hour() 等是否有等效的毫秒数?如果没有,我怎样才能从日期中提取毫秒?
- parallel-processing - 变体调用管道并行化:错误 - “sbatch:未找到提交作业脚本时出错(退出代码 127)”
- android-studio - Ionic Live Reload 无法在 Android 手机上加载应用程序
- azure - 如何将数据从 .net 核心 api 发送到 azure 日志分析
- python - Python如果mysql行不等于输入
- reactjs - 从 MapContainer 外部渲染 Map 子节点
- azure - @azure/identity node.js 无法进行身份验证
- redis - Redis 集群问题