暂时保存表单数据

时间:2014-10-09 05:49:48

标签: symfony

用户可以过滤数据列表。对于这个用例,我构建了一个表单类型" 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')));

表单字段填写正确,但如果我再次使用发布请求执行过滤器,则会收到以下错误消息

"必须管理传递到选择字段的实体。也许坚持他们在实体经理?"

有谁知道我该怎么办?我希望我能说出我的问题是可以理解的。

1 个答案:

答案 0 :(得分:4)

您可能希望使用' choice'而不是字段类型'实体'并在表单中为选择列表设置querybuilder。

这是因为实体' type字段需要Entity作为值。当您反序列化数据时,即使它是数据库中的实体,EntityManager也不知道这一点(未序列化的对象只是ApplicationUserBundle的一个实例:Role,它可能不在数据库中)所以这是不是"管理"实体。

您还可以添加您找到的"丢失的羊羔"并通过以下方式将其添加回经理:

$filters = unserialize($session->set('userFilter'));
$roles = $filters['roles'];
$entityManager->merge($roles);

这样你告诉EntityManager这个对象已经被持久化了(通过 - > persist),并且EntityManager应该将它视为从数据库中提取的对象 但你需要测试它