用户可以过滤数据列表。对于这个用例,我构建了一个表单类型" UserFilterType",看起来像这样。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('firstName', 'text', array('attr' => array('maxlength' => 255)))
->add('roles', 'entity', array(
'class' => 'ApplicationUserBundle:Role',
'property' => 'name',
'label' => false,
'multiple' => false,
'expanded' => false,
'empty_value' => 'msg.role.all',
'translation_domain' => 'role', 'required' => false)
));
}
到目前为止,一切都运作良好。用户可以过滤输出。但是如果用户想要对输出进行排序,例如通过名字。执行获取请求并丢失过滤器选项。我会临时保存过滤器选项,可能是在会话中。
我尝试以下选项:
$session = $this->getRequest()->getSession();
$session->set('userFilter', serialize($form->getData());
.....
$form->setData(unserialize($session->set('userFilter')));
表单字段填写正确,但如果我再次使用发布请求执行过滤器,则会收到以下错误消息
"必须管理传递到选择字段的实体。也许坚持他们在实体经理?"
有谁知道我该怎么办?我希望我能说出我的问题是可以理解的。
答案 0 :(得分:4)
您可能希望使用' choice'而不是字段类型'实体'并在表单中为选择列表设置querybuilder。
这是因为实体' type字段需要Entity作为值。当您反序列化数据时,即使它是数据库中的实体,EntityManager也不知道这一点(未序列化的对象只是ApplicationUserBundle的一个实例:Role,它可能不在数据库中)所以这是不是"管理"实体。
您还可以添加您找到的"丢失的羊羔"并通过以下方式将其添加回经理:
$filters = unserialize($session->set('userFilter'));
$roles = $filters['roles'];
$entityManager->merge($roles);
这样你告诉EntityManager这个对象已经被持久化了(通过 - > persist),并且EntityManager应该将它视为从数据库中提取的对象 但你需要测试它