问题描述
我在使用Sonata Admin方面经验很少,我需要帮助。
有4个实体:投票,字段(问题),PollHasField,选项(答案)。 我需要制作一个PollAdmin页面,可以在其中创建字段和选项。
现在,我设法创建一个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的支持。