Php &引用;无法反转属性路径“的值”;对于Symfony2表单选项,请选择2上的Type字段
长话短说,在Symfony 2.8中,我有一个Php &引用;无法反转属性路径“的值”;对于Symfony2表单选项,请选择2上的Type字段,php,ajax,forms,symfony,Php,Ajax,Forms,Symfony,长话短说,在Symfony 2.8中,我有一个Movie实体和actors字段,这是实体Actor(manytomy)的ArrayCollection),我希望该字段是ajax加载的Select2。 当我不使用Ajax时,表单是: ->add('actors', EntityType::class, array( 'class' => Actor::class, 'label' => "Actors of the work", '
Movie
实体和actors
字段,这是实体Actor
(manytomy
)的ArrayCollection
),我希望该字段是ajax加载的Select2。
当我不使用Ajax时,表单是:
->add('actors', EntityType::class, array(
'class' => Actor::class,
'label' => "Actors of the work",
'multiple' => true,
'attr' => array(
'class' => "select2-select",
),
))
它是有效的
我试图在其中放置一个空的选择字段:
->add('actors', ChoiceType::class, array(
'mapped' => false,
'multiple' => true,
'attr'=>array(
'class' => "select2-ajax",
'data-entity'=>"actor"
)
))
Select2 Ajax工作正常,DOM中的所有内容看起来都与上一个示例中的相同,但在表单提交时,探查器中出现错误:此值无效。
:
Symfony\Component\Validator\ConstraintViolation
Object(Symfony\Component\Form\Form).children[actors] = [0 => 20, 1 => 21]
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
Unable to reverse value for property path "actors": Could not find all matching choices for the given values
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
Could not find all matching choices for the given values
有趣的是,接收到的数据与作为实体类型时的数据相同:[0=>20,1=>21]
我将字段标记为未映射,甚至将字段名更改为非电影实体的字段名。我尝试添加空的选项
,我尝试将其保留为EntityType
,但使用自定义query\u builder
,返回空集合。现在我没有主意了
我该怎么做
在Raymond的回答后编辑:
我添加了DataTransformer:
将其添加到电影类型buildForm()的末尾。
:
和附加服务:
common.form.type.work:
class: CompanyName\Common\CommonBundle\Form\Type\MovieType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type }
没有什么变化。在表单提交时,reverseTransform()
获取正确的数据,但探查器显示相同的错误。现在这对我来说是一个很大的疑问…您需要添加一个DTO(数据转换器)来转换从表单接收到的值并返回相应的对象。
由于您从Ajax调用该值,它不再将其识别为对象,而是文本值
示例:
正确的方法不是数据转换器,而是表单事件,请看这里: 在本例中,您有野外运动(一个实体,如
电影
)和野外位置(另一个实体,如演员
)。
诀窍是使用ajax完全重新加载表单并使用
PRE\u SET\u DATA
和POST\u SUBMIT
我使用的是Symfony 3.x,但我认为它与2.8.x相同,当您添加数据转换器时,似乎没有任何变化,听起来数据似乎从未经过数据转换器。在调用新的数据转换器之前,转换可能会失败。尝试在代码中添加几行:
$builder->get('actors')->resetViewTransformers();
$builder->get('actors')->resetModelTransformers();
// and then add your own
谢谢你能看看我编辑的问题吗?也许你会发现我遗漏了什么…?你找到解决问题的方法了吗?我现在也遇到了同样的问题Hello@rogaa,我刚刚回复了一个解决方案。我也遇到过同样的情况,但是这个链接帮助了我:它使用表单事件来管理与ajax相关的实体。谢谢你的回复-这个问题已经不存在了。但我知道文件,尤其是这部分。不幸的是,我无法让它运行(即使是symfony示例)。也许你可以为社区建立一个关于gist的工作解决方案?不过,谢谢你,你的回答是我解决问题的出发点。
common.form.type.work:
class: CompanyName\Common\CommonBundle\Form\Type\MovieType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type }
$builder->get('actors')->resetViewTransformers();
$builder->get('actors')->resetModelTransformers();
// and then add your own